Add DEVICE_STATE_AS_GPIOR=0 compile time option to the library projects, to reduce...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.c
index c0e6392..56c73fc 100644 (file)
@@ -3,7 +3,7 @@
      Copyright (C) Dean Camera, 2010.
 
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
@@ -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)