Fixed logic hole breaking USB operations on a USB controller with only one supported...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 28 Aug 2012 20:09:14 +0000 (20:09 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 28 Aug 2012 20:09:14 +0000 (20:09 +0000)
LUFA/DoxygenPages/ChangeLog.txt
LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h
LUFA/Drivers/USB/Core/Events.h
LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
LUFA/Drivers/USB/Core/USBMode.h
LUFA/Drivers/USB/Core/USBTask.c
LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h

index 62cf1f9..79f96aa 100644 (file)
@@ -25,6 +25,8 @@
   *  - Core:
   *   - Fixed inverted LEDs_GetLEDs() function implementation for the Benito, Minimus and Arduino UNO boards
   *   - Fixed missing Win-32bit compatibility sections in the LUFA INF driver files (thanks to Christan Beharrell)
+  *   - Fixed logic hole breaking USB operations on a USB controller with only one supported USB mode and no USB_DEVICE_ONLY or USB_HOST_ONLY
+  *     configuration token set
   *  - Library Applications:
   *   - Fixed broken RESET_TOGGLES_LIBUSB_COMPAT compile time option in the AVRISP-MKII project
   *   - Fixed incompatibility in the CDC class bootloader on some systems (thanks to Sylvain Munaut)
index 8285f7e..67e14b0 100644 (file)
@@ -35,7 +35,7 @@
 #define  __INCLUDE_FROM_USB_CONTROLLER_C
 #include "../USBController.h"
 
-#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
+#if defined(USB_CAN_BE_BOTH)
 volatile uint8_t USB_CurrentMode = USB_MODE_None;
 #endif
 
index 8106988..817732d 100644 (file)
                         *  Calling this function when the USB interface is already initialized will cause a complete USB
                         *  interface reset and re-enumeration.
                         *
-                        *  \param[in] Mode     This is a mask indicating what mode the USB interface is to be initialized to, a value
+                        *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
                         *                      from the \ref USB_Modes_t enum.
+                        *                      \note This parameter does not exist on devices with only one supported USB
+                        *                            mode (device or host).
                         *
                         *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
                         *                      interface to control the USB interface's behavior. This should be comprised of
                        void USB_ResetInterface(void);
 
                /* Global Variables: */
-                       #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
+                       #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
                                /** Indicates the mode that the USB interface is currently initialized to, a value from the
                                 *  \ref USB_Modes_t enum.
                                 *
                                 *        USB interface is not initialized.
                                 */
                                extern volatile uint8_t USB_CurrentMode;
-                       #elif defined(USB_HOST_ONLY)
+                       #elif defined(USB_CAN_BE_HOST)
                                #define USB_CurrentMode USB_MODE_Host
-                       #elif defined(USB_DEVICE_ONLY)
+                       #elif defined(USB_CAN_BE_DEVICE)
                                #define USB_CurrentMode USB_MODE_Device
                        #endif
 
index f468b7e..192869b 100644 (file)
                         *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
                         *  1 second) when a transaction is waiting to be processed by the device will prevent break communications
                         *  and cause the host to reset the USB bus.
+                        *
+                        *  \note This event only exists on microcontrollers that supports USB host mode.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
                         */
                        void EVENT_USB_Host_DeviceEnumerationComplete(void);
 
index 6a3df6e..159bf71 100644 (file)
@@ -35,7 +35,7 @@
 #define  __INCLUDE_FROM_USB_CONTROLLER_C
 #include "../USBController.h"
 
-#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
+#if defined(USB_CAN_BE_BOTH)
 volatile uint8_t USB_CurrentMode = USB_MODE_None;
 #endif
 
index 006e089..10a7d0d 100644 (file)
                         *  Calling this function when the USB interface is already initialized will cause a complete USB
                         *  interface reset and re-enumeration.
                         *
-                        *  \param[in] Mode     This is a mask indicating what mode the USB interface is to be initialized to, a value
+                        *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
                         *                      from the \ref USB_Modes_t enum.
+                        *                      \note This parameter does not exist on devices with only one supported USB
+                        *                            mode (device or host).
                         *
                         *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
                         *                      interface to control the USB interface's behavior. This should be comprised of
                        void USB_ResetInterface(void);
 
                /* Global Variables: */
-                       #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
+                       #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
                                /** Indicates the mode that the USB interface is currently initialized to, a value from the
                                 *  \ref USB_Modes_t enum.
                                 *
                                 *        USB interface is not initialized.
                                 */
                                extern volatile uint8_t USB_CurrentMode;
-                       #elif defined(USB_HOST_ONLY)
+                       #elif defined(USB_CAN_BE_HOST)
                                #define USB_CurrentMode USB_MODE_Host
-                       #elif defined(USB_DEVICE_ONLY)
+                       #elif defined(USB_CAN_BE_DEVICE)
                                #define USB_CurrentMode USB_MODE_Device
                        #endif
 
index 7ae30bb..5de57ff 100644 (file)
                                #define USB_CAN_BE_DEVICE
                        #endif
 
