Move new Class Driver powered demos to a new ClassDriver subdirectory, re-add old...
[pub/USBasp.git] / Bootloaders / DFU / BootloaderDFU.c
index 9fff20c..11177c5 100644 (file)
  *\r
  *  Main source file for the DFU class bootloader. This file contains the complete bootloader logic.\r
  */\r
\r
-/** Configuration define. Define this token to true to case the bootloader to reject all memory commands\r
- *  until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this\r
- *  can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are\r
- *  allowed at any time.\r
- */\r
-#define SECURE_MODE           false\r
 \r
 #define  INCLUDE_FROM_BOOTLOADER_C\r
 #include "BootloaderDFU.h"\r
@@ -146,7 +139,7 @@ int main (void)
 /** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user\r
  *  application started.\r
  */\r
-EVENT_HANDLER(USB_Disconnect)\r
+void EVENT_USB_Disconnect(void)\r
 {\r
        /* Upon disconnection, run user application */\r
        RunBootloader = false;\r
@@ -156,21 +149,15 @@ EVENT_HANDLER(USB_Disconnect)
  *  control requests that are not handled internally by the USB library (including the DFU commands, which are\r
  *  all issued via the control endpoint), so that they can be handled appropriately for the application.\r
  */\r
-EVENT_HANDLER(USB_UnhandledControlPacket)\r
+void EVENT_USB_UnhandledControlPacket(void)\r
 {\r
-       /* Discard unused wIndex value */\r
-       Endpoint_Discard_Word();\r
-       \r
-       /* Discard unused wValue value */\r
-       Endpoint_Discard_Word();\r
-\r
        /* Get the size of the command and data from the wLength value */\r
-       SentCommand.DataSize = Endpoint_Read_Word_LE();\r
+       SentCommand.DataSize = USB_ControlRequest.wLength;\r
 \r
-       switch (bRequest)\r
+       switch (USB_ControlRequest.bRequest)\r
        {\r
                case DFU_DNLOAD:\r
-                       Endpoint_ClearSetupReceived();\r
+                       Endpoint_ClearSETUP();\r
                        \r
                        /* Check if bootloader is waiting to terminate */\r
                        if (WaitForExit)\r
@@ -185,7 +172,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                        /* If the request has a data stage, load it into the command struct */\r
                        if (SentCommand.DataSize)\r
                        {\r
-                               while (!(Endpoint_IsSetupOUTReceived()));\r
+                               while (!(Endpoint_IsOUTReceived()));\r
 \r
                                /* First byte of the data stage is the DNLOAD request's command */\r
                                SentCommand.Command = Endpoint_Read_Byte();\r
@@ -232,7 +219,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                                {\r
                                                        uint16_t Words[2];\r
                                                        uint32_t Long;\r
-                                               } CurrFlashAddress                 = {Words: {StartAddr, Flash64KBPage}};\r
+                                               } CurrFlashAddress                 = {.Words = {StartAddr, Flash64KBPage}};\r
                                                \r
                                                uint32_t CurrFlashPageStartAddress = CurrFlashAddress.Long;\r
                                                uint8_t  WordsInFlashPage          = 0;\r
@@ -242,8 +229,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                                        /* Check if endpoint is empty - if so clear it and wait until ready for next packet */\r
                                                        if (!(Endpoint_BytesInEndpoint()))\r
                                                        {\r
-                                                               Endpoint_ClearSetupOUT();\r
-                                                               while (!(Endpoint_IsSetupOUTReceived()));\r
+                                                               Endpoint_ClearOUT();\r
+                                                               while (!(Endpoint_IsOUTReceived()));\r
                                                        }\r
 \r
                                                        /* Write the next word into the current flash page */\r
@@ -286,8 +273,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                                        /* Check if endpoint is empty - if so clear it and wait until ready for next packet */\r
                                                        if (!(Endpoint_BytesInEndpoint()))\r
                                                        {\r
-                                                               Endpoint_ClearSetupOUT();\r
-                                                               while (!(Endpoint_IsSetupOUTReceived()));\r
+                                                               Endpoint_ClearOUT();\r
+                                                               while (!(Endpoint_IsOUTReceived()));\r
                                                        }\r
 \r
                                                        /* Read the byte from the USB interface and write to to the EEPROM */\r
@@ -303,17 +290,17 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                }\r
                        }\r
 \r
-                       Endpoint_ClearSetupOUT();\r
+                       Endpoint_ClearOUT();\r
 \r
                        /* Acknowledge status stage */\r
-                       while (!(Endpoint_IsSetupINReady()));\r
-                       Endpoint_ClearSetupIN();\r
+                       while (!(Endpoint_IsINReady()));\r
+                       Endpoint_ClearIN();\r
                                \r
                        break;\r
                case DFU_UPLOAD:\r
-                       Endpoint_ClearSetupReceived();\r
+                       Endpoint_ClearSETUP();\r
 \r
-                       while (!(Endpoint_IsSetupINReady()));\r
+                       while (!(Endpoint_IsINReady()));\r
 \r
                        if (DFU_State != dfuUPLOAD_IDLE)\r
                        {\r
@@ -343,15 +330,15 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                        {\r
                                                uint16_t Words[2];\r
                                                uint32_t Long;\r
-                                       } CurrFlashAddress = {Words: {StartAddr, Flash64KBPage}};\r
+                                       } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};\r
 \r
                                        while (WordsRemaining--)\r
                                        {\r
                                                /* Check if endpoint is full - if so clear it and wait until ready for next packet */\r
                                                if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE)\r
                                                {\r
-                                                       Endpoint_ClearSetupIN();\r
-                                                       while (!(Endpoint_IsSetupINReady()));\r
+                                                       Endpoint_ClearIN();\r
+                                                       while (!(Endpoint_IsINReady()));\r
                                                }\r
 \r
                                                /* Read the flash word and send it via USB to the host */\r
