Add script reading bootloader flags
[pub/lufa.git] / Bootloaders / HID / BootloaderHID.c
index 58c9b3b..8973bd8 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2017.
+     Copyright (C) Dean Camera, 2021.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2021  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -84,6 +84,9 @@ int main(void)
        while (RunBootloader)
          USB_USBTask();
 
+       /* Wait a short time to end all USB transactions and then disconnect */
+       _delay_us(1000);
+
        /* Disconnect from the host - USB interface will be reset later along with the AVR */
        USB_Detach();
 
@@ -152,6 +155,10 @@ void EVENT_USB_Device_ControlRequest(void)
                        uint16_t PageAddress = Endpoint_Read_16_LE();
                        #endif
 
+                       /* Determine if the given page address is correctly aligned to the
+                          start of a flash page. */
+                       bool PageAddressIsAligned = !(PageAddress & (SPM_PAGESIZE - 1));
+
                        /* Check if the command is a program page command, or a start application command */
                        #if (FLASHEND > 0xFFFF)
                        if ((uint16_t)(PageAddress >> 8) == COMMAND_STARTAPPLICATION)
@@ -161,7 +168,7 @@ void EVENT_USB_Device_ControlRequest(void)
                        {
                                RunBootloader = false;
                        }
-                       else if (PageAddress < BOOT_START_ADDR)
+                       else if ((PageAddress < BOOT_START_ADDR) && PageAddressIsAligned)
                        {
                                /* Erase the given FLASH page, ready to be programmed */
                                ATOMIC_BLOCK(ATOMIC_RESTORESTATE)