State information for class drivers is now zeroed out during enumeration (both in...
[pub/USBasp.git] / Bootloaders / TeensyHID / TeensyHID.c
index ee6c91a..67dded5 100644 (file)
@@ -49,6 +49,24 @@ bool RunBootloader = true;
  */\r
 int main(void)\r
 {\r
+       /* Setup hardware required for the bootloader */\r
+       SetupHardware();\r
+       \r
+       while (RunBootloader)\r
+         USB_USBTask();\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
+/** 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,20 +80,6 @@ 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
@@ -105,7 +109,7 @@ void EVENT_USB_UnhandledControlPacket(void)
                                \r
                                /* Wait until the command (report) 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
@@ -144,9 +148,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 \r
                                Endpoint_ClearOUT();\r
 \r
-                               /* Acknowledge status stage */\r
-                               while (!(Endpoint_IsINReady()));\r
-                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();\r
                        }\r
                        \r
                        break;\r