| | |
| | | #include "FreeRTOS.h" |
| | | #include "task.h" |
| | | |
| | | #define FLASH_TIMING_OPTIMIZE_EN 1 |
| | | |
| | | #define SPLIT_NMGR_OP_SPLIT 0 |
| | | |
| | | /** Attempt to boot the contents of slot 0. */ |
| | |
| | | struct flash_area g_code_area; |
| | | struct flash_area g_swap_area; |
| | | |
| | | #if FLASH_TIMING_OPTIMIZE_EN |
| | | uint8_t flash_page[256] = {0}; |
| | | uint32_t flash_page_data_len = 0; |
| | | uint32_t flash_offset = 0; |
| | | struct flash_area *flash_area = NULL; |
| | | #endif |
| | | |
| | | int |
| | | flash_area_is_empty(const struct flash_area *fa, bool *empty) |
| | | { |
| | |
| | | return 0; |
| | | } |
| | | |
| | | #if FLASH_TIMING_OPTIMIZE_EN |
| | | void img_mgmt_post_handler(void) |
| | | { |
| | | if(flash_area && flash_page_data_len) |
| | | { |
| | | taskENTER_CRITICAL(); |
| | | FMC_WriteStream(FLCTL, flash_area->fa_off + flash_offset, flash_page, flash_page_data_len); |
| | | taskEXIT_CRITICAL(); |
| | | |
| | | //printf("[W] write flash data end - addr:0x%08X, offset:0x%04X len = %d\n", flash_area->fa_off , flash_offset, flash_page_data_len); |
| | | } |
| | | |
| | | flash_page_data_len = 0; |
| | | flash_area = NULL; |
| | | } |
| | | #endif |
| | | |
| | | int |
| | | flash_area_write(const struct flash_area *fa, uint32_t off, const void *src, |
| | | uint32_t len) |
| | |
| | | ret = -1; |
| | | return ret; |
| | | } |
| | | |
| | | #if FLASH_TIMING_OPTIMIZE_EN |
| | | uint8_t *p = (uint8_t *)src; |
| | | |
| | | if(flash_area == NULL){ |
| | | flash_offset = off; |
| | | flash_area = (struct flash_area *)fa; |
| | | |
| | | //printf("[E] write flash data - addr:0x%08X, offset:0x%04X len = %d\n", fa->fa_off , flash_offset, len); |
| | | } |
| | | |
| | | #define min(x, y) (x) <(y) ? (x) : (y); |
| | | |
| | | while(len > 0) |
| | | { |
| | | uint32_t fragLen = min(len, 256 - flash_page_data_len); |
| | | |
| | | memcpy(flash_page + flash_page_data_len, p, fragLen); |
| | | flash_page_data_len += fragLen; |
| | | |
| | | if(flash_page_data_len == 256) |
| | | { |
| | | taskENTER_CRITICAL(); |
| | | ret = FMC_WriteStream(FLCTL, fa->fa_off + flash_offset, flash_page, 256); |
| | | taskEXIT_CRITICAL(); |
| | | |
| | | //printf("[W] write flash data - addr:0x%08X, offset:0x%04X len = %d\n", fa->fa_off , flash_offset, 256); |
| | | |
| | | flash_offset += 256; |
| | | flash_page_data_len = 0; |
| | | } |
| | | |
| | | p += fragLen; |
| | | if(len > fragLen){ |
| | | len -= fragLen; |
| | | }else{ |
| | | len = 0; |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | #else |
| | | taskENTER_CRITICAL(); |
| | | ret = FMC_WriteStream(FLCTL, fa->fa_off + off, (void *)src, len); |
| | | taskEXIT_CRITICAL(); |
| | | #endif |
| | | return ret; |
| | | } |
| | | |
| | |
| | | ret = -1; |
| | | return ret; |
| | | } |
| | | |
| | | |
| | | //printf("[W] Erase Flash - start addr: 0x%08X, len: 0x%04x\r\n", fa->fa_off + off, len); |
| | | |
| | | #if FLASH_TIMING_OPTIMIZE_EN |
| | | flash_offset = 0; |
| | | flash_area = NULL; |
| | | flash_page_data_len = 0; |
| | | memset(flash_page, 0xFF, 256); |
| | | #else |
| | | |
| | | taskENTER_CRITICAL(); |
| | | ret = FMC_EraseCodeArea(FLCTL, fa->fa_off + off, len); |
| | | taskEXIT_CRITICAL(); |
| | | #endif |
| | | |
| | | return ret; |
| | | } |
| | | |
| | |
| | | return (slot+1); |
| | | } |
| | | |
| | | |
| | | #define SIZE_BOOTLOADER 0xA000 |
| | | #define SIZE_FIXED_APP_IMAGE 0x37000 |
| | | #define APP_IMAGE_SIZE SIZE_FIXED_APP_IMAGE |
| | | |
| | | void flash_area_init(void) |
| | | { |
| | | g_code_area.fa_device_id = FLASH_AREA_IMAGE_0; |
| | | g_code_area.fa_id = FLASH_AREA_IMAGE_0; |
| | | g_code_area.fa_off = SIZE_BOOTLOADER; |
| | | g_code_area.fa_size = APP_IMAGE_SIZE; |
| | | g_code_area.fa_id = FLASH_AREA_IMAGE_0; |
| | | g_code_area.fa_off = CONFIG_FLASH_PARTITION_APP_ADDR; |
| | | g_code_area.fa_size = CONFIG_FLASH_PARTITION_APP_SIZE; |
| | | |
| | | g_swap_area.fa_device_id = FLASH_AREA_IMAGE_1; |
| | | g_swap_area.fa_id = FLASH_AREA_IMAGE_1; |
| | | g_swap_area.fa_off = (SIZE_BOOTLOADER + SIZE_FIXED_APP_IMAGE); |
| | | g_swap_area.fa_size = APP_IMAGE_SIZE; |
| | | g_swap_area.fa_id = FLASH_AREA_IMAGE_1; |
| | | g_swap_area.fa_off = CONFIG_FLASH_PARTITION_APP_BACKUP_ADDR; |
| | | g_swap_area.fa_size = CONFIG_FLASH_PARTITION_APP_BACKUP_SIZE; |
| | | |
| | | #if FLASH_TIMING_OPTIMIZE_EN |
| | | taskENTER_CRITICAL(); |
| | | FMC_EraseCodeArea(FLCTL, g_swap_area.fa_off, CONFIG_FLASH_PARTITION_APP_SIZE); |
| | | taskEXIT_CRITICAL(); |
| | | #endif |
| | | } |
| | | |
| | | int split_app_active_get(void) |