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