Fix low level host mode demos not correctly fetching the next endpoint when an invali...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.c
index 742e618..fc54e11 100644 (file)
@@ -43,45 +43,14 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
                                     const uint8_t UECFG0XData,
                                     const uint8_t UECFG1XData)
 {
-       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();
-       }
+       Endpoint_SelectEndpoint(Number);
+       Endpoint_EnableEndpoint();
 
-       for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
-       {
-               if (!(UECFG1XTemp[EPNum] & (1 << ALLOC)))
-                 continue;
-               
-               Endpoint_SelectEndpoint(EPNum);         
-               Endpoint_EnableEndpoint();
+       UECFG1X = 0;
+       UECFG0X = UECFG0XData;
+       UECFG1X = UECFG1XData;
 
-               UECFG0X = UECFG0XTemp[EPNum];
-               UECFG1X = UECFG1XTemp[EPNum];
-               
-               if (!(Endpoint_IsConfigured()))
-                 return false;
-       }
-       
-       Endpoint_SelectEndpoint(Number);
-       return true;
+       return Endpoint_IsConfigured();
 }
 
 void Endpoint_ClearEndpoints(void)
@@ -131,6 +100,8 @@ uint8_t Endpoint_WaitUntilReady(void)
        uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
        #endif
 
+       uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
+
        for (;;)
        {
                if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
@@ -150,10 +121,12 @@ uint8_t Endpoint_WaitUntilReady(void)
                  return ENDPOINT_READYWAIT_BusSuspended;
                else if (Endpoint_IsStalled())
                  return ENDPOINT_READYWAIT_EndpointStalled;
-                         
-               if (USB_INT_HasOccurred(USB_INT_SOFI))
+
+               uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
+
+               if (CurrentFrameNumber != PreviousFrameNumber)
                {
-                       USB_INT_Clear(USB_INT_SOFI);
+                       PreviousFrameNumber = CurrentFrameNumber;
 
                        if (!(TimeoutMSRem--))
                          return ENDPOINT_READYWAIT_Timeout;