/* User information block re-programming * Make sure that data is aligned on 4 bytes boundary, and that size is a multiple of 4. */ static int dtplug_protocol_user_flash_update(struct dtplug_protocol_handle* handle, struct packet* question, void* data, int size) { int ret = 0; /* Erase the user flash information pages */ ret = iap_erase_info_page(0, 2); if (ret != 0) { dtplug_protocol_send_reply(handle, question, ERROR_FLASH_ERASE, 0, NULL); return -1; } ret = iap_copy_ram_to_flash((uint32_t)get_user_info(), (uint32_t)data, size); if (ret != 0) { dtplug_protocol_send_reply(handle, question, ERROR_FLASH_WRITE, 0, NULL); return -1; } return 0; }
void flush_sector() { if (scratch_written_bytes == 0) return; // copy data before written sectors.. memcpy(Scratch, DiskImageF + flash_sector_start_ofs, flash_start_offset_in_sector); // .. and after size_t after_ofs = flash_start_offset_in_sector + scratch_written_bytes; memcpy(Scratch + after_ofs, DiskImageF + flash_sector_start_ofs + after_ofs, FLASH_SECTOR_SIZE - after_ofs); // find absolute flash sector number uint32_t abs_sector = FLASH_SECTOR_BASE + flash_sector_number; // erase it iap_prepare_sector(abs_sector, abs_sector); iap_erase_sector(abs_sector, abs_sector); for (int i = 0, ofs = 0; i < FLASH_SECTOR_SIZE/4096; i++, ofs += 4096) { iap_prepare_sector(abs_sector, abs_sector); iap_copy_ram_to_flash(Scratch + ofs, (uint8_t *)DiskImageF + flash_sector_start_ofs + ofs, 4096); } }