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; }
/** * 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)); }