Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
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);
	}
}