Minor corrections for the XMEGA USB controller. Add compile time warning if the USB...
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 14 Nov 2011 07:31:40 +0000 (07:31 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 14 Nov 2011 07:31:40 +0000 (07:31 +0000)
LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h

index 49bc1f2..f587fec 100644 (file)
                                                                      const uint8_t Banks)
                        {
                                uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | Banks | Endpoint_BytesToEPSizeMask(Size));
+                               
+                               // TODO - Fix once limitations are lifted
+                               if ((Banks != ENDPOINT_BANK_SINGLE) || (Size > 64))
+                                 return false;
 
                                switch (Type)
                                {
                                if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm)
                                {
                                        USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT;
-                                       return true;                            
+                                       return true;
                                }
                        
                                return false;
                        static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
                        static inline void Endpoint_ClearSETUP(void)
                        {
+                               Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
                                USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
-
                                USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm;
                                USB_Endpoint_SelectedFIFO->Position  = 0;
 
                                if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc)
                                {
                                        Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint |  ENDPOINT_DIR_IN);
-                                       USB_Endpoint_SelectedHandle->STATUS |= USB_EP_STALL_bm;
+                                       USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm;
                                        Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
                                }
                        }
                        static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
                        static inline bool Endpoint_IsStalled(void)
                        {
-                               return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_STALLF_bm) ? true : false);
+                               return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false);
                        }
 
                        /** Resets the data toggle of the currently selected endpoint. */
index 0d39258..2c31697 100644 (file)
                #if !defined(F_USB)
                        #error F_USB is not defined. You must define F_USB to the frequency of the unprescaled USB controller clock in your project makefile.
                #endif
+               
+               #if (F_USB % 6000000)
+                       #error Invalid F_USB specified. F_USB must be a multiple of 6MHz for USB Low Speed operation, and a multiple of 48MHz for Full Speed operation.
+               #endif
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */