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.

pull/1469/head
Dean Camera 12 years ago
parent e225de8a83
commit 44aea22949

@ -25,6 +25,8 @@
* - Core: * - Core:
* - Fixed inverted LEDs_GetLEDs() function implementation for the Benito, Minimus and Arduino UNO boards * - 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 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: * - Library Applications:
* - Fixed broken RESET_TOGGLES_LIBUSB_COMPAT compile time option in the AVRISP-MKII project * - 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) * - Fixed incompatibility in the CDC class bootloader on some systems (thanks to Sylvain Munaut)

@ -35,7 +35,7 @@
#define __INCLUDE_FROM_USB_CONTROLLER_C #define __INCLUDE_FROM_USB_CONTROLLER_C
#include "../USBController.h" #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; volatile uint8_t USB_CurrentMode = USB_MODE_None;
#endif #endif

@ -211,8 +211,10 @@
* Calling this function when the USB interface is already initialized will cause a complete USB * Calling this function when the USB interface is already initialized will cause a complete USB
* interface reset and re-enumeration. * 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. * 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 * \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 * interface to control the USB interface's behavior. This should be comprised of
@ -267,7 +269,7 @@
void USB_ResetInterface(void); void USB_ResetInterface(void);
/* Global Variables: */ /* 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 /** Indicates the mode that the USB interface is currently initialized to, a value from the
* \ref USB_Modes_t enum. * \ref USB_Modes_t enum.
* *
@ -282,9 +284,9 @@
* USB interface is not initialized. * USB interface is not initialized.
*/ */
extern volatile uint8_t USB_CurrentMode; extern volatile uint8_t USB_CurrentMode;
#elif defined(USB_HOST_ONLY) #elif defined(USB_CAN_BE_HOST)
#define USB_CurrentMode USB_MODE_Host #define USB_CurrentMode USB_MODE_Host
#elif defined(USB_DEVICE_ONLY) #elif defined(USB_CAN_BE_DEVICE)
#define USB_CurrentMode USB_MODE_Device #define USB_CurrentMode USB_MODE_Device
#endif #endif

@ -156,6 +156,12 @@
* This event is time-critical; exceeding OS-specific delays within this event handler (typically of around * 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 * 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. * 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); void EVENT_USB_Host_DeviceEnumerationComplete(void);

@ -35,7 +35,7 @@
#define __INCLUDE_FROM_USB_CONTROLLER_C #define __INCLUDE_FROM_USB_CONTROLLER_C
#include "../USBController.h" #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; volatile uint8_t USB_CurrentMode = USB_MODE_None;
#endif #endif

@ -178,8 +178,10 @@
* Calling this function when the USB interface is already initialized will cause a complete USB * Calling this function when the USB interface is already initialized will cause a complete USB
* interface reset and re-enumeration. * 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. * 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 * \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 * interface to control the USB interface's behavior. This should be comprised of
@ -230,7 +232,7 @@
void USB_ResetInterface(void); void USB_ResetInterface(void);
/* Global Variables: */ /* 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 /** Indicates the mode that the USB interface is currently initialized to, a value from the
* \ref USB_Modes_t enum. * \ref USB_Modes_t enum.
* *
@ -245,9 +247,9 @@
* USB interface is not initialized. * USB interface is not initialized.
*/ */
extern volatile uint8_t USB_CurrentMode; extern volatile uint8_t USB_CurrentMode;
#elif defined(USB_HOST_ONLY) #elif defined(USB_CAN_BE_HOST)
#define USB_CurrentMode USB_MODE_Host #define USB_CurrentMode USB_MODE_Host
#elif defined(USB_DEVICE_ONLY) #elif defined(USB_CAN_BE_DEVICE)
#define USB_CurrentMode USB_MODE_Device #define USB_CurrentMode USB_MODE_Device
#endif #endif

