Beispiel #1
0
Datei: main.c Projekt: jeez/qmsi
int main(void)
{
	qm_flash_config_t cfg;
	uint32_t wr_flash_addr, app_end, page_num, flash_base, flash_num;

#if (QUARK_D2000)
	flash_base = QM_FLASH_REGION_SYS_0_BASE;
	flash_num = QM_FLASH_0;
#elif(QUARK_SE)
	flash_base = QM_FLASH_REGION_SYS_1_BASE;
	flash_num = QM_FLASH_1;
#endif

	QM_PUTS("Starting: Flash");
	app_end = (uint32_t)__data_lma + (uint32_t)__data_size;

	/* Check there is at least one free flash page after the app code. */
	if ((app_end + QM_FLASH_PAGE_SIZE_BYTES) > FLASH_END) {
		QM_PUTS("Error: No free pages. Quitting.");
		return 1;
	}

	/*
	 * Calculate flash page number, and an MMIO address representing a
	 * location inside the page.
	 */
	page_num = ((app_end - flash_base) / QM_FLASH_PAGE_SIZE_BYTES) + 1;
	wr_flash_addr = (QM_FLASH_PAGE_SIZE_BYTES * page_num) + WR_PAGE_OFFSET;

	cfg.us_count = US_COUNT;
	cfg.wait_states = WAIT_STATES;
	cfg.write_disable = QM_FLASH_WRITE_ENABLE;

	qm_flash_set_config(flash_num, &cfg);

	/* Requires a 2KB buffer to store flash page. */
	qm_flash_page_update(flash_num, QM_FLASH_REGION_SYS, wr_flash_addr,
			     flash_page_buffer, flash_data, NUM_DATA_WORDS);

	qm_flash_page_erase(flash_num, QM_FLASH_REGION_SYS, page_num);

	qm_flash_page_write(flash_num, QM_FLASH_REGION_SYS, page_num,
			    flash_data, NUM_DATA_WORDS);

	QM_PUTS("Finished: Flash");

	return 0;
}
Beispiel #2
0
/**
 * Sanitize application flash partitions.
 *
 * Check and fix inconsistent partitions. Fixing consists in erasing the first
 * page of the partition to ensure that it will not be booted.
 *
 * @return Whether or not a writeback of bl-data is needed.
 * @retval false Writeback not needed (no partition has been fixed and bl-data
 * 		 has not been updated).
 * @retval true  Writeback needed (at least one partition has been fixed and
 *		  therefore bl-data has been updated).
 */
static bool bl_data_sanitize_partitions()
{
    int wb_needed;
    int i;

    wb_needed = false;
    bl_flash_partition_t *part;

    for (i = 0; i < BL_FLASH_PARTITIONS_NUM; i++) {
        part = &bl_data->partitions[i];
        if (part->is_consistent == false) {
            qm_flash_page_erase(part->controller,
                                QM_FLASH_REGION_SYS,
                                part->first_page);
            part->is_consistent = true;
            wb_needed = true;
        }
    }

    return wb_needed;
}