diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2011-10-31 02:26:21 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2011-10-31 02:26:21 +0000 |
commit | 0304916356ea83bb17783df157c79cbfdef0d45b (patch) | |
tree | 5a4671825b203897c7c43146b578716cb10e74bc /LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c | |
parent | eb5b8a32e4d254479b14c82d36de8e17218640c4 (diff) | |
download | lufa-0304916356ea83bb17783df157c79cbfdef0d45b.tar.gz lufa-0304916356ea83bb17783df157c79cbfdef0d45b.tar.bz2 lufa-0304916356ea83bb17783df157c79cbfdef0d45b.zip |
Fix XMEGA core USB driver so that device mode enumerates correctly on the host PC.
Diffstat (limited to 'LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c')
-rw-r--r-- | LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c index 3c9ba27ea..604427fca 100644 --- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c +++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c @@ -53,7 +53,7 @@ bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Number, Endpoint_SelectEndpoint(Number | Direction); USB_Endpoint_SelectedHandle->CTRL = 0; - USB_Endpoint_SelectedHandle->STATUS = (Direction == ENDPOINT_DIR_IN) ? (USB_EP_BUSNACK0_bm | USB_EP_TRNCOMPL0_bm) : USB_EP_BUSNACK0_bm; + USB_Endpoint_SelectedHandle->STATUS = (Direction == ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; USB_Endpoint_SelectedHandle->CTRL = Config; USB_Endpoint_SelectedHandle->CNT = 0; USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)&USB_Endpoint_SelectedFIFO->Data[0]; @@ -72,13 +72,26 @@ void Endpoint_ClearEndpoints(void) void Endpoint_ClearStatusStage(void) { - while (!(Endpoint_IsOUTReceived())) + if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + Endpoint_ClearOUT(); } + else + { + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } - Endpoint_ClearOUT(); + Endpoint_ClearIN(); + } } #if !defined(CONTROL_ONLY_DEVICE) |