diff --git a/src/fs/file.c b/src/fs/file.c index d0f304f..4137d6b 100644 --- a/src/fs/file.c +++ b/src/fs/file.c @@ -245,29 +245,40 @@ void initialize_flash(bool hard) { dynamic_files = 0; } -void scan_region(bool persistent) { +extern uintptr_t last_base; +extern uint32_t num_files; +void scan_region(bool persistent) +{ uintptr_t endp = end_data_pool, startp = start_data_pool; if (persistent) { endp = end_rom_pool; startp = start_rom_pool; } + else { + last_base = endp; + num_files = 0; + } for (uintptr_t base = flash_read_uintptr(endp); base >= startp; base = flash_read_uintptr(base)) { if (base == 0x0) { //all is empty break; } uint16_t fid = flash_read_uint16(base + sizeof(uintptr_t) + sizeof(uintptr_t)); - printf("[%x] scan fid %x, len %d\n", (unsigned int) base, fid, - flash_read_uint16(base + sizeof(uintptr_t) + sizeof(uintptr_t) + sizeof(uint16_t))); + printf("[%x] scan fid %x, len %d\n", (unsigned int) base, fid, flash_read_uint16(base + sizeof(uintptr_t) + sizeof(uintptr_t) + sizeof(uint16_t))); file_t *file = (file_t *) search_by_fid(fid, NULL, SPECIFY_EF); if (!file) { file = file_new(fid); } if (file) { - file->data = - (uint8_t *) (base + sizeof(uintptr_t) + sizeof(uintptr_t) + sizeof(uint16_t)); + file->data = (uint8_t *) (base + sizeof(uintptr_t) + sizeof(uintptr_t) + sizeof(uint16_t)); + } + if (!persistent) { + num_files++; } if (flash_read_uintptr(base) == 0x0) { + if (base < last_base) { + last_base = base; + } break; } } diff --git a/src/fs/file.h b/src/fs/file.h index b69ccbc..072786f 100644 --- a/src/fs/file.h +++ b/src/fs/file.h @@ -128,6 +128,12 @@ extern int meta_delete(uint16_t fid); extern int meta_add(uint16_t fid, const uint8_t *data, uint16_t len); extern int delete_file(file_t *ef); +extern uint32_t flash_free_space(); +extern uint32_t flash_used_space(); +extern uint32_t flash_total_space(); +extern uint32_t flash_num_files(); +extern uint32_t flash_size(); + #ifndef ENABLE_EMULATION extern file_t *ef_phy; #endif diff --git a/src/fs/flash.c b/src/fs/flash.c index 96dd091..d1d63cd 100644 --- a/src/fs/flash.c +++ b/src/fs/flash.c @@ -73,12 +73,14 @@ extern uint8_t *flash_read(uintptr_t addr); extern void low_flash_available(); +uintptr_t last_base = end_data_pool; +uint32_t num_files = 0; + uintptr_t allocate_free_addr(uint16_t size, bool persistent) { if (size > FLASH_SECTOR_SIZE) { return 0x0; //ERROR } - size_t real_size = size + sizeof(uint16_t) + sizeof(uintptr_t) + sizeof(uint16_t) + - sizeof(uintptr_t); //len+len size+next address+fid+prev_addr size + size_t real_size = size + sizeof(uint16_t) + sizeof(uintptr_t) + sizeof(uint16_t) + sizeof(uintptr_t); //len+len size+next address+fid+prev_addr size uintptr_t next_base = 0x0, endp = end_data_pool, startp = start_data_pool; if (persistent) { endp = end_rom_pool; @@ -108,14 +110,9 @@ uintptr_t allocate_free_addr(uint16_t size, bool persistent) { return 0x0; } //we check if |base-(next_addr+size_next_addr)| > |base-potential_addr| only if fid != 1xxx (not size blocked) - else if (addr_alg <= potential_addr && - base - - (next_base + - flash_read_uint16(next_base + sizeof(uintptr_t) + sizeof(uintptr_t) + - sizeof(uint16_t)) + - 2 * - sizeof(uint16_t) + 2 * sizeof(uintptr_t)) > base - potential_addr && - (flash_read_uint16(next_base + 2 * sizeof(uintptr_t)) & 0x1000) != 0x1000) { + else if (addr_alg <= potential_addr + && base - (next_base + flash_read_uint16(next_base + sizeof(uintptr_t) + sizeof(uintptr_t) + sizeof(uint16_t)) + 2 * sizeof(uint16_t) + 2 * sizeof(uintptr_t)) > base - potential_addr + && (flash_read_uint16(next_base + 2 * sizeof(uintptr_t)) & 0x1000) != 0x1000) { flash_program_uintptr(potential_addr, next_base); flash_program_uintptr(next_base + sizeof(uintptr_t), potential_addr); flash_program_uintptr(potential_addr + sizeof(uintptr_t), base); @@ -130,8 +127,7 @@ int flash_clear_file(file_t *file) { if (file == NULL || file->data == NULL) { return PICOKEY_OK; } - uintptr_t base_addr = - (uintptr_t)(file->data - sizeof(uintptr_t) - sizeof(uint16_t) - sizeof(uintptr_t)); + uintptr_t base_addr = (uintptr_t)(file->data - sizeof(uintptr_t) - sizeof(uint16_t) - sizeof(uintptr_t)); uintptr_t prev_addr = flash_read_uintptr(base_addr + sizeof(uintptr_t)); uintptr_t next_addr = flash_read_uintptr(base_addr); //printf("nc %lx->%lx %lx->%lx\n",prev_addr,flash_read_uintptr(prev_addr),base_addr,next_addr); @@ -143,12 +139,12 @@ int flash_clear_file(file_t *file) { flash_program_uintptr(base_addr, 0); flash_program_uintptr(base_addr + sizeof(uintptr_t), 0); file->data = NULL; + num_files--; //printf("na %lx->%lx\n",prev_addr,flash_read_uintptr(prev_addr)); return PICOKEY_OK; } -int flash_write_data_to_file_offset(file_t *file, const uint8_t *data, uint16_t len, - uint16_t offset) { +int flash_write_data_to_file_offset(file_t *file, const uint8_t *data, uint16_t len, uint16_t offset) { if (!file) { return PICOKEY_ERR_NULL_PARAM; } @@ -182,6 +178,9 @@ int flash_write_data_to_file_offset(file_t *file, const uint8_t *data, uint16_t if (new_addr == 0x0) { return PICOKEY_ERR_NO_MEMORY; } + if (new_addr < last_base) { + last_base = new_addr; + } file->data = (uint8_t *) new_addr + sizeof(uintptr_t) + sizeof(uint16_t) + sizeof(uintptr_t); //next addr+fid+prev addr flash_program_halfword(new_addr + sizeof(uintptr_t) + sizeof(uintptr_t), file->fid); flash_program_halfword((uintptr_t) file->data, len); @@ -191,8 +190,30 @@ int flash_write_data_to_file_offset(file_t *file, const uint8_t *data, uint16_t if (old_data) { free(old_data); } + num_files++; return PICOKEY_OK; } + int flash_write_data_to_file(file_t *file, const uint8_t *data, uint16_t len) { return flash_write_data_to_file_offset(file, data, len, 0); } + +uint32_t flash_free_space() { + return last_base - start_data_pool; +} + +uint32_t flash_used_space() { + return end_data_pool - last_base; +} + +uint32_t flash_total_space() { + return end_data_pool - start_data_pool; +} + +uint32_t flash_num_files() { + return num_files; +} + +uint32_t flash_size() { + return PICO_FLASH_SIZE_BYTES; +}