Minor corrections to the XMEGA USB controller implementation.
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 4 Feb 2012 22:16:34 +0000 (22:16 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 4 Feb 2012 22:16:34 +0000 (22:16 +0000)
LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c
LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c

index e737814..f67a0ff 100644 (file)
 uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
 #endif
 
-Endpoint_FIFOPair_t           USB_Endpoint_FIFOs[ENDPOINT_DETAILS_MAXEP];
+Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS];
 
-volatile uint8_t              USB_Endpoint_SelectedEndpoint;
-volatile USB_EP_t*            USB_Endpoint_SelectedHandle;
+volatile uint8_t          USB_Endpoint_SelectedEndpoint;
+volatile USB_EP_t*        USB_Endpoint_SelectedHandle;
 volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO;
 
 bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Number,
@@ -66,8 +66,11 @@ bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Number,
 
 void Endpoint_ClearEndpoints(void)
 {
-       for (uint8_t EPNum = 0; EPNum < (ENDPOINT_TOTAL_ENDPOINTS * 2); EPNum++)
-         ((USB_EP_t*)&USB_EndpointTable)[EPNum].CTRL = 0;
+       for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+       {
+               USB_EndpointTable.Endpoints[EPNum].IN.CTRL  = 0;
+               USB_EndpointTable.Endpoints[EPNum].OUT.CTRL = 0;
+       }
 }
 
 void Endpoint_ClearStatusStage(void)
index 495aa97..49069d8 100644 (file)
                        static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
                        static inline bool Endpoint_IsReadWriteAllowed(void)
                        {
-                               return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length);
+                               if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN)
+                                 return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length);
+                               else
+                                 return (USB_Endpoint_SelectedFIFO->Position > 0);
                        }
 
                        /** Determines if the currently selected endpoint is configured.
index 55d137b..3d4151b 100644 (file)
@@ -35,6 +35,8 @@ uint8_t TEMPLATE_FUNC_NAME (void* const Buffer,
 {
        uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
 
+       Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
+
        if (!(Length))
          Endpoint_ClearOUT();
 
index 36685f0..e518069 100644 (file)
@@ -36,6 +36,8 @@ uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
        uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
        bool     LastPacketFull = false;
 
+       Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
+
        if (Length > USB_ControlRequest.wLength)
          Length = USB_ControlRequest.wLength;
        else if (!(Length))