-                       #if (defined(USB_CAN_BE_DEVICE) && defined(USB_CAN_BE_HOST))
-                               #define USB_CAN_BE_BOTH
-                       #endif
-
-                       #if defined(USB_HOST_ONLY)
+                       #if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY))
+                               #error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive.
+                       #elif defined(USB_HOST_ONLY)
                                #if !defined(USB_CAN_BE_HOST)
                                        #error USB_HOST_ONLY is not available for the currently selected microcontroller model.
                                #else
                                        #undef USB_CAN_BE_DEVICE
-                                       #undef USB_CAN_BE_BOTH
                                #endif
-                       #endif
-
-                       #if defined(USB_DEVICE_ONLY)
+                       #elif defined(USB_DEVICE_ONLY)
                                #if !defined(USB_CAN_BE_DEVICE)
                                        #error USB_DEVICE_ONLY is not available for the currently selected microcontroller model.
                                #else
                                        #undef USB_CAN_BE_HOST
-                                       #undef USB_CAN_BE_BOTH
                                #endif
                        #endif
 
-                       #if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY))
-                               #error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive.
+                       #if (defined(USB_CAN_BE_DEVICE) && defined(USB_CAN_BE_HOST))
+                               #define USB_CAN_BE_BOTH
                        #endif
 
                        #if (!defined(USB_CAN_BE_DEVICE) && !defined(USB_CAN_BE_HOST))
-                               #error The currently selected device or architecture is not supported under the USB component of the library.
+                               #error The currently selected device, USB mode or architecture is not supported.
                        #endif
        #endif
 
index b0b6914..71ae47d 100644 (file)
@@ -45,17 +45,15 @@ volatile uint8_t     USB_DeviceState;
 
 void USB_USBTask(void)
 {
-       #if defined(USB_HOST_ONLY)
-               USB_HostTask();
-       #elif defined(USB_DEVICE_ONLY)
-               USB_DeviceTask();
-       #else
+       #if defined(USB_CAN_BE_BOTH)
                if (USB_CurrentMode == USB_MODE_Device)
                  USB_DeviceTask();
-               #if defined(USB_CAN_BE_HOST)
                else if (USB_CurrentMode == USB_MODE_Host)
                  USB_HostTask();
-               #endif
+       #elif defined(USB_CAN_BE_HOST)
+               USB_HostTask();
+       #elif defined(USB_CAN_BE_DEVICE)
+               USB_DeviceTask();
        #endif
 }
 
index 86df5c8..dde984b 100644 (file)
@@ -35,7 +35,7 @@
 #define  __INCLUDE_FROM_USB_CONTROLLER_C
 #include "../USBController.h"
 
-#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
+#if defined(USB_CAN_BE_BOTH)
 volatile uint8_t USB_CurrentMode = USB_MODE_None;
 #endif
 
@@ -43,7 +43,7 @@ volatile uint8_t USB_CurrentMode = USB_MODE_None;
 volatile uint8_t USB_Options;
 #endif
 
-/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for 8-bit AVR-GCC */
+/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */
 uint8_t USB_EndpointTable[sizeof(USB_EndpointTable_t) + 1];
 
 void USB_Init(
@@ -66,8 +66,6 @@ void USB_Init(
        USB_Options = Options;
        #endif
 
-       USB_IsInitialized = true;
-
        uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
        GlobalInterruptDisable();
 
@@ -89,6 +87,12 @@ void USB_Init(
 
        SetGlobalInterruptMask(CurrentGlobalInt);
 
+       #if defined(USB_CAN_BE_BOTH)
+       USB_CurrentMode = Mode;
+       #endif
+       
+       USB_IsInitialized = true;
+       
        USB_ResetInterface();
 }
 
index e1c782d..8cc9daf 100644 (file)
@@ -70,7 +70,6 @@
 
                /* External Variables: */
                        extern uint8_t USB_EndpointTable[];
-
        #endif
 
        /* Includes: */
                         *  Calling this function when the USB interface is already initialized will cause a complete USB
                         *  interface reset and re-enumeration.
                         *
-                        *  \param[in] Mode     This is a mask indicating what mode the USB interface is to be initialized to, a value
+                        *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
                         *                      from the \ref USB_Modes_t enum.
+                        *                      \note This parameter does not exist on devices with only one supported USB
+                        *                            mode (device or host).
                         *
                         *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
                         *                      interface to control the USB interface's behavior. This should be comprised of
                        void USB_ResetInterface(void);
 
                /* Global Variables: */
-                       #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
+                       #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
                                /** Indicates the mode that the USB interface is currently initialized to, a value from the
                                 *  \ref USB_Modes_t enum.
                                 *
                                 *        USB interface is not initialized.
                                 */
                                extern volatile uint8_t USB_CurrentMode;
-                       #elif defined(USB_DEVICE_ONLY)
+                       #elif defined(USB_CAN_BE_HOST)
+                               #define USB_CurrentMode USB_MODE_Host
+                       #elif defined(USB_CAN_BE_DEVICE)
                                #define USB_CurrentMode USB_MODE_Device
                        #endif