aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-12-24 18:06:55 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-12-24 18:06:55 +0000
commitbfa622d27e95f391a4e7ea256a5162075dac18e0 (patch)
tree0aaed739c92766feec699bd6879a7f487f820248 /LUFA
parent5489af7fa0adde393edcdc6f325cce8032a163f8 (diff)
downloadlufa-bfa622d27e95f391a4e7ea256a5162075dac18e0.tar.gz
lufa-bfa622d27e95f391a4e7ea256a5162075dac18e0.tar.bz2
lufa-bfa622d27e95f391a4e7ea256a5162075dac18e0.zip
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.
Diffstat (limited to 'LUFA')
-rw-r--r--LUFA/Drivers/USB/LowLevel/Endpoint.c63
-rw-r--r--LUFA/Drivers/USB/LowLevel/Pipe.c85
2 files changed, 69 insertions, 79 deletions
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c
index 56c73fc48..9d13eadb9 100644
--- a/LUFA/Drivers/USB/LowLevel/Endpoint.c
+++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c
@@ -52,46 +52,41 @@ 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++)
+#else
+ for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
{
+ uint8_t UECFG0XTemp;
+ uint8_t UECFG1XTemp;
+ uint8_t UEIENXTemp;
+
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();
- }
+
+ if (EPNum == Number)
+ {
+ UECFG0XTemp = UECFG0XData;
+ UECFG1XTemp = UECFG1XData;
+ UEIENXTemp = 0;
+ }
+ else
+ {
+ UECFG0XTemp = UECFG0X;
+ UECFG1XTemp = UECFG1X;
+ UEIENXTemp = UEIENX;
+ }
- for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
- {
- if (!(UECFG1XTemp[EPNum] & (1 << ALLOC)))
+ if (!(UECFG1XTemp & (1 << ALLOC)))
continue;
-
- Endpoint_SelectEndpoint(EPNum);
- Endpoint_EnableEndpoint();
- UECFG0X = UECFG0XTemp[EPNum];
- UECFG1X = UECFG1XTemp[EPNum];
- UEIENX = UEIENXTemp[EPNum];
-
+ Endpoint_DisableEndpoint();
+ UECFG1X &= (1 << ALLOC);
+
+ Endpoint_EnableEndpoint();
+ UECFG0X = UECFG0XTemp;
+ UECFG1X = UECFG1XTemp;
+ UEIENX = UEIENXTemp;
+
if (!(Endpoint_IsConfigured()))
- return false;
+ return false;
}
Endpoint_SelectEndpoint(Number);
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c
index fc50060be..9f2b007b7 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.c
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.c
@@ -56,58 +56,53 @@ 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++)
+#else
+ for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
{
+ uint8_t UPCFG0XTemp;
+ uint8_t UPCFG1XTemp;
+ uint8_t UPCFG2XTemp;
+ uint8_t UPCONXTemp;
+ uint8_t UPINRQXTemp;
+ uint8_t UPIENXTemp;
+
Pipe_SelectPipe(PNum);
- UPIENX = 0;
- UPINTX = 0;
- UPCFG1X = 0;
- Pipe_DisablePipe();
- }
+
+ if (PNum == Number)
+ {
+ 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;
+ }
- for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
- {
- if (!(UPCFG1XTemp[PNum] & (1 << ALLOC)))
+ if (!(UPCFG1XTemp & (1 << ALLOC)))
continue;
-
- Pipe_SelectPipe(PNum);
- Pipe_EnablePipe();
+
+ Pipe_DisablePipe();
+ UPCFG1X &= (1 << ALLOC);
- UPCFG0X = UPCFG0XTemp[PNum];
- UPCFG1X = UPCFG1XTemp[PNum];
- UPCFG2X = UPCFG2XTemp[PNum];
- UPCONX |= UPCONXTemp[PNum];
- UPINRQX = UPINRQXTemp[PNum];
- UPIENX = UPIENXTemp[PNum];
+ Pipe_EnablePipe();
+ UPCFG0X = UPCFG0XTemp;
+ UPCFG1X = UPCFG1XTemp;
+ UPCFG2X = UPCFG2XTemp;
+ UPCONX = UPCONXTemp;
+ UPINRQX = UPINRQXTemp;
+ UPIENX = UPIENXTemp;
if (!(Pipe_IsConfigured()))
- return false;
+ return false;
}
Pipe_SelectPipe(Number);