diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c index 83fd0ee924..9f78786171 100644 --- a/Bootloaders/CDC/BootloaderCDC.c +++ b/Bootloaders/CDC/BootloaderCDC.c @@ -54,8 +54,8 @@ CDC_Line_Coding_t LineCoding = { .BaudRateBPS = 9600, uint32_t CurrAddress; /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run - * via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application - * jumped to via an indirect jump to location 0x0000. + * via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite + * loop until the AVR restarts and the application runs. */ bool RunBootloader = true; @@ -78,12 +78,13 @@ int main(void) USB_USBTask(); } - /* Reset all configured hardware to their default states for the user app */ - ResetHardware(); + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); - /* Start the user application */ - AppPtr_t AppStartPtr = (AppPtr_t)0x0000; - AppStartPtr(); + /* Enable the watchdog and force a timeout to reset the AVR */ + wdt_enable(WDTO_250MS); + + for (;;); } /** Configures all hardware required for the bootloader. */ @@ -104,20 +105,6 @@ void SetupHardware(void) USB_Init(); } -/** Resets all configured hardware required for the bootloader back to their original states. */ -void ResetHardware(void) -{ - /* Shut down the USB subsystem */ - USB_ShutDown(); - - /* Relocate the interrupt vector table back to the application section */ - MCUCR = (1 << IVCE); - MCUCR = 0; - - /* Re-enable RWW section */ - boot_rww_enable(); -} - /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready * to relay data to and from the attached USB host. */ diff --git a/Bootloaders/CDC/BootloaderCDC.h b/Bootloaders/CDC/BootloaderCDC.h index 22b57438df..81422119f8 100644 --- a/Bootloaders/CDC/BootloaderCDC.h +++ b/Bootloaders/CDC/BootloaderCDC.h @@ -117,7 +117,6 @@ /* Function Prototypes: */ void CDC_Task(void); void SetupHardware(void); - void ResetHardware(void); void EVENT_USB_Device_ConfigurationChanged(void); void EVENT_USB_Device_UnhandledControlRequest(void); diff --git a/Bootloaders/TeensyHID/Descriptors.h b/Bootloaders/TeensyHID/Descriptors.h index 37a2b644e7..f72dec2510 100644 --- a/Bootloaders/TeensyHID/Descriptors.h +++ b/Bootloaders/TeensyHID/Descriptors.h @@ -93,7 +93,7 @@ /** Vendor usage page for the Teensy 2.0 board */ #define TEENSY_USAGEPAGE_20 0x1B - /** Vendor usage page for the Teensy++ 1.0 board */ + /** Vendor usage page for the Teensy++ 2.0 board */ #define TEENSY_USAGEPAGE_20PP 0x1C #if defined(USB_SERIES_2_AVR) diff --git a/Bootloaders/TeensyHID/TeensyHID.c b/Bootloaders/TeensyHID/TeensyHID.c index b93be6d182..ff28927b4b 100644 --- a/Bootloaders/TeensyHID/TeensyHID.c +++ b/Bootloaders/TeensyHID/TeensyHID.c @@ -105,18 +105,24 @@ void EVENT_USB_Device_UnhandledControlRequest(void) /* Wait until the command has been sent by the host */ while (!(Endpoint_IsOUTReceived())); - /* Read in the write destination address */ - uint16_t PageAddress = Endpoint_Read_Word_LE(); + /* Read in the write destination index */ + uint16_t PageIndex = Endpoint_Read_Word_LE(); /* Check if the command is a program page command, or a start application command */ - if (PageAddress == TEENSY_STARTAPPLICATION) + if (PageIndex == TEENSY_STARTAPPLICATION) { RunBootloader = false; } else { + #if (SPM_PAGESIZE == 128) + uint16_t PageByteAddress = PageIndex; + #else + uint32_t PageByteAddress = ((uint32_t)PageIndex << 8); + #endif + /* Erase the given FLASH page, ready to be programmed */ - boot_page_erase(PageAddress); + boot_page_erase(PageByteAddress); boot_spm_busy_wait(); /* Write each of the FLASH page's bytes in sequence */ @@ -134,15 +140,12 @@ void EVENT_USB_Device_UnhandledControlRequest(void) } /* Write the next data word to the FLASH page */ - boot_page_fill(PageAddress + PageByte, Endpoint_Read_Word_LE()); + boot_page_fill(PageByteAddress + PageByte, Endpoint_Read_Word_LE()); } /* Write the filled FLASH page to memory */ - boot_page_write(PageAddress); + boot_page_write(PageByteAddress); boot_spm_busy_wait(); - - /* Re-enable RWW section */ - boot_rww_enable(); } Endpoint_ClearOUT(); diff --git a/Bootloaders/TeensyHID/TeensyHID.txt b/Bootloaders/TeensyHID/TeensyHID.txt index 9dac8f5d06..1034c1c491 100644 --- a/Bootloaders/TeensyHID/TeensyHID.txt +++ b/Bootloaders/TeensyHID/TeensyHID.txt @@ -13,7 +13,7 @@ * - AT90USB162 (Teensy 1.0) * - AT90USB646 (Teensy++ 1.0) * - ATMEGA32U4 (Teensy 2.0) - * - AT90USB1287 (Teensy++ 2.0) + * - AT90USB1286 (Teensy++ 2.0) * * \section SSec_Info USB Information: * @@ -51,7 +51,9 @@ * * Out of the box this bootloader builds for the ATMEGA32U4, and will fit into 2-4KB of bootloader space. For other * devices, the makefile will need to be updated to reflect the altered MCU model and bootloader start address. When - * calculating the bootloader start address, use (TARGET_FLASH_SIZE_BYTES - 4096). + * calculating the bootloader start address, use (TARGET_FLASH_SIZE_BYTES - 4096) for targets where the bootloader + * compiles larger than 2KB, or (TARGET_FLASH_SIZE_BYTES - 2048) for smaller targets where the bootloader compiles + * under 2KB. * * This spoofs (with permission) the official Teensy bootloader's VID and PID, so that the software remains * compatible with no changes. diff --git a/Bootloaders/TeensyHID/makefile b/Bootloaders/TeensyHID/makefile index 404b55f9c8..9a9f5ff0df 100644 --- a/Bootloaders/TeensyHID/makefile +++ b/Bootloaders/TeensyHID/makefile @@ -68,7 +68,7 @@ BOARD = # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. -F_CPU = 16000000 +F_CPU = 8000000 # Input clock frequency. diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 18bfe0c5ff..4a1dba0eed 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -36,6 +36,8 @@ * selected (thanks to Steffan Woltjer) * - Removed software PDI and TPI emulation from the AVRISP-MKII clone project as it was very buggy and slow - PDI and TPI must * now be implemented via seperate programming headers + * - The CDC class bootloader now uses a watchdog reset rather than a soft-reset when exited to ensure that all hardware is + * properly reset to their defaults * * Fixed: * - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin @@ -63,6 +65,7 @@ * HID_HOST_BOOT_PROTOCOL_ONLY compile time option is set * - Fixed INTERRUPT_CONTROL_ENDPOINT compile time option preventing other interrupts from occuring while the control endpoint * request is being processed, causing possible lockups if a USB interrupt occurs during a transfer + * - Fixed TeensyHID bootloader not working on some USB AVR models with the official TeensyLoader GUI application * * \section Sec_ChangeLog100219 Version 100219 *