@@ -375,8 +362,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                                /* Check if endpoint is full - if so clear it and wait until ready for next packet */\r
                                                if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE)\r
                                                {\r
-                                                       Endpoint_ClearSetupIN();\r
-                                                       while (!(Endpoint_IsSetupINReady()));\r
+                                                       Endpoint_ClearIN();\r
+                                                       while (!(Endpoint_IsINReady()));\r
                                                }\r
 \r
                                                /* Read the EEPROM byte and send it via USB to the host */\r
@@ -391,15 +378,15 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                DFU_State = dfuIDLE;\r
                        }\r
 \r
-                       Endpoint_ClearSetupIN();\r
+                       Endpoint_ClearIN();\r
 \r
                        /* Acknowledge status stage */\r
-                       while (!(Endpoint_IsSetupOUTReceived()));\r
-                       Endpoint_ClearSetupOUT();\r
+                       while (!(Endpoint_IsOUTReceived()));\r
+                       Endpoint_ClearOUT();\r
 \r
                        break;\r
                case DFU_GETSTATUS:\r
-                       Endpoint_ClearSetupReceived();\r
+                       Endpoint_ClearSETUP();\r
                        \r
                        /* Write 8-bit status value */\r
                        Endpoint_Write_Byte(DFU_Status);\r
@@ -414,46 +401,46 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                        /* Write 8-bit state string ID number */\r
                        Endpoint_Write_Byte(0);\r
 \r
-                       Endpoint_ClearSetupIN();\r
+                       Endpoint_ClearIN();\r
                        \r
                        /* Acknowledge status stage */\r
-                       while (!(Endpoint_IsSetupOUTReceived()));\r
-                       Endpoint_ClearSetupOUT();\r
+                       while (!(Endpoint_IsOUTReceived()));\r
+                       Endpoint_ClearOUT();\r
        \r
                        break;          \r
                case DFU_CLRSTATUS:\r
-                       Endpoint_ClearSetupReceived();\r
+                       Endpoint_ClearSETUP();\r
                        \r
                        /* Reset the status value variable to the default OK status */\r
                        DFU_Status = OK;\r
 \r
                        /* Acknowledge status stage */\r
-                       while (!(Endpoint_IsSetupINReady()));\r
-                       Endpoint_ClearSetupIN();\r
+                       while (!(Endpoint_IsINReady()));\r
+                       Endpoint_ClearIN();\r
                        \r
                        break;\r
                case DFU_GETSTATE:\r
