aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-10-31 02:26:21 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-10-31 02:26:21 +0000
commit0304916356ea83bb17783df157c79cbfdef0d45b (patch)
tree5a4671825b203897c7c43146b578716cb10e74bc /LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
parenteb5b8a32e4d254479b14c82d36de8e17218640c4 (diff)
downloadlufa-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.c23
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)