forked from mfulz_github/qmk_firmware
Much more efficient algorithm for the Endpoint/Pipe configuration routine of unordered endpoints/pipes - only reconfigure the endpoints and pipes above the newly configured endpoint/pipe, and don't cache existing endpoint/pipe configuration before use to save SRAM.
This commit is contained in:
parent
5489af7fa0
commit
bfa622d27e
|
@ -52,46 +52,41 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
|
||||||
UECFG1X = UECFG1XData;
|
UECFG1X = UECFG1XData;
|
||||||
|
|
||||||
return Endpoint_IsConfigured();
|
return Endpoint_IsConfigured();
|
||||||
#else
|
#else
|
||||||
uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS];
|
for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
||||||
uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS];
|
|
||||||
uint8_t UEIENXTemp[ENDPOINT_TOTAL_ENDPOINTS];
|
|
||||||
|
|
||||||
for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
|
||||||
{
|
{
|
||||||
|
uint8_t UECFG0XTemp;
|
||||||
|
uint8_t UECFG1XTemp;
|
||||||
|
uint8_t UEIENXTemp;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(EPNum);
|
Endpoint_SelectEndpoint(EPNum);
|
||||||
UECFG0XTemp[EPNum] = UECFG0X;
|
|
||||||
UECFG1XTemp[EPNum] = UECFG1X;
|
if (EPNum == Number)
|
||||||
UEIENXTemp[EPNum] = UEIENX;
|
{
|
||||||
}
|
UECFG0XTemp = UECFG0XData;
|
||||||
|
UECFG1XTemp = UECFG1XData;
|
||||||
UECFG0XTemp[Number] = UECFG0XData;
|
UEIENXTemp = 0;
|
||||||
UECFG1XTemp[Number] = UECFG1XData;
|
}
|
||||||
UEIENXTemp[Number] = 0;
|
else
|
||||||
|
{
|
||||||
for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
UECFG0XTemp = UECFG0X;
|
||||||
{
|
UECFG1XTemp = UECFG1X;
|
||||||
Endpoint_SelectEndpoint(EPNum);
|
UEIENXTemp = UEIENX;
|
||||||
UEIENX = 0;
|
}
|
||||||
UEINTX = 0;
|
|
||||||
UECFG1X = 0;
|
|
||||||
Endpoint_DisableEndpoint();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
|
if (!(UECFG1XTemp & (1 << ALLOC)))
|
||||||
{
|
|
||||||
if (!(UECFG1XTemp[EPNum] & (1 << ALLOC)))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(EPNum);
|
|
||||||
Endpoint_EnableEndpoint();
|
|
||||||
|
|
||||||
UECFG0X = UECFG0XTemp[EPNum];
|
Endpoint_DisableEndpoint();
|
||||||
UECFG1X = UECFG1XTemp[EPNum];
|
UECFG1X &= (1 << ALLOC);
|
||||||
UEIENX = UEIENXTemp[EPNum];
|
|
||||||
|
Endpoint_EnableEndpoint();
|
||||||
|
UECFG0X = UECFG0XTemp;
|
||||||
|
UECFG1X = UECFG1XTemp;
|
||||||
|
UEIENX = UEIENXTemp;
|
||||||
|
|
||||||
if (!(Endpoint_IsConfigured()))
|
if (!(Endpoint_IsConfigured()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Endpoint_SelectEndpoint(Number);
|
Endpoint_SelectEndpoint(Number);
|
||||||
|
|
|
@ -56,58 +56,53 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
|
||||||
Pipe_SetInfiniteINRequests();
|
Pipe_SetInfiniteINRequests();
|
||||||
|
|
||||||
return Pipe_IsConfigured();
|
return Pipe_IsConfigured();
|
||||||
#else
|
#else
|
||||||
uint8_t UPCFG0XTemp[PIPE_TOTAL_PIPES];
|
for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
|
||||||
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);
|
uint8_t UPCFG0XTemp;
|
||||||
UPCFG0XTemp[PNum] = UPCFG0X;
|
uint8_t UPCFG1XTemp;
|
||||||
UPCFG1XTemp[PNum] = UPCFG1X;
|
uint8_t UPCFG2XTemp;
|
||||||
UPCFG2XTemp[PNum] = UPCFG2X;
|
uint8_t UPCONXTemp;
|
||||||
UPCONXTemp[PNum] = UPCONX;
|
uint8_t UPINRQXTemp;
|
||||||
UPINRQXTemp[PNum] = UPINRQX;
|
uint8_t UPIENXTemp;
|
||||||
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++)
|
Pipe_SelectPipe(PNum);
|
||||||
{
|
|
||||||
if (!(UPCFG1XTemp[PNum] & (1 << ALLOC)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Pipe_SelectPipe(PNum);
|
if (PNum == Number)
|
||||||
Pipe_EnablePipe();
|
{
|
||||||
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
||||||
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
||||||
|
UPCFG2XTemp = 0;
|
||||||
|
UPCONXTemp = ((1 << PEN) | (1 << INMODE));
|
||||||
|
UPINRQXTemp = 0;
|
||||||
|
UPIENXTemp = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UPCFG0XTemp = UPCFG0X;
|
||||||
|
UPCFG1XTemp = UPCFG1X;
|
||||||
|
UPCFG2XTemp = UPCFG2X;
|
||||||
|
UPCONXTemp = UPCONX;
|
||||||
|
UPINRQXTemp = UPINRQX;
|
||||||
|
UPIENXTemp = UPIENX;
|
||||||
|
}
|
||||||
|
|
||||||
UPCFG0X = UPCFG0XTemp[PNum];
|
if (!(UPCFG1XTemp & (1 << ALLOC)))
|
||||||
UPCFG1X = UPCFG1XTemp[PNum];
|
continue;
|
||||||
UPCFG2X = UPCFG2XTemp[PNum];
|
|
||||||
UPCONX |= UPCONXTemp[PNum];
|
Pipe_DisablePipe();
|
||||||
UPINRQX = UPINRQXTemp[PNum];
|
UPCFG1X &= (1 << ALLOC);
|
||||||
UPIENX = UPIENXTemp[PNum];
|
|
||||||
|
Pipe_EnablePipe();
|
||||||
|
UPCFG0X = UPCFG0XTemp;
|
||||||
|
UPCFG1X = UPCFG1XTemp;
|
||||||
|
UPCFG2X = UPCFG2XTemp;
|
||||||
|
UPCONX = UPCONXTemp;
|
||||||
|
UPINRQX = UPINRQXTemp;
|
||||||
|
UPIENX = UPIENXTemp;
|
||||||
|
|
||||||
if (!(Pipe_IsConfigured()))
|
if (!(Pipe_IsConfigured()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe_SelectPipe(Number);
|
Pipe_SelectPipe(Number);
|
||||||
|
|
Loading…
Reference in New Issue