-                       Endpoint_ClearSetupReceived();\r
+                       Endpoint_ClearSETUP();\r
                        \r
                        /* Write the current device state to the endpoint */\r
                        Endpoint_Write_Byte(DFU_State);\r
                \r
-                       Endpoint_ClearSetupIN();\r
+                       Endpoint_ClearIN();\r
                        \r
                        /* Acknowledge status stage */\r
-                       while (!(Endpoint_IsSetupOUTReceived()));\r
-                       Endpoint_ClearSetupOUT();\r
+                       while (!(Endpoint_IsOUTReceived()));\r
+                       Endpoint_ClearOUT();\r
 \r
                        break;\r
                case DFU_ABORT:\r
-                       Endpoint_ClearSetupReceived();\r
+                       Endpoint_ClearSETUP();\r
                        \r
                        /* Reset the current state variable to the default idle state */\r
                        DFU_State = dfuIDLE;\r
                        \r
                        /* Acknowledge status stage */\r
-                       while (!(Endpoint_IsSetupINReady()));\r
-                       Endpoint_ClearSetupIN();\r
+                       while (!(Endpoint_IsINReady()));\r
+                       Endpoint_ClearIN();\r
 \r
                        break;\r
        }\r
@@ -470,10 +457,10 @@ static void DiscardFillerBytes(uint8_t NumberOfBytes)
        {\r
                if (!(Endpoint_BytesInEndpoint()))\r
                {\r
-                       Endpoint_ClearSetupOUT();\r
+                       Endpoint_ClearOUT();\r
 \r
                        /* Wait until next data packet received */\r
-                       while (!(Endpoint_IsSetupOUTReceived()));\r
+                       while (!(Endpoint_IsOUTReceived()));\r
                }\r
 \r
                Endpoint_Discard_Byte();                                                \r
@@ -538,15 +525,15 @@ static void LoadStartEndAddresses(void)
        {\r
                uint8_t  Bytes[2];\r
                uint16_t Word;\r
-       } Address[2] = {{Bytes: {SentCommand.Data[2], SentCommand.Data[1]}},\r
-                       {Bytes: {SentCommand.Data[4], SentCommand.Data[3]}}};\r
+       } Address[2] = {{.Bytes = {SentCommand.Data[2], SentCommand.Data[1]}},\r
+                       {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}};\r
                \r
        /* Load in the start and ending read addresses from the sent data packet */\r
        StartAddr = Address[0].Word;\r
        EndAddr   = Address[1].Word;\r
 }\r
 \r
-/** Handler for a Memory Program command issued by the host. This routine handles the preperations needed\r
+/** Handler for a Memory Program command issued by the host. This routine handles the preparations needed\r
  *  to write subsequent data from the host into the specified memory.\r
  */\r
 static void ProcessMemProgCommand(void)\r
@@ -564,7 +551,7 @@ static void ProcessMemProgCommand(void)
                        {\r
                                uint16_t Words[2];\r
                                uint32_t Long;\r
-                       } CurrFlashAddress = {Words: {StartAddr, Flash64KBPage}};\r
+                       } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};\r
                        \r
                        /* Erase the current page's temp buffer */\r
                        boot_page_erase(CurrFlashAddress.Long);\r
@@ -576,7 +563,7 @@ static void ProcessMemProgCommand(void)
        }\r
 }\r
 \r
-/** Handler for a Memory Read command issued by the host. This routine handles the preperations needed\r
+/** Handler for a Memory Read command issued by the host. This routine handles the preparations needed\r
  *  to read subsequent data from the specified memory out to the host, as well as implementing the memory\r
  *  blank check command.\r
  */\r
@@ -646,7 +633,7 @@ static void ProcessWriteCommand(void)
                                {\r
                                        uint8_t  Bytes[2];\r
                                        AppPtr_t FuncPtr;\r
-                               } Address = {Bytes: {SentCommand.Data[4], SentCommand.Data[3]}};\r
+                               } Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}};\r
 \r
                                AppStartPtr = Address.FuncPtr;\r
                                \r