forked from mfulz_github/qmk_firmware
Re-add in old Endpoint/Pipe workaround for unordered pipes - add new ORDERED_EP_CONFIG compile time option to override the workaround and use the previous behaviour that imposes correct Endpoint/Pipe ordering but produces smaller compiled code.
This commit is contained in:
parent
a57287a59f
commit
ec537fd84d
|
@ -43,6 +43,7 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
|
|||
const uint8_t UECFG0XData,
|
||||
const uint8_t UECFG1XData)
|
||||
{
|
||||
#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
|
||||
Endpoint_SelectEndpoint(Number);
|
||||
Endpoint_EnableEndpoint();
|
||||
|
||||
|
@ -51,6 +52,51 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
|
|||
UECFG1X = UECFG1XData;
|
||||
|
||||
return Endpoint_IsConfigured();
|
||||
#else
|
||||
uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS];
|
||||
uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS];
|
||||
uint8_t UEIENXTemp[ENDPOINT_TOTAL_ENDPOINTS];
|
||||
|
||||
for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
||||
{
|
||||
Endpoint_SelectEndpoint(EPNum);
|
||||
UECFG0XTemp[EPNum] = UECFG0X;
|
||||
UECFG1XTemp[EPNum] = UECFG1X;
|
||||
UEIENXTemp[EPNum] = UEIENX;
|
||||
}
|
||||
|
||||
UECFG0XTemp[Number] = UECFG0XData;
|
||||
UECFG1XTemp[Number] = UECFG1XData;
|
||||
UEIENXTemp[Number] = 0;
|
||||
|
||||
for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
||||
{
|
||||
Endpoint_SelectEndpoint(EPNum);
|
||||
UEIENX = 0;
|
||||
UEINTX = 0;
|
||||
UECFG1X = 0;
|
||||
Endpoint_DisableEndpoint();
|
||||
}
|
||||
|
||||
for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
||||
{
|
||||
if (!(UECFG1XTemp[EPNum] & (1 << ALLOC)))
|
||||
continue;
|
||||
|
||||
Endpoint_SelectEndpoint(EPNum);
|
||||
Endpoint_EnableEndpoint();
|
||||
|
||||
UECFG0X = UECFG0XTemp[EPNum];
|
||||
UECFG1X = UECFG1XTemp[EPNum];
|
||||
UEIENX = UEIENXTemp[EPNum];
|
||||
|
||||
if (!(Endpoint_IsConfigured()))
|
||||
return false;
|
||||
}
|
||||
|
||||
Endpoint_SelectEndpoint(Number);
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
void Endpoint_ClearEndpoints(void)
|
||||
|
|
|
@ -273,7 +273,8 @@
|
|||
* More banks uses more USB DPRAM, but offers better performance. Isochronous type
|
||||
* endpoints <b>must</b> have at least two banks.
|
||||
*
|
||||
* \note Endpoints <b>must</b> be configured in ascending order, or bank corruption will occur.
|
||||
* \note When the ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in ascending
|
||||
* order, or bank corruption will occur.
|
||||
* \n\n
|
||||
*
|
||||
* \note Certain models of USB AVR's endpoints may have different maximum packet sizes based on the endpoint's
|
||||
|
|
|
@ -44,6 +44,7 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
|
|||
const uint16_t Size,
|
||||
const uint8_t Banks)
|
||||
{
|
||||
#if defined(ORDERED_EP_CONFIG)
|
||||
Pipe_SelectPipe(Number);
|
||||
Pipe_EnablePipe();
|
||||
|
||||
|
@ -55,6 +56,63 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
|
|||
Pipe_SetInfiniteINRequests();
|
||||
|
||||
return Pipe_IsConfigured();
|
||||
#else
|
||||
uint8_t UPCFG0XTemp[PIPE_TOTAL_PIPES];
|
||||
uint8_t UPCFG1XTemp[PIPE_TOTAL_PIPES];
|
||||
uint8_t UPCFG2XTemp[PIPE_TOTAL_PIPES];
|
||||
uint8_t UPCONXTemp[PIPE_TOTAL_PIPES];
|
||||
uint8_t UPINRQXTemp[PIPE_TOTAL_PIPES];
|
||||
uint8_t UPIENXTemp[PIPE_TOTAL_PIPES];
|
||||
|
||||
for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
|
||||
{
|
||||
Pipe_SelectPipe(PNum);
|
||||
UPCFG0XTemp[PNum] = UPCFG0X;
|
||||
UPCFG1XTemp[PNum] = UPCFG1X;
|
||||
UPCFG2XTemp[PNum] = UPCFG2X;
|
||||
UPCONXTemp[PNum] = UPCONX;
|
||||
UPINRQXTemp[PNum] = UPINRQX;
|
||||
UPIENXTemp[PNum] = UPIENX;
|
||||
}
|
||||
|
||||
UPCFG0XTemp[Number] = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
||||
UPCFG1XTemp[Number] = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
||||
UPCFG2XTemp[Number] = 0;
|
||||
UPCONXTemp[Number] = (1 << INMODE);
|
||||
UPINRQXTemp[Number] = 0;
|
||||
UPIENXTemp[Number] = 0;
|
||||
|
||||
for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
|
||||
{
|
||||
Pipe_SelectPipe(PNum);
|
||||
UPIENX = 0;
|
||||
UPINTX = 0;
|
||||
UPCFG1X = 0;
|
||||
Pipe_DisablePipe();
|
||||
}
|
||||
|
||||
for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
|
||||
{
|
||||
if (!(UPCFG1XTemp[PNum] & (1 << ALLOC)))
|
||||
continue;
|
||||
|
||||
Pipe_SelectPipe(PNum);
|
||||
Pipe_EnablePipe();
|
||||
|
||||
UPCFG0X = UPCFG0XTemp[PNum];
|
||||
UPCFG1X = UPCFG1XTemp[PNum];
|
||||
UPCFG2X = UPCFG2XTemp[PNum];
|
||||
UPCONX |= UPCONXTemp[PNum];
|
||||
UPINRQX = UPINRQXTemp[PNum];
|
||||
UPIENX = UPIENXTemp[PNum];
|
||||
|
||||
if (!(Pipe_IsConfigured()))
|
||||
return false;
|
||||
}
|
||||
|
||||
Pipe_SelectPipe(Number);
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
void Pipe_ClearPipes(void)
|
||||
|
|
|
@ -861,7 +861,8 @@
|
|||
* uses more USB DPRAM, but offers better performance. Isochronous type pipes <b>must</b>
|
||||
* have at least two banks.
|
||||
*
|
||||
* \note Endpoints <b>must</b> be configured in ascending order, or bank corruption will occur.
|
||||
* \note When the ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
|
||||
* or bank corruption will occur.
|
||||
* \n\n
|
||||
*
|
||||
* \note Certain models of USB AVR's pipes may have different maximum packet sizes based on the pipe's
|
||||
|
|
|
@ -152,6 +152,7 @@ void USB_ResetInterface(void)
|
|||
{
|
||||
#if defined(USB_CAN_BE_HOST)
|
||||
UHWCON &= ~(1 << UIMOD);
|
||||
|
||||
USB_Init_Host();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
* <b>New:</b>
|
||||
* - Core:
|
||||
* - Added new MIDIToneGenerator project
|
||||
* - Added new ORDERED_EP_CONFIG compile time option to restrict endpoint/pipe configuration to ascending order
|
||||
* in exchange for a smaller compiled program binary size
|
||||
* - Library Applications:
|
||||
* - Added new incomplete MIDIToneGenerator project
|
||||
* - Added ability to write protect Mass Storage disk write operations from the host OS
|
||||
|
@ -17,6 +19,7 @@
|
|||
*
|
||||
* <b>Changed:</b>
|
||||
* - Core:
|
||||
* - Unordered Endpoint/Pipe configuration is now allowed once again via the previous reconfig workaround
|
||||
* - Refactored Host mode Class Driver *_Host_ConfigurePipes() routines to be more space efficient when compiled
|
||||
* - Added new *_ENUMERROR_PipeConfigurationFailed error codes for the *_Host_ConfigurePipes() routines
|
||||
* - Library Applications:
|
||||
|
|
|
@ -77,6 +77,11 @@
|
|||
* \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.
|
||||
*
|
||||
* <b>ORDERED_EP_CONFIG</b> - ( \ref Group_EndpointManagement , \ref Group_PipeManagement )\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
|
||||
* prevent data corruption issues. However, by default LUFA employs a workaround to allow for unordered Endpoint/Pipe initialisation. This compile
|
||||
* time token may be used to restrict the intialisation order to ascending indexes only in exchange for a smaller compiled binary size.
|
||||
*
|
||||
* <b>NO_STREAM_CALLBACKS</b> - ( \ref Group_EndpointPacketManagement , \ref Group_PipePacketManagement )\n
|
||||
* Both the endpoint and the pipe driver code contains stream functions, allowing for arrays of data to be sent to or from the
|
||||
* host easily via a single function call (rather than complex routines worrying about sending full packets, waiting for the endpoint/
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
* -# Re-add interrupt Pipe/Endpoint support
|
||||
* -# Add HID report macros to make HID report editing easier
|
||||
* -# Investigate dynamically created device descriptors
|
||||
* -# Check if ALL the workaround reg save/restore code in the unordered EP config is required
|
||||
* - Documentation/Support
|
||||
* -# Add detailed overviews of how each demo works
|
||||
* -# Add board overviews
|
||||
|
|
|
@ -11,7 +11,11 @@
|
|||
* areas relevant to making older projects compatible with the API changes of each new release.
|
||||
*
|
||||
* \section Sec_MigrationXXXXXX Migrating from 101122 to XXXXXX
|
||||
* None yet.
|
||||
* <b>USB Core</b>
|
||||
* - By default, unordered Endpoint and Pipe configuration is now allowed once again, via the previous workaround of
|
||||
* reconfiguring all Endpoints/Pipes in order each time a new Endpoint/Pipe is created. To minimise the compiled program
|
||||
* size, the new ORDERED_EP_CONFIG compile time option may be defined in the project makefile to restrict the ordering
|
||||
* in exchange for a smaller compiled binary size.
|
||||
*
|
||||
* \section Sec_Migration101122 Migrating from 100807 to 101122
|
||||
* <b>USB Core</b>
|
||||
|
|
Loading…
Reference in New Issue