Example #1
0
File: main.c Project: 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;
}
Example #2
0
/**
 * Copy the BL-Data struct passed as input to a specific flash page.
 *
 * @param[in] A pointer to the BL-Data to be saved on flash.
 * @patam[in] The flash page where to save the BL-Data.
 */
static void bl_data_copy(const bl_data_t *data, int bl_page)
{
    qm_flash_page_write(BL_DATA_FLASH_CONTROLLER, BL_DATA_FLASH_REGION,
                        bl_page, (uint32_t *)data,
                        sizeof(bl_data_t) / sizeof(uint32_t));
}