From cb7f7a8241e5eb4fab9ed3c7f0a6c0600f6d43fb Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 1 Nov 2011 06:05:54 +0000 Subject: [PATCH] Fix XMEGA core USB driver endpoint code to prevent incorrect STALL determination. --- LUFA.pnproj | 2 +- LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c | 14 +++++++------- LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h | 9 ++++++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/LUFA.pnproj b/LUFA.pnproj index c01ef86ff6..2623a09c8c 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c index ead993ebbe..23c1520c1f 100644 --- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c +++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c @@ -52,14 +52,14 @@ 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 : 0; - USB_Endpoint_SelectedHandle->CTRL = Config; - USB_Endpoint_SelectedHandle->CNT = 0; - USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)&USB_Endpoint_SelectedFIFO->Data[0]; + USB_Endpoint_SelectedHandle->CTRL = 0; + 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]; - USB_Endpoint_SelectedFIFO->Length = (Direction == ENDPOINT_DIR_IN) ? Size : 0; - USB_Endpoint_SelectedFIFO->Position = 0; + USB_Endpoint_SelectedFIFO->Length = (Direction == ENDPOINT_DIR_IN) ? Size : 0; + USB_Endpoint_SelectedFIFO->Position = 0; return true; } diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h index 62398762c6..49bc1f2f6a 100644 --- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h +++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h @@ -289,7 +289,7 @@ const uint16_t Size, const uint8_t Banks) { - uint8_t EPConfigMask = (Banks | Endpoint_BytesToEPSizeMask(Size)); + uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | Banks | Endpoint_BytesToEPSizeMask(Size)); switch (Type) { @@ -345,7 +345,10 @@ static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE; static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber) { - USB_Endpoint_SelectedFIFO->Position = 0; + if (EndpointNumber & ENDPOINT_DIR_IN) + USB_Endpoint_FIFOs[EndpointNumber & ENDPOINT_EPNUM_MASK].IN.Position = 0; + else + USB_Endpoint_FIFOs[EndpointNumber & ENDPOINT_EPNUM_MASK].OUT.Position = 0; } /** Determines if the currently selected endpoint is enabled, but not necessarily configured. @@ -564,7 +567,7 @@ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) { - return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALLF_bm) ? true : false); + return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_STALLF_bm) ? true : false); } /** Resets the data toggle of the currently selected endpoint. */