diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2010-10-12 11:27:15 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2010-10-12 11:27:15 +0000 |
commit | c1cfffd8eb92aedde76439afa30d8584c4c60043 (patch) | |
tree | 0daa8b317ae8d08c018145080cd555b5810b8800 /LUFA/Drivers | |
parent | bea72a8412f99b294c00341fa16a8308bcc66f15 (diff) | |
download | lufa-c1cfffd8eb92aedde76439afa30d8584c4c60043.tar.gz lufa-c1cfffd8eb92aedde76439afa30d8584c4c60043.tar.bz2 lufa-c1cfffd8eb92aedde76439afa30d8584c4c60043.zip |
Fixed random enumeration failure while in device mode due to interrupts causing the Set Address request to exceed maximum timings.
Diffstat (limited to 'LUFA/Drivers')
-rw-r--r-- | LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c | 57 |
1 files changed, 28 insertions, 29 deletions
diff --git a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c index d13ac7439..e15a48d50 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; } |