diff options
Diffstat (limited to 'LUFA/Drivers/USB/LowLevel/Endpoint.c')
-rw-r--r-- | LUFA/Drivers/USB/LowLevel/Endpoint.c | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c index ee3f9d640..57c613a1f 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.c +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c @@ -44,21 +44,49 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData) { - Endpoint_SelectEndpoint(Number); - Endpoint_EnableEndpoint(); - - UECFG1X = 0; + uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS]; + uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS]; + + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + Endpoint_SelectEndpoint(EPNum); + UECFG0XTemp[EPNum] = UECFG0X; + UECFG1XTemp[EPNum] = UECFG1X; + } + + UECFG0XTemp[Number] = UECFG0XData; + UECFG1XTemp[Number] = UECFG1XData; + + for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + Endpoint_SelectEndpoint(EPNum); + UEIENX = 0; + UEINTX = 0; + UECFG1X = 0; + Endpoint_DisableEndpoint(); + } - UECFG0X = UECFG0XData; - UECFG1X = UECFG1XData; + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + if (!(UECFG1XTemp[EPNum] & (1 << ALLOC))) + continue; + + Endpoint_SelectEndpoint(EPNum); + Endpoint_EnableEndpoint(); - return Endpoint_IsConfigured(); + UECFG0X = UECFG0XTemp[EPNum]; + UECFG1X = UECFG1XTemp[EPNum]; + + if (!(Endpoint_IsConfigured())) + return false; + } + + Endpoint_SelectEndpoint(Number); + return true; } void Endpoint_ClearEndpoints(void) { - UEINT = 0; - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { Endpoint_SelectEndpoint(EPNum); |