void Flash(void) { //Dies ist nur eine Testfunktion die einen Dummycode in den Sektor X schreibt! iap_prepare_sector(15,16); iap_erase_sector(15,16,100000); if(iap_check_blank(15,16)==STATUS_SECTOR_NOT_BLANK) while(1); iap_prepare_sector(15,16); iap_write_flash(0x0000F000,&I2C0_CNTRL.ReceiveBuffer[2],256,100000); }
void main(void) { EVERY_GPIO_SET_FUNCTION(LED_PORT, LED_PIN, PIO, ADMODE_DIGITAL); every_gpio_set_dir(LED_PORT, LED_PIN, OUTPUT); memset(ram_buffer, 0, FLASH_PAGE_SIZE); strcpy(ram_buffer, magic); bool programmed = !(memcmp(ram_buffer, template_buffer, FLASH_PAGE_SIZE)); every_gpio_write(LED_PORT, LED_PIN, programmed); if (!programmed) { //Not programmed: Write ram to flash. iap_prepare_sector(PERSISTENCE_SECTOR); iap_erase_sector(PERSISTENCE_SECTOR); iap_prepare_sector(PERSISTENCE_SECTOR); iap_write_page(PERSISTENCE_PAGE, ram_buffer); } }
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); } }