forked from mfulz_github/qmk_firmware
Add support for the ORDERED_EP_CONFIG compile time token on the UC3 architecture.
This commit is contained in:
parent
69243c5071
commit
2c404e5af5
LUFA
|
@ -45,6 +45,7 @@ volatile uint8_t* USB_EndpointFIFOPos[ENDPOINT_TOTAL_ENDPOINTS];
|
||||||
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
|
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
|
||||||
const uint32_t UECFG0Data)
|
const uint32_t UECFG0Data)
|
||||||
{
|
{
|
||||||
|
#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
|
||||||
Endpoint_SelectEndpoint(Number);
|
Endpoint_SelectEndpoint(Number);
|
||||||
Endpoint_EnableEndpoint();
|
Endpoint_EnableEndpoint();
|
||||||
|
|
||||||
|
@ -53,6 +54,38 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
|
||||||
USB_EndpointFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
|
USB_EndpointFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
|
||||||
|
|
||||||
return Endpoint_IsConfigured();
|
return Endpoint_IsConfigured();
|
||||||
|
#else
|
||||||
|
for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
||||||
|
{
|
||||||
|
uint8_t UECFG0Temp;
|
||||||
|
|
||||||
|
Endpoint_SelectEndpoint(EPNum);
|
||||||
|
|
||||||
|
if (EPNum == Number)
|
||||||
|
{
|
||||||
|
UECFG0Temp = UECFG0Data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UECFG0Temp = (&AVR32_USBB.uecfg0)[EPNum];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(UECFG0Temp & AVR32_USBB_ALLOC_MASK))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Endpoint_DisableEndpoint();
|
||||||
|
(&AVR32_USBB.uecfg0)[EPNum] &= ~AVR32_USBB_ALLOC_MASK;
|
||||||
|
|
||||||
|
Endpoint_EnableEndpoint();
|
||||||
|
(&AVR32_USBB.uecfg0)[EPNum] = UECFG0Temp;
|
||||||
|
|
||||||
|
if (!(Endpoint_IsConfigured()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Endpoint_SelectEndpoint(Number);
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Endpoint_ClearEndpoints(void)
|
void Endpoint_ClearEndpoints(void)
|
||||||
|
|
|
@ -47,6 +47,7 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
|
||||||
const uint16_t Size,
|
const uint16_t Size,
|
||||||
const uint8_t Banks)
|
const uint8_t Banks)
|
||||||
{
|
{
|
||||||
|
#if defined(ORDERED_EP_CONFIG)
|
||||||
Pipe_SelectPipe(Number);
|
Pipe_SelectPipe(Number);
|
||||||
Pipe_EnablePipe();
|
Pipe_EnablePipe();
|
||||||
|
|
||||||
|
@ -61,6 +62,44 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
|
||||||
Pipe_SetInfiniteINRequests();
|
Pipe_SetInfiniteINRequests();
|
||||||
|
|
||||||
return Pipe_IsConfigured();
|
return Pipe_IsConfigured();
|
||||||
|
#else
|
||||||
|
for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
|
||||||
|
{
|
||||||
|
uint8_t UPCFG0Temp;
|
||||||
|
|
||||||
|
Pipe_SelectPipe(PNum);
|
||||||
|
|
||||||
|
if (PNum == Number)
|
||||||
|
{
|
||||||
|
UPCFG0Temp = (AVR32_USBB_ALLOC_MASK |
|
||||||
|
((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) |
|
||||||
|
((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
|
||||||
|
((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) |
|
||||||
|
((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UPCFG0Temp = (&AVR32_USBB.upcfg0)[PNum]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(UPCFG0Temp & AVR32_USBB_ALLOC_MASK))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Pipe_DisablePipe();
|
||||||
|
(&AVR32_USBB.upcfg0)[PNum] &= ~AVR32_USBB_ALLOC_MASK;
|
||||||
|
|
||||||
|
Pipe_EnablePipe();
|
||||||
|
(&AVR32_USBB.upcfg0)[PNum] = UPCFG0Temp;
|
||||||
|
|
||||||
|
Pipe_SetInfiniteINRequests();
|
||||||
|
|
||||||
|
if (!(Pipe_IsConfigured()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pipe_SelectPipe(Number);
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pipe_ClearPipes(void)
|
void Pipe_ClearPipes(void)
|
||||||
|
|
|
@ -283,7 +283,24 @@
|
||||||
const uint8_t Banks)
|
const uint8_t Banks)
|
||||||
{
|
{
|
||||||
Endpoint_SelectEndpoint(Number | Direction);
|
Endpoint_SelectEndpoint(Number | Direction);
|
||||||
Endpoint_SelectedEndpointHandle->CTRL = (Type | Banks | Endpoint_BytesToEPSizeMask(Size));
|
|
||||||
|
uint8_t EPTypeMask = 0;
|
||||||
|
switch (Type)
|
||||||
|
{
|
||||||
|
case USB_EPTYPE_Control:
|
||||||
|
EPTypeMask = USB_EP_TYPE_CONTROL_gc;
|
||||||
|
break;
|
||||||
|
case USB_EPTYPE_Isochronous:
|
||||||
|
EPTypeMask = USB_EP_TYPE_ISOCHRONOUS_gc;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
EPTypeMask = USB_EP_TYPE_BULK_gc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Endpoint_SelectedEndpointHandle->CTRL = 0;
|
||||||
|
Endpoint_SelectedEndpointHandle->STATUS = (USB_EP_BUSNACK0_bm | USB_EP_BUSNACK1_bm);
|
||||||
|
Endpoint_SelectedEndpointHandle->CTRL = (EPTypeMask | Banks | Endpoint_BytesToEPSizeMask(Size));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,27 +341,7 @@
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
/** Enables the currently selected endpoint so that data can be sent and received through it to
|
|
||||||
* and from a host.
|
|
||||||
*
|
|
||||||
* \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
|
|
||||||
*/
|
|
||||||
static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
|
|
||||||
static inline void Endpoint_EnableEndpoint(void)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Disables the currently selected endpoint so that data cannot be sent and received through it
|
|
||||||
* to and from a host.
|
|
||||||
*/
|
|
||||||
static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
|
|
||||||
static inline void Endpoint_DisableEndpoint(void)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
|
/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
|
||||||
*
|
*
|
||||||
* \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
|
* \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
|
||||||
|
@ -355,20 +352,6 @@
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
|
|
||||||
* transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
|
|
||||||
* \ref Endpoint_ClearOUT() command.
|
|
||||||
*
|
|
||||||
* \ingroup Group_EndpointPacketManagement_XMEGA
|
|
||||||
*
|
|
||||||
* \return Total number of busy banks in the selected endpoint.
|
|
||||||
*/
|
|
||||||
static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
|
|
||||||
static inline uint8_t Endpoint_GetBusyBanks(void)
|
|
||||||
{
|
|
||||||
return 0; // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Aborts all pending IN transactions on the currently selected endpoint, once the bank
|
/** Aborts all pending IN transactions on the currently selected endpoint, once the bank
|
||||||
* has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
|
* has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
|
||||||
* will terminate all queued transactions, resetting the endpoint banks ready for a new
|
* will terminate all queued transactions, resetting the endpoint banks ready for a new
|
||||||
|
|
|
@ -81,7 +81,7 @@
|
||||||
* \section Sec_SummaryUSBTokens General USB Driver Related Tokens
|
* \section Sec_SummaryUSBTokens General USB Driver Related Tokens
|
||||||
* This section describes compile tokens which affect USB driver stack as a whole in the LUFA library.
|
* This section describes compile tokens which affect USB driver stack as a whole in the LUFA library.
|
||||||
*
|
*
|
||||||
* <b>ORDERED_EP_CONFIG</b> - (\ref Group_EndpointManagement , \ref Group_PipeManagement) - <i>AVR8 Only</i> \n
|
* <b>ORDERED_EP_CONFIG</b> - (\ref Group_EndpointManagement , \ref Group_PipeManagement) - <i>AVR8, UC3</i> \n
|
||||||
* The USB AVRs do not allow for Endpoints and Pipes to be configured out of order; they <i>must</i> be configured in an ascending order to
|
* The USB AVRs do not allow for Endpoints and Pipes to be configured out of order; they <i>must</i> be configured in an ascending order to
|
||||||
* prevent data corruption issues. However, by default LUFA employs a workaround to allow for unordered Endpoint/Pipe initialization. This compile
|
* prevent data corruption issues. However, by default LUFA employs a workaround to allow for unordered Endpoint/Pipe initialization. This compile
|
||||||
* time token may be used to restrict the initialization order to ascending indexes only in exchange for a smaller compiled binary size. Use
|
* time token may be used to restrict the initialization order to ascending indexes only in exchange for a smaller compiled binary size. Use
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
* can be accurately set and the \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events manually raised by the RAISE_EVENT macro.
|
* can be accurately set and the \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events manually raised by the RAISE_EVENT macro.
|
||||||
* When defined, this token disables the library's auto-detection of the connection state by the aforementioned suspension and wake up events.
|
* When defined, this token disables the library's auto-detection of the connection state by the aforementioned suspension and wake up events.
|
||||||
*
|
*
|
||||||
* <b>NO_SOF_EVENTS</b> - (\ref Group_Events) - <i>All Architectures</i> \n
|
* <b>NO_SOF_EVENTS</b> - (\ref Group_Events) - <i>AVR8, UC3</i> \n
|
||||||
* By default, there exists a LUFA application event for the start of each USB frame while the USB bus is not suspended in either host or device mode.
|
* By default, there exists a LUFA application event for the start of each USB frame while the USB bus is not suspended in either host or device mode.
|
||||||
* This event can be selectively enabled or disabled by calling the appropriate device or host mode function. When this compile time token is defined,
|
* This event can be selectively enabled or disabled by calling the appropriate device or host mode function. When this compile time token is defined,
|
||||||
* the ability to receive USB Start of Frame events via the \ref EVENT_USB_Device_StartOfFrame() or \ref EVENT_USB_Host_StartOfFrame() events is removed,
|
* the ability to receive USB Start of Frame events via the \ref EVENT_USB_Device_StartOfFrame() or \ref EVENT_USB_Host_StartOfFrame() events is removed,
|
||||||
|
|
Loading…
Reference in New Issue