Get rid of the redundant ATTR_NEVER_INLINE macro which translated to the same as...
[pub/USBasp.git] / Bootloaders / DFU / BootloaderDFU.c
index 887f94d..00532d0 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2012.
+     Copyright (C) Dean Camera, 2013.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2013  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
@@ -132,7 +132,7 @@ void Application_Jump_Check(void)
        {
                /* Turn off the watchdog */
                MCUSR &= ~(1<<WDRF);
-               wdt_disable(); 
+               wdt_disable();
 
                /* Clear the boot key and jump to the user application */
                MagicBootKey = 0;
@@ -197,7 +197,7 @@ static void ResetHardware(void)
        /* Shut down the USB and other board hardware drivers */
        USB_Disable();
        LEDs_Disable();
-       
+
        /* Disable Bootloader active LED toggle timer */
        TIMSK1 = 0;
        TCCR1B = 0;
@@ -489,6 +489,12 @@ void EVENT_USB_Device_ControlRequest(void)
                case DFU_REQ_GETSTATUS:
                        Endpoint_ClearSETUP();
 
+                       while (!(Endpoint_IsINReady()))
+                       {
+                               if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                 return;
+                       }
+
                        /* Write 8-bit status value */
                        Endpoint_Write_8(DFU_Status);
 
@@ -517,6 +523,12 @@ void EVENT_USB_Device_ControlRequest(void)
                case DFU_REQ_GETSTATE:
                        Endpoint_ClearSETUP();
 
+                       while (!(Endpoint_IsINReady()))
+                       {
+                               if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                 return;
+                       }
+
                        /* Write the current device state to the endpoint */
                        Endpoint_Write_8(DFU_State);
 
@@ -773,13 +785,20 @@ static void ProcessWriteCommand(void)
 static void ProcessReadCommand(void)
 {
        const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2};
-       const uint8_t SignatureInfo[3]  = {AVR_SIGNATURE_1,    AVR_SIGNATURE_2,     AVR_SIGNATURE_3};
+       const uint8_t SignatureInfo[4]  = {0x58, AVR_SIGNATURE_1, AVR_SIGNATURE_2, AVR_SIGNATURE_3};
 
        uint8_t DataIndexToRead = SentCommand.Data[1];
 
-       if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00))                         // Read bootloader info
-         ResponseByte = BootloaderInfo[DataIndexToRead];
+       if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00))                        // Read bootloader info
+       {
+               ResponseByte = BootloaderInfo[DataIndexToRead];
+       }
        else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01))                    // Read signature byte
-         ResponseByte = SignatureInfo[DataIndexToRead - 0x30];
+       {
+               if (DataIndexToRead < 0x60)
+                 ResponseByte = SignatureInfo[DataIndexToRead - 0x30];
+               else
+                 ResponseByte = SignatureInfo[DataIndexToRead - 0x60 + 3];
+       }
 }