Re-add in old Endpoint/Pipe workaround for unordered pipes - add new ORDERED_EP_CONFI...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.c
index a7b1e4b..56c73fc 100644 (file)
@@ -43,6 +43,7 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
                                     const uint8_t UECFG0XData,
                                     const uint8_t UECFG1XData)
 {
+#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
        Endpoint_SelectEndpoint(Number);
        Endpoint_EnableEndpoint();
 
@@ -51,6 +52,51 @@ 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++)
+       {
+               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();
+       }
+
+       for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+       {
+               if (!(UECFG1XTemp[EPNum] & (1 << ALLOC)))
+                 continue;
+               
+               Endpoint_SelectEndpoint(EPNum);         
+               Endpoint_EnableEndpoint();
+
+               UECFG0X = UECFG0XTemp[EPNum];
+               UECFG1X = UECFG1XTemp[EPNum];
+               UEIENX  = UEIENXTemp[EPNum];
+               
+               if (!(Endpoint_IsConfigured()))
+                 return false;
+       }
+       
+       Endpoint_SelectEndpoint(Number);
+       return true;
+#endif
 }
 
 void Endpoint_ClearEndpoints(void)