diff options
Diffstat (limited to 'LUFA/Drivers/USB/LowLevel/Pipe.c')
-rw-r--r-- | LUFA/Drivers/USB/LowLevel/Pipe.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c index f70f0184f1..f8cf4f9ba0 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.c +++ b/LUFA/Drivers/USB/LowLevel/Pipe.c @@ -45,17 +45,47 @@ bool Pipe_ConfigurePipe(const uint8_t Number, const uint16_t Size, const uint8_t Banks) { - Pipe_SelectPipe(Number); - Pipe_EnablePipe(); - - UPCFG1X = 0; + uint8_t UPCFG0XTemp[PIPE_TOTAL_PIPES]; + uint8_t UPCFG1XTemp[PIPE_TOTAL_PIPES]; + + for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) + { + Pipe_SelectPipe(PNum); + UPCFG0XTemp[PNum] = UPCFG0X; + UPCFG1XTemp[PNum] = UPCFG1X; + } - UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); - UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + UPCFG0XTemp[Number] = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + UPCFG1XTemp[Number] = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + + for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) + { + Pipe_SelectPipe(PNum); + UPIENX = 0; + UPINTX = 0; + UPCFG1X = 0; + Pipe_DisablePipe(); + } - Pipe_SetInfiniteINRequests(); + for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) + { + if (!(UPCFG1XTemp[PNum] & (1 << ALLOC))) + continue; + + Pipe_SelectPipe(PNum); + Pipe_EnablePipe(); - return Pipe_IsConfigured(); + UPCFG0X = UPCFG0XTemp[PNum]; + UPCFG1X = UPCFG1XTemp[PNum]; + + if (!(Pipe_IsConfigured())) + return false; + } + + Pipe_SelectPipe(Number); + Pipe_SetInfiniteINRequests(); + + return true; } void Pipe_ClearPipes(void) |