@ -244,34 +244,28 @@
#define USB_CAN_BE_DEVICE #define USB_CAN_BE_DEVICE
#endif #endif
#if (defined(USB_CAN_BE_DEVICE) && defined(USB_CAN_BE_HOST)) #if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY))
#define USB_CAN_BE_BOTH #error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive.
#endif #elif defined(USB_HOST_ONLY)
#if defined(USB_HOST_ONLY)
#if !defined(USB_CAN_BE_HOST) #if !defined(USB_CAN_BE_HOST)
#error USB_HOST_ONLY is not available for the currently selected microcontroller model. #error USB_HOST_ONLY is not available for the currently selected microcontroller model.
#else #else
#undef USB_CAN_BE_DEVICE #undef USB_CAN_BE_DEVICE
#undef USB_CAN_BE_BOTH
#endif #endif
#endif #elif defined(USB_DEVICE_ONLY)
#if defined(USB_DEVICE_ONLY)
#if !defined(USB_CAN_BE_DEVICE) #if !defined(USB_CAN_BE_DEVICE)
#error USB_DEVICE_ONLY is not available for the currently selected microcontroller model. #error USB_DEVICE_ONLY is not available for the currently selected microcontroller model.
#else #else
#undef USB_CAN_BE_HOST #undef USB_CAN_BE_HOST
#undef USB_CAN_BE_BOTH
#endif #endif
#endif #endif
#if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY)) #if (defined(USB_CAN_BE_DEVICE) && defined(USB_CAN_BE_HOST))
#error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive. #define USB_CAN_BE_BOTH
#endif #endif
#if (!defined(USB_CAN_BE_DEVICE) && !defined(USB_CAN_BE_HOST)) #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
#endif #endif

@ -45,17 +45,15 @@ volatile uint8_t USB_DeviceState;
void USB_USBTask(void) void USB_USBTask(void)
{ {
#if defined(USB_HOST_ONLY) #if defined(USB_CAN_BE_BOTH)
USB_HostTask();
#elif defined(USB_DEVICE_ONLY)
USB_DeviceTask();
#else
if (USB_CurrentMode == USB_MODE_Device) if (USB_CurrentMode == USB_MODE_Device)
USB_DeviceTask(); USB_DeviceTask();
#if defined(USB_CAN_BE_HOST)
else if (USB_CurrentMode == USB_MODE_Host) else if (USB_CurrentMode == USB_MODE_Host)
USB_HostTask(); USB_HostTask();
#endif #elif defined(USB_CAN_BE_HOST)
USB_HostTask();
#elif defined(USB_CAN_BE_DEVICE)
USB_DeviceTask();
#endif #endif
} }

@ -35,7 +35,7 @@
#define __INCLUDE_FROM_USB_CONTROLLER_C #define __INCLUDE_FROM_USB_CONTROLLER_C
#include "../USBController.h" #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; volatile uint8_t USB_CurrentMode = USB_MODE_None;
#endif #endif
@ -43,7 +43,7 @@ volatile uint8_t USB_CurrentMode = USB_MODE_None;
volatile uint8_t USB_Options; volatile uint8_t USB_Options;
#endif #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]; uint8_t USB_EndpointTable[sizeof(USB_EndpointTable_t) + 1];
void USB_Init( void USB_Init(
@ -66,8 +66,6 @@ void USB_Init(
USB_Options = Options; USB_Options = Options;
#endif #endif
USB_IsInitialized = true;
uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
GlobalInterruptDisable(); GlobalInterruptDisable();
@ -89,6 +87,12 @@ void USB_Init(
SetGlobalInterruptMask(CurrentGlobalInt); SetGlobalInterruptMask(CurrentGlobalInt);
#if defined(USB_CAN_BE_BOTH)
USB_CurrentMode = Mode;
#endif
USB_IsInitialized = true;
USB_ResetInterface(); USB_ResetInterface();
} }

@ -70,7 +70,6 @@
/* External Variables: */ /* External Variables: */
extern uint8_t USB_EndpointTable[]; extern uint8_t USB_EndpointTable[];
#endif #endif
/* Includes: */ /* Includes: */
@ -176,8 +175,10 @@
* Calling this function when the USB interface is already initialized will cause a complete USB * Calling this function when the USB interface is already initialized will cause a complete USB
* interface reset and re-enumeration. * 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. * 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 * \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 * interface to control the USB interface's behavior. This should be comprised of
@ -232,7 +233,7 @@
void USB_ResetInterface(void); void USB_ResetInterface(void);
/* Global Variables: */ /* 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 /** Indicates the mode that the USB interface is currently initialized to, a value from the
* \ref USB_Modes_t enum. * \ref USB_Modes_t enum.
* *
@ -247,7 +248,9 @@
* USB interface is not initialized. * USB interface is not initialized.
*/ */
extern volatile uint8_t USB_CurrentMode; 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 #define USB_CurrentMode USB_MODE_Device
#endif #endif

Loading…
Cancel
Save