static void flash_native_file_open(char *name) { int created = 0; extern char *tmpnam(char *s); extern int ftruncate(int fd, off_t length); if (!name) { name = tmpnam(NULL); } file = open(name, O_RDWR); if (file < 0) { file = open(name, O_RDWR | O_CREAT, 0660); assert(file > 0); created = 1; if (ftruncate(file, native_flash_dev.hf_size) < 0) { assert(0); } } file_loc = mmap(0, native_flash_dev.hf_size, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0); assert(file_loc != MAP_FAILED); if (created) { flash_native_erase(0, native_flash_dev.hf_size); } }
int flash_erase(uint32_t address, uint32_t num_bytes) { const struct flash_area_desc *area; uint32_t end; int i; flash_native_ensure_file_open(); end = address + num_bytes; for (i = 0; i < FLASH_NUM_AREAS; i++) { area = flash_area_descs + i; if (area->fad_offset >= end) { return 0; } if (address >= area->fad_offset && address < area->fad_offset + area->fad_length) { flash_native_erase(area->fad_offset, area->fad_length); } } return 0; }
int flash_erase_sector(uint32_t sector_address) { int next_sector_id; int sector_id; int area_id; flash_native_ensure_file_open(); area_id = find_area(sector_address); if (area_id == -1) { return -1; } sector_id = flash_area_descs[area_id].fad_sector_id; while (1) { flash_native_erase(sector_address, flash_area_descs[area_id].fad_length); area_id++; if (area_id >= FLASH_NUM_AREAS) { break; } next_sector_id = flash_area_descs[area_id].fad_sector_id; if (next_sector_id != sector_id) { break; } sector_id = next_sector_id; } return 0; }
static int native_flash_erase_sector(uint32_t sector_address) { int area_id; uint32_t len; flash_native_ensure_file_open(); area_id = find_area(sector_address); if (area_id == -1) { return -1; } len = flash_sector_len(area_id); flash_native_erase(sector_address, len); return 0; }
static void flash_native_ensure_file_open(void) { int expected_sz; int i; if (file == NULL) { expected_sz = 0; for (i = 0; i < FLASH_NUM_AREAS; i++) { expected_sz += flash_area_descs[i].fad_length; } file = tmpfile(); assert(file != NULL); flash_native_erase(0, expected_sz); } }