*/\r
int main(void)\r
{\r
+ /* Setup hardware required for the bootloader */\r
+ SetupHardware();\r
+\r
+ while (RunBootloader)\r
+ {\r
+ CDC_Task();\r
+ USB_USBTask();\r
+ }\r
+ \r
+ /* Reset all configured hardware to their default states for the user app */\r
+ ResetHardware();\r
+\r
+ /* Start the user application */\r
+ AppPtr_t AppStartPtr = (AppPtr_t)0x0000;\r
+ AppStartPtr(); \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
\r
/* Initialize USB Subsystem */\r
USB_Init();\r
+}\r
\r
- while (RunBootloader)\r
- {\r
- USB_USBTask();\r
- CDC_Task();\r
- }\r
- \r
- Endpoint_SelectEndpoint(CDC_TX_EPNUM);\r
-\r
- /* Wait until any pending transmissions have completed before shutting down */\r
- while (!(Endpoint_IsINReady()));\r
- \r
+/** Resets all configured hardware required for the bootloader back to their original states. */\r
+void ResetHardware(void)\r
+{\r
/* Shut down the USB subsystem */\r
USB_ShutDown();\r
\r
MCUCR = (1 << IVCE);\r
MCUCR = 0;\r
\r
- /* Reset any used hardware ports back to their defaults */\r
- PORTD = 0;\r
- DDRD = 0;\r
- \r
- #if defined(PORTE)\r
- PORTE = 0;\r
- DDRE = 0;\r
- #endif\r
- \r
/* Re-enable RWW section */\r
boot_rww_enable();\r
-\r
- /* Start the user application */\r
- AppPtr_t AppStartPtr = (AppPtr_t)0x0000;\r
- AppStartPtr(); \r
}\r
\r
/** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user\r
/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions\r
* and send the appropriate response back to the host.\r
*/\r
-TASK(CDC_Task)\r
+void CDC_Task(void)\r
{\r
/* Select the OUT endpoint */\r
Endpoint_SelectEndpoint(CDC_RX_EPNUM);\r
while (!(Endpoint_IsINReady()));\r
Endpoint_ClearIN();\r
}\r
+\r
+ /* Wait until the data has been sent to the host */\r
+ while (!(Endpoint_IsINReady()));\r
\r
/* Select the OUT endpoint */\r
Endpoint_SelectEndpoint(CDC_RX_EPNUM);\r