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.

pull/1469/head
Dean Camera 14 years ago
parent 5489af7fa0
commit bfa622d27e

@ -53,42 +53,37 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
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++)
{ {
Endpoint_SelectEndpoint(EPNum); uint8_t UECFG0XTemp;
UECFG0XTemp[EPNum] = UECFG0X; uint8_t UECFG1XTemp;
UECFG1XTemp[EPNum] = UECFG1X; uint8_t UEIENXTemp;
UEIENXTemp[EPNum] = UEIENX;
}
UECFG0XTemp[Number] = UECFG0XData; Endpoint_SelectEndpoint(EPNum);
UECFG1XTemp[Number] = UECFG1XData;
UEIENXTemp[Number] = 0;
for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) if (EPNum == Number)
{ {
Endpoint_SelectEndpoint(EPNum); UECFG0XTemp = UECFG0XData;
UEIENX = 0; UECFG1XTemp = UECFG1XData;
UEINTX = 0; UEIENXTemp = 0;
UECFG1X = 0;
Endpoint_DisableEndpoint();
} }
else
for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
{ {
if (!(UECFG1XTemp[EPNum] & (1 << ALLOC))) UECFG0XTemp = UECFG0X;
UECFG1XTemp = UECFG1X;
UEIENXTemp = UEIENX;
}
if (!(UECFG1XTemp & (1 << ALLOC)))
continue; continue;
Endpoint_SelectEndpoint(EPNum); Endpoint_DisableEndpoint();
Endpoint_EnableEndpoint(); UECFG1X &= (1 << ALLOC);
UECFG0X = UECFG0XTemp[EPNum]; Endpoint_EnableEndpoint();
UECFG1X = UECFG1XTemp[EPNum]; UECFG0X = UECFG0XTemp;
UEIENX = UEIENXTemp[EPNum]; UECFG1X = UECFG1XTemp;
UEIENX = UEIENXTemp;
if (!(Endpoint_IsConfigured())) if (!(Endpoint_IsConfigured()))
return false; return false;

@ -57,54 +57,49 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
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)); Pipe_SelectPipe(PNum);
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++) if (PNum == Number)
{ {
Pipe_SelectPipe(PNum); UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
UPIENX = 0; UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
UPINTX = 0; UPCFG2XTemp = 0;
UPCFG1X = 0; UPCONXTemp = ((1 << PEN) | (1 << INMODE));
Pipe_DisablePipe(); UPINRQXTemp = 0;
UPIENXTemp = 0;
} }
else
for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
{ {
if (!(UPCFG1XTemp[PNum] & (1 << ALLOC))) UPCFG0XTemp = UPCFG0X;
UPCFG1XTemp = UPCFG1X;
UPCFG2XTemp = UPCFG2X;
UPCONXTemp = UPCONX;
UPINRQXTemp = UPINRQX;
UPIENXTemp = UPIENX;
}
if (!(UPCFG1XTemp & (1 << ALLOC)))
continue; continue;
Pipe_SelectPipe(PNum); Pipe_DisablePipe();
Pipe_EnablePipe(); UPCFG1X &= (1 << ALLOC);
UPCFG0X = UPCFG0XTemp[PNum]; Pipe_EnablePipe();
UPCFG1X = UPCFG1XTemp[PNum]; UPCFG0X = UPCFG0XTemp;
UPCFG2X = UPCFG2XTemp[PNum]; UPCFG1X = UPCFG1XTemp;
UPCONX |= UPCONXTemp[PNum]; UPCFG2X = UPCFG2XTemp;
UPINRQX = UPINRQXTemp[PNum]; UPCONX = UPCONXTemp;
UPIENX = UPIENXTemp[PNum]; UPINRQX = UPINRQXTemp;
UPIENX = UPIENXTemp;
if (!(Pipe_IsConfigured())) if (!(Pipe_IsConfigured()))
return false; return false;

Loading…
Cancel
Save