diff --git a/src/fs/flash.c b/src/fs/flash.c index d1d63cd..c2ae399 100644 --- a/src/fs/flash.c +++ b/src/fs/flash.c @@ -23,7 +23,7 @@ #define XIP_BASE 0 #define FLASH_SECTOR_SIZE 4096 #ifdef ESP_PLATFORM -#define PICO_FLASH_SIZE_BYTES (1 * 1024 * 1024) +uint32_t PICO_FLASH_SIZE_BYTES = (1 * 1024 * 1024); #else #define PICO_FLASH_SIZE_BYTES (8 * 1024 * 1024) #endif @@ -42,27 +42,12 @@ * | | * ------------------------------------------------------ */ -#ifdef ESP_PLATFORM -#define FLASH_TARGET_OFFSET 0 -#else -#define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES >> 1) // DATA starts at the mid of flash -#endif + #define FLASH_DATA_HEADER_SIZE (sizeof(uintptr_t) + sizeof(uint32_t)) #define FLASH_PERMANENT_REGION (4 * FLASH_SECTOR_SIZE) // 4 sectors (16kb) of permanent memory //To avoid possible future allocations, data region starts at the end of flash and goes upwards to the center region - -#ifdef PICO_RP2350 -// Table partition for RP2350 needs 8kb -const uintptr_t end_flash = (XIP_BASE + PICO_FLASH_SIZE_BYTES - 2 * FLASH_SECTOR_SIZE); -#else -const uintptr_t end_flash = (XIP_BASE + PICO_FLASH_SIZE_BYTES); -#endif - -const uintptr_t end_rom_pool = end_flash - FLASH_DATA_HEADER_SIZE - 4; //This is a fixed value. DO NOT CHANGE -const uintptr_t start_rom_pool = end_rom_pool - FLASH_PERMANENT_REGION; //This is a fixed value. DO NOT CHANGE -const uintptr_t end_data_pool = start_rom_pool - FLASH_DATA_HEADER_SIZE; //This is a fixed value. DO NOT CHANGE -const uintptr_t start_data_pool = (XIP_BASE + FLASH_TARGET_OFFSET); +uintptr_t end_flash, end_rom_pool, start_rom_pool, end_data_pool, start_data_pool; extern int flash_program_block(uintptr_t addr, const uint8_t *data, size_t len); extern int flash_program_halfword(uintptr_t addr, uint16_t data); @@ -73,9 +58,19 @@ extern uint8_t *flash_read(uintptr_t addr); extern void low_flash_available(); -uintptr_t last_base = end_data_pool; +uintptr_t last_base; uint32_t num_files = 0; +void flash_set_bounds(uintptr_t start, uintptr_t end) { + end_flash = end; + end_rom_pool = end_flash - FLASH_DATA_HEADER_SIZE - 4; + start_rom_pool = end_rom_pool - FLASH_PERMANENT_REGION; + end_data_pool = start_rom_pool - FLASH_DATA_HEADER_SIZE; + start_data_pool = start; + + last_base = end_data_pool; +} + uintptr_t allocate_free_addr(uint16_t size, bool persistent) { if (size > FLASH_SECTOR_SIZE) { return 0x0; //ERROR diff --git a/src/fs/low_flash.c b/src/fs/low_flash.c index d62e2b0..7ae4ac1 100644 --- a/src/fs/low_flash.c +++ b/src/fs/low_flash.c @@ -29,6 +29,8 @@ #include "pico/mutex.h" #include "pico/sem.h" #include "pico/multicore.h" + #include "pico/bootrom.h" + #include "boot/picobin.h" #else #ifdef _MSC_VER #include @@ -56,7 +58,11 @@ #endif #endif #define FLASH_SECTOR_SIZE 4096 + #ifdef ESP_PLATFORM + extern uint32_t PICO_FLASH_SIZE_BYTES; + #else #define PICO_FLASH_SIZE_BYTES (8 * 1024 * 1024) + #endif #define XIP_BASE 0 int fd_map = 0; uint8_t *map = NULL; @@ -65,10 +71,11 @@ #define TOTAL_FLASH_PAGES 6 +extern void flash_set_bounds(uintptr_t start, uintptr_t end); + extern const uintptr_t start_data_pool; extern const uintptr_t end_rom_pool; - typedef struct page_flash { uint8_t page[FLASH_SECTOR_SIZE]; uintptr_t address; @@ -126,10 +133,7 @@ void do_flash() { ; } //printf("WRITTING\n"); - flash_range_erase(flash_pages[r].address - XIP_BASE, - flash_pages[r].page_size ? ((int) (flash_pages[r].page_size / - FLASH_SECTOR_SIZE)) * - FLASH_SECTOR_SIZE : FLASH_SECTOR_SIZE); + flash_range_erase(flash_pages[r].address - XIP_BASE, flash_pages[r].page_size ? ((int) (flash_pages[r].page_size / FLASH_SECTOR_SIZE)) * FLASH_SECTOR_SIZE : FLASH_SECTOR_SIZE); while (multicore_lockout_end_timeout_us(1000) == false) { ; } @@ -162,17 +166,48 @@ void low_flash_init() { memset(flash_pages, 0, sizeof(page_flash_t) * TOTAL_FLASH_PAGES); mutex_init(&mtx_flash); sem_init(&sem_flash, 0, 1); + + uint32_t data_start_addr; + uint32_t data_end_addr; #if defined(ENABLE_EMULATION) fd_map = open("memory.flash", O_RDWR | O_CREAT, (mode_t) 0600); lseek(fd_map, PICO_FLASH_SIZE_BYTES - 1, SEEK_SET); write(fd_map, "", 1); map = mmap(0, PICO_FLASH_SIZE_BYTES, PROT_READ | PROT_WRITE, MAP_SHARED, fd_map, 0); -#else -#if defined(ESP_PLATFORM) + data_start_addr = 0; + data_end_addr = PICO_FLASH_SIZE_BYTES; +#elif defined(ESP_PLATFORM) part0 = esp_partition_find_first(0x40, 0x1, "part0"); esp_partition_mmap(part0, 0, part0->size, ESP_PARTITION_MMAP_DATA, (const void **)&map, (esp_partition_mmap_handle_t *)&fd_map); + data_start_addr = 0; + data_end_addr = part0->size; + PICO_FLASH_SIZE_BYTES = part0->size; +#elif defined(PICO_PLATFORM) + __attribute__((aligned(4))) uint8_t workarea[4 * 1024]; + int rc = rom_load_partition_table(workarea, sizeof(workarea), false); + if (rc) { + reset_usb_boot(0, 0); + } + + uint8_t boot_partition = 1; + rc = rom_get_partition_table_info((uint32_t*)workarea, 0x8, PT_INFO_PARTITION_LOCATION_AND_FLAGS | PT_INFO_SINGLE_PARTITION | (boot_partition << 24)); + + if (rc != 3) { + data_start_addr = (PICO_FLASH_SIZE_BYTES >> 1); + data_end_addr = PICO_FLASH_SIZE_BYTES; + } else { + uint16_t first_sector_number = (((uint32_t*)workarea)[1] & PICOBIN_PARTITION_LOCATION_FIRST_SECTOR_BITS) >> PICOBIN_PARTITION_LOCATION_FIRST_SECTOR_LSB; + uint16_t last_sector_number = (((uint32_t*)workarea)[1] & PICOBIN_PARTITION_LOCATION_LAST_SECTOR_BITS) >> PICOBIN_PARTITION_LOCATION_LAST_SECTOR_LSB; + data_start_addr = first_sector_number * FLASH_SECTOR_SIZE; + data_end_addr = (last_sector_number + 1) * FLASH_SECTOR_SIZE; + } +#ifdef PICO_RP2350 // For compatibility with RP2040 + data_end_addr -= 2 * FLASH_SECTOR_SIZE; #endif + data_start_addr += XIP_BASE; + data_end_addr += XIP_BASE; #endif + flash_set_bounds(data_start_addr, data_end_addr); } void low_flash_init_core1() { @@ -205,10 +240,7 @@ page_flash_t *find_free_page(uintptr_t addr) { #ifdef PICO_PLATFORM memcpy(p->page, (uint8_t *) addr_alg, FLASH_SECTOR_SIZE); #else - memcpy(p->page, - (addr >= start_data_pool && - addr <= end_rom_pool + sizeof(uintptr_t)) ? (uint8_t *) (map + addr_alg) : (uint8_t *) addr_alg, - FLASH_SECTOR_SIZE); + memcpy(p->page, (addr >= start_data_pool && addr <= end_rom_pool + sizeof(uintptr_t)) ? (uint8_t *) (map + addr_alg) : (uint8_t *) addr_alg, FLASH_SECTOR_SIZE); #endif ready_pages++; p->address = addr_alg;