X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/ac70ddd0a1c412bb54def48e53caaebd0b5c9c61..d0db78432fc02bacbd57cc9f15eb05b4e56981cb:/Bootloaders/CDC/BootloaderCDC.c diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c index d797915bc..d875b842d 100644 --- a/Bootloaders/CDC/BootloaderCDC.c +++ b/Bootloaders/CDC/BootloaderCDC.c @@ -67,6 +67,26 @@ bool RunBootloader = true; */ int main(void) { + /* Setup hardware required for the bootloader */ + SetupHardware(); + + while (RunBootloader) + { + CDC_Task(); + USB_USBTask(); + } + + /* Reset all configured hardware to their default states for the user app */ + ResetHardware(); + + /* Start the user application */ + AppPtr_t AppStartPtr = (AppPtr_t)0x0000; + AppStartPtr(); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); @@ -80,18 +100,11 @@ int main(void) /* Initialize USB Subsystem */ USB_Init(); +} - while (RunBootloader) - { - USB_USBTask(); - CDC_Task(); - } - - Endpoint_SelectEndpoint(CDC_TX_EPNUM); - - /* Wait until any pending transmissions have completed before shutting down */ - while (!(Endpoint_IsINReady())); - +/** Resets all configured hardware required for the bootloader back to their original states. */ +void ResetHardware(void) +{ /* Shut down the USB subsystem */ USB_ShutDown(); @@ -99,21 +112,8 @@ int main(void) MCUCR = (1 << IVCE); MCUCR = 0; - /* Reset any used hardware ports back to their defaults */ - PORTD = 0; - DDRD = 0; - - #if defined(PORTE) - PORTE = 0; - DDRE = 0; - #endif - /* Re-enable RWW section */ boot_rww_enable(); - - /* Start the user application */ - AppPtr_t AppStartPtr = (AppPtr_t)0x0000; - AppStartPtr(); } /** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user @@ -206,7 +206,7 @@ void EVENT_USB_UnhandledControlPacket(void) /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending * on the AVR910 protocol command issued. * - * \param Command Single character AVR910 protocol command indicating what memory operation to perform + * \param[in] Command Single character AVR910 protocol command indicating what memory operation to perform */ static void ReadWriteMemoryBlock(const uint8_t Command) { @@ -343,7 +343,7 @@ static uint8_t FetchNextCommandByte(void) /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the * bank when full ready for the next byte in the packet to the host. * - * \param Response Next response byte to send to the host + * \param[in] Response Next response byte to send to the host */ static void WriteNextResponseByte(const uint8_t Response) { @@ -364,7 +364,7 @@ static void WriteNextResponseByte(const uint8_t Response) /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions * and send the appropriate response back to the host. */ -TASK(CDC_Task) +void CDC_Task(void) { /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); @@ -424,9 +424,9 @@ TASK(CDC_Task) } else if (Command == 's') { - WriteNextResponseByte(SIGNATURE_2); - WriteNextResponseByte(SIGNATURE_1); - WriteNextResponseByte(SIGNATURE_0); + WriteNextResponseByte(AVR_SIGNATURE_3); + WriteNextResponseByte(AVR_SIGNATURE_2); + WriteNextResponseByte(AVR_SIGNATURE_1); } else if (Command == 'b') { @@ -566,6 +566,9 @@ TASK(CDC_Task) while (!(Endpoint_IsINReady())); Endpoint_ClearIN(); } + + /* Wait until the data has been sent to the host */ + while (!(Endpoint_IsINReady())); /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM);