Add Doxygen documentation to the completed portions of the PDI programming protocol...
[pub/USBasp.git] / Bootloaders / TeensyHID / TeensyHID.c
index e81c462..84ec7aa 100644 (file)
  *  Main source file for the TeensyHID bootloader. This file contains the complete bootloader logic.\r
  */\r
  \r
-#define  INCLUDE_FROM_TEENSYHID_C\r
 #include "TeensyHID.h"\r
 \r
-/* Global Variables: */\r
 /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run\r
  *  via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application\r
  *  started via a forced watchdog reset.\r
  */\r
 bool RunBootloader = true;\r
 \r
-\r
 /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously \r
  *  runs the bootloader processing routine until instructed to soft-exit.\r
  */\r
 int main(void)\r
 {\r
+       /* Setup hardware required for the bootloader */\r
+       SetupHardware();\r
+       \r
+       while (RunBootloader)\r
+         USB_USBTask();\r
+       \r
+       /* Turn off the USB interface, disconnect from the host */\r
+       USB_ShutDown();\r
+\r
+       /* Enable the watchdog and force a timeout to reset the AVR */\r
+       wdt_enable(WDTO_250MS);\r
+                                       \r
+       for (;;);\r
+}\r
+\r
+/** Configures all hardware required for the bootloader. */\r
+void SetupHardware(void)\r
+{\r
        /* Disable watchdog if enabled by bootloader/fuses */\r
        MCUSR &= ~(1 << WDRF);\r
        wdt_disable();\r
@@ -62,26 +77,12 @@ int main(void)
 \r
        /* Initialize USB subsystem */\r
        USB_Init();\r
-       \r
-       while (RunBootloader)\r
-         USB_USBTask();\r
-         \r
-       /* Shut down the USB interface, so that the host will register the disconnection */\r
-       USB_ShutDown();\r
-\r
-       /* Wait 100ms to give the host time to register the disconnection */\r
-       _delay_ms(100);\r
-\r
-       /* Enable the watchdog and force a timeout to reset the AVR */\r
-       wdt_enable(WDTO_250MS);\r
-                                       \r
-       for (;;);\r
 }\r
 \r
 /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready\r
  *  to relay data to and from the attached USB host.\r
  */\r
-EVENT_HANDLER(USB_ConfigurationChanged)\r
+void EVENT_USB_Device_ConfigurationChanged(void)\r
 {\r
        /* Setup HID Report Endpoint */\r
        Endpoint_ConfigureEndpoint(HID_EPNUM, EP_TYPE_INTERRUPT,\r
@@ -89,23 +90,23 @@ EVENT_HANDLER(USB_ConfigurationChanged)
                                   ENDPOINT_BANK_SINGLE);\r
 }\r
 \r
-/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
+/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific\r
  *  control requests that are not handled internally by the USB library (including the HID 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_Device_UnhandledControlRequest(void)\r
 {\r
        /* Handle HID Class specific requests */\r
-       switch (bRequest)\r
+       switch (USB_ControlRequest.bRequest)\r
        {\r
                case REQ_SetReport:\r
-                       if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))\r
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))\r
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Wait until the command (report) has been sent by the host */\r
+                               /* Wait until the command has been sent by the host */\r
                                while (!(Endpoint_IsOUTReceived()));\r
-\r
+                       \r
                                /* Read in the write destination address */\r
                                uint16_t PageAddress = Endpoint_Read_Word_LE();\r
                                \r
@@ -121,7 +122,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
                                        boot_spm_busy_wait();\r
                                        \r
                                        /* Write each of the FLASH page's bytes in sequence */\r
-                                       for (uint8_t PageByte = 0; PageByte < 128; PageByte += 2)\r
+                                       for (uint8_t PageByte = 0; PageByte < SPM_PAGESIZE; PageByte += 2)\r
                                        {\r
                                                /* Check if endpoint is empty - if so clear it and wait until ready for next packet */\r
                                                if (!(Endpoint_BytesInEndpoint()))\r
@@ -144,9 +145,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 \r
                                Endpoint_ClearOUT();\r
 \r
-                               /* Acknowledge status stage */\r
-                               while (!(Endpoint_IsINReady()));\r
-                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();\r
                        }\r
                        \r
                        break;\r