From c1cfffd8eb92aedde76439afa30d8584c4c60043 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 12 Oct 2010 11:27:15 +0000 Subject: [PATCH] Fixed random enumeration failure while in device mode due to interrupts causing the Set Address request to exceed maximum timings. --- .../Drivers/USB/HighLevel/DeviceStandardReq.c | 57 +++++++++---------- LUFA/ManPages/ChangeLog.txt | 1 + 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c index d13ac7439d..e15a48d50c 100644 --- a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c +++ b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c @@ -126,27 +126,28 @@ static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - Endpoint_ClearSETUP(); - - Endpoint_ClearStatusStage(); - - while (!(Endpoint_IsINReady())) + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } + Endpoint_ClearSETUP(); + + Endpoint_ClearStatusStage(); + + while (!(Endpoint_IsINReady())); - USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; + USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - USB_Device_SetDeviceAddress(DeviceAddress); + USB_Device_SetDeviceAddress(DeviceAddress); + } } static void USB_Device_SetConfiguration(void) { -#if defined(FIXED_NUM_CONFIGURATIONS) + #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) return; -#else + #else + USB_Descriptor_Device_t* DevDescriptorPtr; + #if defined(USE_FLASH_DESCRIPTORS) #define MemoryAddressSpace MEMSPACE_FLASH #elif defined(USE_EEPROM_DESCRIPTORS) @@ -157,8 +158,6 @@ static void USB_Device_SetConfiguration(void) uint8_t MemoryAddressSpace; #endif - USB_Descriptor_Device_t* DevDescriptorPtr; - if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS) , &MemoryAddressSpace @@ -183,7 +182,7 @@ static void USB_Device_SetConfiguration(void) if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) return; } -#endif + #endif Endpoint_ClearSETUP(); @@ -199,7 +198,7 @@ static void USB_Device_SetConfiguration(void) EVENT_USB_Device_ConfigurationChanged(); } -void USB_Device_GetConfiguration(void) +static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); @@ -259,7 +258,7 @@ static void USB_Device_GetDescriptor(void) uint16_t DescriptorSize; #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS) - uint8_t DescriptorAddressSpace; + uint8_t DescriptorAddressSpace; #endif #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) @@ -306,20 +305,20 @@ static void USB_Device_GetStatus(void) switch (USB_ControlRequest.bmRequestType) { -#if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP) + #if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP) case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE): - #if !defined(NO_DEVICE_SELF_POWER) + #if !defined(NO_DEVICE_SELF_POWER) if (USB_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; - #endif + #endif - #if !defined(NO_DEVICE_REMOTE_WAKEUP) + #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_RemoteWakeupEnabled) CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - #endif + #endif break; -#endif -#if !defined(CONTROL_ONLY_DEVICE) + #endif + #if !defined(CONTROL_ONLY_DEVICE) case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); @@ -328,7 +327,7 @@ static void USB_Device_GetStatus(void) Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); break; -#endif + #endif default: return; } @@ -345,7 +344,7 @@ static void USB_Device_ClearSetFeature(void) { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) { -#if !defined(NO_DEVICE_REMOTE_WAKEUP) + #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_REMOTE_WAKEUP) USB_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); @@ -353,8 +352,8 @@ static void USB_Device_ClearSetFeature(void) return; break; -#endif -#if !defined(CONTROL_ONLY_DEVICE) + #endif + #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_ENDPOINT_HALT) { @@ -381,7 +380,7 @@ static void USB_Device_ClearSetFeature(void) } break; -#endif + #endif default: return; } diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index e16a33de59..faf007ad01 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -71,6 +71,7 @@ * - Fixed broken FLASH/EEPROM programming in the AVRISP-MKII clone project when writing in non-paged mode and the polling byte cannot be used * - Fixed SPI driver not explicitly setting /SS and MISO pins as inputs when SPI_Init() is called * - Fixed ISR definition conflict in the XPLAIN bridge between the software UART and the AVRISP-MKII ISP modules + * - Fixed random enumeration failure while in device mode due to interrupts causing the Set Address request to exceed maximum timings * * \section Sec_ChangeLog100807 Version 100807 * New: