uint8_t xboot_write_user_signature_row(uint8_t *data) { uint8_t saved_status = SREG; cli(); Flash_LoadFlashPage(data); Flash_EraseUserSignatureRow(); Flash_WaitForSPM(); Flash_WriteUserSignatureRow(); Flash_WaitForSPM(); NVM_CMD = NVM_CMD_NO_OPERATION_gc; SREG = saved_status; return XB_SUCCESS; }
void Flash_ProgramPage(uint32_t page, uint8_t *buf, uint8_t erase) { Flash_LoadFlashPage(buf); if (erase) { Flash_EraseWriteApplicationPage(page); } else { Flash_WriteApplicationPage(page); } Flash_WaitForSPM(); }
// Higher level firmware update functions uint8_t xboot_app_temp_erase(void) { uint8_t saved_status = SREG; cli(); for (uint32_t addr = XB_APP_TEMP_START; addr < XB_APP_TEMP_END; addr += SPM_PAGESIZE) { Flash_EraseApplicationPage(addr); Flash_WaitForSPM(); } #ifdef __AVR_XMEGA__ NVM_CMD = NVM_CMD_NO_OPERATION_gc; #endif // __AVR_XMEGA__ SREG = saved_status; return XB_SUCCESS; }
uint8_t xboot_erase_application_page(uint32_t address) { uint8_t saved_status = SREG; if (address > BOOT_SECTION_START) return XB_INVALID_ADDRESS; cli(); Flash_EraseApplicationPage(address); Flash_WaitForSPM(); #ifdef __AVR_XMEGA__ NVM_CMD = NVM_CMD_NO_OPERATION_gc; #endif // __AVR_XMEGA__ SREG = saved_status; return XB_SUCCESS; }