Fixed device state not being reset back to the default state if the host sets the...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / DevChapter9.c
index 17a5fd4..b7f811b 100644 (file)
@@ -136,8 +136,7 @@ static void USB_Device_SetAddress(void)
                  return;\r
        }\r
 \r
-       if (DeviceAddress)\r
-         USB_DeviceState = DEVICE_STATE_Addressed;\r
+       USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;\r
 \r
        UDADDR = ((1 << ADDEN) | DeviceAddress);\r
 \r
@@ -146,12 +145,21 @@ static void USB_Device_SetAddress(void)
 \r
 static void USB_Device_SetConfiguration(void)\r
 {\r
+       if (USB_DeviceState != DEVICE_STATE_Addressed)\r
+         return;\r
+       \r
 #if defined(FIXED_NUM_CONFIGURATIONS)\r
        if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)\r
          return;\r
 #else\r
-       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
-       uint8_t MemoryAddressSpace;\r
+       #if defined(USE_FLASH_DESCRIPTORS)\r
+               #define MemoryAddressSpace  MEMSPACE_FLASH\r
+       #elif defined(USE_EEPROM_DESCRIPTORS)\r
+               #define MemoryAddressSpace  MEMSPACE_EEPROM\r
+       #elif defined(USE_SRAM_DESCRIPTORS)\r
+               #define MemoryAddressSpace  MEMSPACE_SRAM\r
+       #else\r
+               uint8_t MemoryAddressSpace;\r
        #endif\r
        \r
        USB_Descriptor_Device_t* DevDescriptorPtr;\r
@@ -165,16 +173,6 @@ static void USB_Device_SetConfiguration(void)
                return;\r
        }\r
        \r
-       #if defined(USE_RAM_DESCRIPTORS)\r
-       if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)\r
-         return;\r
-       #elif defined (USE_EEPROM_DESCRIPTORS)\r
-       if ((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations))\r
-         return;\r
-       #elif defined (USE_FLASH_DESCRIPTORS)\r
-       if ((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations))\r
-         return;\r
-       #else\r
        if (MemoryAddressSpace == MEMSPACE_FLASH)\r
        {\r
                if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
@@ -190,7 +188,6 @@ static void USB_Device_SetConfiguration(void)
                if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)\r
                  return;\r
        }\r
-       #endif\r
 #endif\r
        \r
        Endpoint_ClearSETUP();\r
@@ -234,17 +231,20 @@ static void USB_Device_GetInternalSerialDescriptor(void)
        \r
        uint8_t SigReadAddress = 0x0E;\r
 \r
-       for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++)\r
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)\r
        {\r
-               uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);\r
-               \r
-               if (SerialCharNum & 0x01)\r
+               for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++)\r
                {\r
-                       SerialByte >>= 4;\r
-                       SigReadAddress++;\r
+                       uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);\r
+                       \r
+                       if (SerialCharNum & 0x01)\r
+                       {\r
+                               SerialByte >>= 4;\r
+                               SigReadAddress++;\r
+                       }\r
+                       \r
+                       SignatureDescriptor.UnicodeString[SerialCharNum] = USB_Device_NibbleToASCII(SerialByte);\r
                }\r
-               \r
-               SignatureDescriptor.UnicodeString[SerialCharNum] = USB_Device_NibbleToASCII(SerialByte);\r
        }\r
        \r
        Endpoint_ClearSETUP();\r