Commit 2608fd1d authored by Dean Camera's avatar Dean Camera
Browse files

Fixed hardware race condition that could cause failed device enumerations for...

Fixed hardware race condition that could cause failed device enumerations for AVR8 and UC3 architectures (thanks to Mike Beyhs).

Fixed incorrect Minimus board LED definitions (thanks to Joonas Lahtinen).

Fixed incorrect LED masks for received data display in the Device GenericHID demos (thanks to Denys Berkovskyy).
parent 7d037c7d
......@@ -177,13 +177,13 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI
NewLEDMask |= LEDS_LED1;
if (Data[1])
NewLEDMask |= LEDS_LED1;
NewLEDMask |= LEDS_LED2;
if (Data[2])
NewLEDMask |= LEDS_LED1;
NewLEDMask |= LEDS_LED3;
if (Data[3])
NewLEDMask |= LEDS_LED1;
NewLEDMask |= LEDS_LED4;
LEDs_SetAllLEDs(NewLEDMask);
}
......
......@@ -161,13 +161,13 @@ void ProcessGenericHIDReport(uint8_t* DataArray)
NewLEDMask |= LEDS_LED1;
if (DataArray[1])
NewLEDMask |= LEDS_LED1;
NewLEDMask |= LEDS_LED2;
if (DataArray[2])
NewLEDMask |= LEDS_LED1;
NewLEDMask |= LEDS_LED3;
if (DataArray[3])
NewLEDMask |= LEDS_LED1;
NewLEDMask |= LEDS_LED4;
LEDs_SetAllLEDs(NewLEDMask);
}
......
......@@ -86,7 +86,7 @@
/* Architecture specific utility includes: */
#if defined(__DOXYGEN__)
/** Type define for an unsigned integer the same width as the selected architecture's machine register.
* This is distinct from the non-specific standard int data type, whose width is machine dependent but
* This is distinct from the non-specific standard int data type, whose width is machine dependant but
* which may not reflect the actual machine register width on some targets (e.g. AVR8).
*/
typedef MACHINE_REG_t uint_reg_t;
......@@ -112,7 +112,7 @@
#include <math.h>
// === TODO: Find abstracted way to handle these ===
#define PROGMEM
#define PROGMEM
#define pgm_read_byte(x) *x
#define memcmp_P(...) memcmp(__VA_ARGS__)
#define memcpy_P(...) memcpy(__VA_ARGS__)
......
......@@ -23,7 +23,7 @@
* via a software jump without first turning off the OTG pad (thanks to Simon Inns)
* - Library Applications:
* - Increased throughput in the USBtoSerial project now that data transmission is non-blocking (thanks to Joseph Lacerte)
* - Updated bootloader makefiles to remove dependency on the "bc" command line calculator tool
* - Updated bootloader makefiles to remove dependency on the \c bc command line calculator tool
*
* <b>Fixed:</b>
* - Core:
......@@ -36,11 +36,14 @@
* - Fixed incorrect definitions of \c HID_KEYBOARD_LED_KANA, \c HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN and \c HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400
* and added a missing definition for \c HID_KEYBOARD_SC_APPLICATION (thanks to David Monro)
* - Fixed maximum allowed keyboard key code usage of \c 0x65 rather than \c 0xFF for the \c HID_DESCRIPTOR_KEYBOARD() macro (thanks to David Monro)
* - Fixed hardware race condition that could cause failed device enumerations for AVR8 and UC3 architectures (thanks to Mike Beyhs)
* - Fixed incorrect Minimus board LED definitions (thanks to Joonas Lahtinen)
* - 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)
* - Fixed lengthy timeouts in the USBtoSerial project if no application on the host is consuming data (thanks to Nicolas Saugnier)
* - Fixed lengthy automatic data flushing in the CDC and MIDI device class drivers
* - Fixed incorrect LED masks for received data display in the Device GenericHID demos (thanks to Denys Berkovskyy)
*
* \section Sec_ChangeLog120730 Version 120730
* <b>New:</b>
......@@ -54,7 +57,7 @@
* - Added new Endpoint_ConfigureEndpointTable() function
* - Added new Pipe_ConfigurePipeTable() function
* - Added build test to verify correct compilation of all board drivers using all driver APIs
* - Added build test to verify correct compilation of all bootloaders using all supported devices
* - Added build test to verify correct compilation of all bootloaders using all supported devices
* - Added build test to verify that there are no detectable errors in the codebase via static analysis
* - Added new JTAG_ENABLE() macro for the AVR8 architecture
* - Library Applications:
......@@ -106,7 +109,7 @@
* - Fixed swapped Little Endian/Big Endian endpoint and pipe write code for the UC3 devices (thanks to Andrew Chu)
* - Fixed the JTAG_DISABLE() macro clearing all other bits in MCUSR when called
* - Fixed incorrect Micropendous board LED driver LEDs_SetAllLEDs() and LEDs_ChangeLEDs() function implementations (thanks to MitchJS)
* - Fixed endianess issues in the RNDIS host class driver for UC3 devices (thanks to Andrew Chu)
* - Fixed endianess issues in the RNDIS host class driver for UC3 devices (thanks to Andrew Chu)
* - Library Applications:
* - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter)
* - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is
......
......@@ -44,9 +44,8 @@
*
* <table>
* <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
* <tr><td>LEDS_LED1</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.5</td></tr>
* <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.6</td></tr>
* <tr><td>LEDS_LED3</td><td>Blue</td><td>General Indicator</td><td>Low</td><td>PORTD.7</td></tr>
* <tr><td>LEDS_LED1</td><td>Blue</td><td>General Indicator</td><td>Low</td><td>PORTD.5</td></tr>
* <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.6</td></tr>
* </table>
*
* @{
......@@ -76,11 +75,8 @@
/** LED mask for the second LED on the board. */
#define LEDS_LED2 (1 << 6)
/** LED mask for the third LED on the board. */
#define LEDS_LED3 (1 << 7)
/** LED mask for all the LEDs on the board. */
#define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
#define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
/** LED mask for the none of the board LEDs. */
#define LEDS_NO_LEDS 0
......
......@@ -210,10 +210,13 @@
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
{
uint8_t Temp = (UDADDR & (1 << ADDEN)) | (Address & 0x7F);
UDADDR = (UDADDR & (1 << ADDEN)) | (Address & 0x7F);
}
UDADDR = Temp;
UDADDR = Temp | (1 << ADDEN);
static inline void USB_Device_EnableDeviceAddress(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_EnableDeviceAddress(void)
{
UDADDR |= (1 << ADDEN);
}
static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
......
......@@ -124,9 +124,9 @@ void USB_Device_ProcessControlRequest(void)
static void USB_Device_SetAddress(void)
{
uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
GlobalInterruptDisable();
uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
USB_Device_SetDeviceAddress(DeviceAddress);
Endpoint_ClearSETUP();
......@@ -134,10 +134,9 @@ static void USB_Device_SetAddress(void)
while (!(Endpoint_IsINReady()));
USB_Device_SetDeviceAddress(DeviceAddress);
USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
USB_Device_EnableDeviceAddress();
SetGlobalInterruptMask(CurrentGlobalInt);
USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
}
static void USB_Device_SetConfiguration(void)
......
......@@ -209,7 +209,12 @@
static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
{
AVR32_USBB.UDCON.uadd = Address;
AVR32_USBB.UDCON.adden = (Address ? true : false);
}
static inline void USB_Device_EnableDeviceAddress(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_EnableDeviceAddress(void)
{
AVR32_USBB.UDCON.adden = true;
}
static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
......
......@@ -208,6 +208,12 @@
USB.ADDR = Address;
}
static inline void USB_Device_EnableDeviceAddress(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_EnableDeviceAddress(void)
{
/* No implementation for XMEGA architecture */
}
static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline bool USB_Device_IsAddressSet(void)
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment