X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/e071f3897a0946c6be1e1b5e1f78eda8dcbf6fc7..d26a9ed5fd6fc60a0dfa61d04f5ae2bd7163a85d:/Bootloaders/TeensyHID/TeensyHID.c diff --git a/Bootloaders/TeensyHID/TeensyHID.c b/Bootloaders/TeensyHID/TeensyHID.c index eed709783..6cacfaf1e 100644 --- a/Bootloaders/TeensyHID/TeensyHID.c +++ b/Bootloaders/TeensyHID/TeensyHID.c @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2009. + Copyright (C) Dean Camera, 2010. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* - Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, and distribute this software - and its documentation for any purpose and without fee is hereby - granted, provided that the above copyright notice appear in all - copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -33,17 +33,14 @@ * Main source file for the TeensyHID bootloader. This file contains the complete bootloader logic. */ -#define INCLUDE_FROM_TEENSYHID_C #include "TeensyHID.h" -/* Global Variables: */ /** 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 * started via a forced watchdog reset. */ bool RunBootloader = true; - /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously * runs the bootloader processing routine until instructed to soft-exit. */ @@ -55,15 +52,12 @@ int main(void) while (RunBootloader) USB_USBTask(); - /* Reset all configured hardware to their default states for the user app */ - ResetHardware(); - - /* Wait 100ms to give the host time to register the disconnection */ - _delay_ms(100); + /* Disconnect from the host - USB interface will be reset later along with the AVR */ + USB_Detach(); /* Enable the watchdog and force a timeout to reset the AVR */ wdt_enable(WDTO_250MS); - + for (;;); } @@ -85,17 +79,10 @@ 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(); -} - /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready * to relay data to and from the attached USB host. */ -void EVENT_USB_ConfigurationChanged(void) +void EVENT_USB_Device_ConfigurationChanged(void) { /* Setup HID Report Endpoint */ Endpoint_ConfigureEndpoint(HID_EPNUM, EP_TYPE_INTERRUPT, @@ -103,63 +90,60 @@ void EVENT_USB_ConfigurationChanged(void) ENDPOINT_BANK_SINGLE); } -/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific +/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific * control requests that are not handled internally by the USB library (including the HID commands, which are * all issued via the control endpoint), so that they can be handled appropriately for the application. */ -void EVENT_USB_UnhandledControlPacket(void) +void EVENT_USB_Device_UnhandledControlRequest(void) { /* Handle HID Class specific requests */ switch (USB_ControlRequest.bRequest) { case REQ_SetReport: - if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - { - Endpoint_ClearSETUP(); - - /* Wait until the command (report) has been sent by the host */ - while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearSETUP(); + + /* 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 address */ - uint16_t PageAddress = Endpoint_Read_Word_LE(); + /* Check if the command is a program page command, or a start application command */ + if (PageAddress == TEENSY_STARTAPPLICATION) + { + RunBootloader = false; + } + else + { + /* Erase the given FLASH page, ready to be programmed */ + boot_page_erase(PageAddress); + boot_spm_busy_wait(); - /* Check if the command is a program page command, or a start application command */ - if (PageAddress == TEENSY_STARTAPPLICATION) - { - RunBootloader = false; - } - else + /* Write each of the FLASH page's bytes in sequence */ + for (uint8_t PageByte = 0; PageByte < SPM_PAGESIZE; PageByte += 2) { - /* Erase the given FLASH page, ready to be programmed */ - boot_page_erase(PageAddress); - boot_spm_busy_wait(); - - /* Write each of the FLASH page's bytes in sequence */ - for (uint8_t PageByte = 0; PageByte < 128; PageByte += 2) + /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ + if (!(Endpoint_BytesInEndpoint())) { - /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ - if (!(Endpoint_BytesInEndpoint())) - { - Endpoint_ClearOUT(); - while (!(Endpoint_IsOUTReceived())); - } - - /* Write the next data word to the FLASH page */ - boot_page_fill(PageAddress + PageByte, Endpoint_Read_Word_LE()); + Endpoint_ClearOUT(); + while (!(Endpoint_IsOUTReceived())); } - /* Write the filled FLASH page to memory */ - boot_page_write(PageAddress); - boot_spm_busy_wait(); - - /* Re-enable RWW section */ - boot_rww_enable(); + /* Write the next data word to the FLASH page */ + boot_page_fill(PageAddress + PageByte, Endpoint_Read_Word_LE()); } - Endpoint_ClearOUT(); + /* Write the filled FLASH page to memory */ + boot_page_write(PageAddress); + boot_spm_busy_wait(); - Endpoint_ClearStatusStage(); + /* Re-enable RWW section */ + boot_rww_enable(); } + + Endpoint_ClearOUT(); + + Endpoint_ClearStatusStage(); break; }