|
|
|
@ -105,18 +105,24 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
|
|
|
|
|
/* Wait until the command has been sent by the host */
|
|
|
|
|
while (!(Endpoint_IsOUTReceived()));
|
|
|
|
|
|
|
|
|
|
/* Read in the write destination address */
|
|
|
|
|
uint16_t PageAddress = Endpoint_Read_Word_LE();
|
|
|
|
|
/* Read in the write destination index */
|
|
|
|
|
uint16_t PageIndex = Endpoint_Read_Word_LE();
|
|
|
|
|
|
|
|
|
|
/* Check if the command is a program page command, or a start application command */
|
|
|
|
|
if (PageAddress == TEENSY_STARTAPPLICATION)
|
|
|
|
|
if (PageIndex == TEENSY_STARTAPPLICATION)
|
|
|
|
|
{
|
|
|
|
|
RunBootloader = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
#if (SPM_PAGESIZE == 128)
|
|
|
|
|
uint16_t PageByteAddress = PageIndex;
|
|
|
|
|
#else
|
|
|
|
|
uint32_t PageByteAddress = ((uint32_t)PageIndex << 8);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Erase the given FLASH page, ready to be programmed */
|
|
|
|
|
boot_page_erase(PageAddress);
|
|
|
|
|
boot_page_erase(PageByteAddress);
|
|
|
|
|
boot_spm_busy_wait();
|
|
|
|
|
|
|
|
|
|
/* Write each of the FLASH page's bytes in sequence */
|
|
|
|
@ -134,15 +140,12 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write the next data word to the FLASH page */
|
|
|
|
|
boot_page_fill(PageAddress + PageByte, Endpoint_Read_Word_LE());
|
|
|
|
|
boot_page_fill(PageByteAddress + PageByte, Endpoint_Read_Word_LE());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write the filled FLASH page to memory */
|
|
|
|
|
boot_page_write(PageAddress);
|
|
|
|
|
boot_page_write(PageByteAddress);
|
|
|
|
|
boot_spm_busy_wait();
|
|
|
|
|
|
|
|
|
|
/* Re-enable RWW section */
|
|
|
|
|
boot_rww_enable();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Endpoint_ClearOUT();
|
|
|
|
|