Fix XMEGA architecture not correctly resetting the device address and endpoints in...
[pub/USBasp.git] / Bootloaders / DFU / BootloaderDFU.c
index 9f61660..3ce2a62 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  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
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -87,7 +87,7 @@ static uint8_t Flash64KBPage = 0;
  */
 static uint16_t StartAddr = 0x0000;
 
  */
 static uint16_t StartAddr = 0x0000;
 
-/** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH
+/** Memory end address, indicating the end address to read from/write to in the memory being addressed (either FLASH
  *  of EEPROM depending on the issued command from the host).
  */
 static uint16_t EndAddr = 0x0000;
  *  of EEPROM depending on the issued command from the host).
  */
 static uint16_t EndAddr = 0x0000;
@@ -113,10 +113,10 @@ int main(void)
 
        /* If the TCK pin is not jumpered to ground, start the user application instead */
        RunBootloader = (!(PINF & (1 << 4)));
 
        /* If the TCK pin is not jumpered to ground, start the user application instead */
        RunBootloader = (!(PINF & (1 << 4)));
-       
+
        /* Re-enable JTAG debugging */
        MCUCR &= ~(1 << JTD);
        /* Re-enable JTAG debugging */
        MCUCR &= ~(1 << JTD);
-       MCUCR &= ~(1 << JTD);   
+       MCUCR &= ~(1 << JTD);
        #endif
 
        /* Turn on first LED on the board to indicate that the bootloader has started */
        #endif
 
        /* Turn on first LED on the board to indicate that the bootloader has started */
@@ -137,7 +137,7 @@ int main(void)
 }
 
 /** Configures all hardware required for the bootloader. */
 }
 
 /** Configures all hardware required for the bootloader. */
-void SetupHardware(void)
+static void SetupHardware(void)
 {
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
 {
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
@@ -150,20 +150,21 @@ void SetupHardware(void)
        MCUCR = (1 << IVCE);
        MCUCR = (1 << IVSEL);
 
        MCUCR = (1 << IVCE);
        MCUCR = (1 << IVSEL);
 
-       /* Initialize the USB subsystem */
+       /* Initialize the USB and other board hardware drivers */
        USB_Init();
        LEDs_Init();
        USB_Init();
        LEDs_Init();
-       
+
        /* Bootloader active LED toggle timer initialization */
        TIMSK1 = (1 << TOIE1);
        TCCR1B = ((1 << CS11) | (1 << CS10));
 }
 
 /** Resets all configured hardware required for the bootloader back to their original states. */
        /* Bootloader active LED toggle timer initialization */
        TIMSK1 = (1 << TOIE1);
        TCCR1B = ((1 << CS11) | (1 << CS10));
 }
 
 /** Resets all configured hardware required for the bootloader back to their original states. */
-void ResetHardware(void)
+static void ResetHardware(void)
 {
 {
-       /* Shut down the USB subsystem */
+       /* Shut down the USB and other board hardware drivers */
        USB_Disable();
        USB_Disable();
+       LEDs_Disable();
 
        /* Relocate the interrupt vector table back to the application section */
        MCUCR = (1 << IVCE);
 
        /* Relocate the interrupt vector table back to the application section */
        MCUCR = (1 << IVCE);
@@ -182,9 +183,6 @@ ISR(TIMER1_OVF_vect, ISR_BLOCK)
  */
 void EVENT_USB_Device_ControlRequest(void)
 {
  */
 void EVENT_USB_Device_ControlRequest(void)
 {
-       /* Get the size of the command and data from the wLength value */
-       SentCommand.DataSize = USB_ControlRequest.wLength;
-       
        /* Ignore any requests that aren't directed to the DFU interface */
        if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) !=
            (REQTYPE_CLASS | REQREC_INTERFACE))
        /* Ignore any requests that aren't directed to the DFU interface */
        if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) !=
            (REQTYPE_CLASS | REQREC_INTERFACE))
@@ -192,6 +190,12 @@ void EVENT_USB_Device_ControlRequest(void)
                return;
        }
 
                return;
        }
 
+       /* Activity - toggle indicator LEDs */
+       LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
+
+       /* Get the size of the command and data from the wLength value */
+       SentCommand.DataSize = USB_ControlRequest.wLength;
+
        switch (USB_ControlRequest.bRequest)
        {
                case DFU_REQ_DNLOAD:
        switch (USB_ControlRequest.bRequest)
        {
                case DFU_REQ_DNLOAD: