From f235021abe547f3366459480ba17f548f3119ee2 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 26 May 2012 15:06:00 +0000 Subject: [PATCH 1/2] Fix incorrect definition for the XMEGA Endpoint_BytesInEndpoint() function when used on OUT endpoints. --- LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h index 720b5f3b4f..23de8fc099 100644 --- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h +++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h @@ -274,7 +274,10 @@ static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_BytesInEndpoint(void) { - return USB_Endpoint_SelectedFIFO->Position; + if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) + return USB_Endpoint_SelectedFIFO->Position; + else + return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); } /** Get the endpoint address of the currently selected endpoint. This is typically used to save From 35564bb1a742be5556812fb763e6d0ceb45fefce Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 26 May 2012 16:02:20 +0000 Subject: [PATCH 2/2] Fixed swapped Little Endian/Big Endian endpoint and pipe write code for the UC3 devices (thanks to Andrew Chu). --- LUFA/DoxygenPages/ChangeLog.txt | 1 + .../Drivers/USB/Class/Device/RNDISClassDevice.c | 3 +-- LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h | 16 ++++++++-------- LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h | 17 +++++++++-------- LUFA/Drivers/USB/Core/UC3/USBController_UC3.c | 2 +- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt index 7758f8b942..43a1b6f6eb 100644 --- a/LUFA/DoxygenPages/ChangeLog.txt +++ b/LUFA/DoxygenPages/ChangeLog.txt @@ -64,6 +64,7 @@ * - Fixed possible deadlock in the CDC device driver if the USB connection is dropped while the CDC_REQ_SetLineEncoding control request is being processed by * the stack (thanks to Jonathan Hudgins) * - Fixed broken MIDI host driver MIDI_Host_ReceiveEventPacket() function due to not unfreezing the MIDI data IN pipe before use (thanks to Michael Brown) + * - Fixed swapped Little Endian/Big Endian endpoint and pipe write code for the UC3 devices (thanks to Andrew Chu) * - Library Applications: * - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter) * - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is diff --git a/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c b/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c index e5aa40cd0d..6b710c3d5e 100644 --- a/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c +++ b/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c @@ -406,8 +406,7 @@ static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDI { case OID_GEN_CURRENT_PACKET_FILTER: RNDISInterfaceInfo->State.CurrPacketFilter = le32_to_cpu(*((uint32_t*)SetData)); - RNDISInterfaceInfo->State.CurrRNDISState = le32_to_cpu((RNDISInterfaceInfo->State.CurrPacketFilter) ? - RNDIS_Data_Initialized : RNDIS_Data_Initialized); + RNDISInterfaceInfo->State.CurrRNDISState = (RNDISInterfaceInfo->State.CurrPacketFilter) ? RNDIS_Data_Initialized : RNDIS_Initialized; return true; case OID_802_3_MULTICAST_LIST: diff --git a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h index 84801a13f2..a1b2a16f27 100644 --- a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h +++ b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h @@ -605,8 +605,8 @@ static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_16_LE(const uint16_t Data) { - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); } /** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN @@ -619,8 +619,8 @@ static inline void Endpoint_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_16_BE(const uint16_t Data) { - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); } /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints. @@ -684,10 +684,10 @@ static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_32_LE(const uint32_t Data) { - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24); - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16); - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24); } /** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN @@ -700,10 +700,10 @@ static inline void Endpoint_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_32_BE(const uint32_t Data) { - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); - *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16); *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); + *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); } /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints. diff --git a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h index 837afe8b8e..0c3136e155 100644 --- a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h +++ b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h @@ -515,6 +515,7 @@ static inline void Pipe_ClearSETUP(void) { (&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].txstpic = true; + (&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true; USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE]; } @@ -676,8 +677,8 @@ static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_16_LE(const uint16_t Data) { - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); } /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN @@ -690,8 +691,8 @@ static inline void Pipe_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_16_BE(const uint16_t Data) { - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); } /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes. @@ -755,10 +756,10 @@ static inline void Pipe_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_32_LE(const uint32_t Data) { - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24); - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16); - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24); } /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN @@ -771,10 +772,10 @@ static inline void Pipe_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_32_BE(const uint32_t Data) { - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); - *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16); *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); + *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); } /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. diff --git a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c index 32772446ef..9e4e4a211c 100644 --- a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c +++ b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c @@ -138,7 +138,7 @@ void USB_ResetInterface(void) else if (USB_CurrentMode == USB_MODE_Host) { #if defined(INVERTED_VBUS_ENABLE_LINE) - AVR32_USBB.USBCON.vbuspol = true; + AVR32_USBB.USBCON.vbuspo = true; #endif #if defined(USB_CAN_BE_HOST)