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).
pull/1469/head
Dean Camera 12 years ago
parent 7d037c7db8
commit 2608fd1dd4

@ -177,13 +177,13 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED1;
if (Data[1]) if (Data[1])
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED2;
if (Data[2]) if (Data[2])
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED3;
if (Data[3]) if (Data[3])
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED4;
LEDs_SetAllLEDs(NewLEDMask); LEDs_SetAllLEDs(NewLEDMask);
} }

@ -161,13 +161,13 @@ void ProcessGenericHIDReport(uint8_t* DataArray)
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED1;
if (DataArray[1]) if (DataArray[1])
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED2;
if (DataArray[2]) if (DataArray[2])
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED3;
if (DataArray[3]) if (DataArray[3])
NewLEDMask |= LEDS_LED1; NewLEDMask |= LEDS_LED4;
LEDs_SetAllLEDs(NewLEDMask); LEDs_SetAllLEDs(NewLEDMask);
} }

@ -86,7 +86,7 @@
/* Architecture specific utility includes: */ /* Architecture specific utility includes: */
#if defined(__DOXYGEN__) #if defined(__DOXYGEN__)
/** Type define for an unsigned integer the same width as the selected architecture's machine register. /** 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). * which may not reflect the actual machine register width on some targets (e.g. AVR8).
*/ */
typedef MACHINE_REG_t uint_reg_t; typedef MACHINE_REG_t uint_reg_t;

@ -23,7 +23,7 @@
* via a software jump without first turning off the OTG pad (thanks to Simon Inns) * via a software jump without first turning off the OTG pad (thanks to Simon Inns)
* - Library Applications: * - Library Applications:
* - Increased throughput in the USBtoSerial project now that data transmission is non-blocking (thanks to Joseph Lacerte) * - 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> * <b>Fixed:</b>
* - Core: * - 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 * - 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) * 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 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: * - 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)
* - Fixed lengthy timeouts in the USBtoSerial project if no application on the host is consuming data (thanks to Nicolas Saugnier) * - 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 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 * \section Sec_ChangeLog120730 Version 120730
* <b>New:</b> * <b>New:</b>

@ -44,9 +44,8 @@
* *
* <table> * <table>
* <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> * <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_LED1</td><td>Blue</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_LED2</td><td>Red</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>
* </table> * </table>
* *
* @{ * @{
@ -76,11 +75,8 @@
/** LED mask for the second LED on the board. */ /** LED mask for the second LED on the board. */
#define LEDS_LED2 (1 << 6) #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. */ /** 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. */ /** LED mask for the none of the board LEDs. */
#define LEDS_NO_LEDS 0 #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) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) 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; static inline void USB_Device_EnableDeviceAddress(void) ATTR_ALWAYS_INLINE;
UDADDR = Temp | (1 << ADDEN); static inline void USB_Device_EnableDeviceAddress(void)
{
UDADDR |= (1 << ADDEN);
} }
static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;

@ -125,8 +125,8 @@ void USB_Device_ProcessControlRequest(void)
static void USB_Device_SetAddress(void) static void USB_Device_SetAddress(void)
{ {
uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
GlobalInterruptDisable(); USB_Device_SetDeviceAddress(DeviceAddress);
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
@ -134,10 +134,9 @@ static void USB_Device_SetAddress(void)
while (!(Endpoint_IsINReady())); while (!(Endpoint_IsINReady()));
USB_Device_SetDeviceAddress(DeviceAddress); USB_Device_EnableDeviceAddress();
USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
SetGlobalInterruptMask(CurrentGlobalInt); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
} }
static void USB_Device_SetConfiguration(void) static void USB_Device_SetConfiguration(void)

@ -209,7 +209,12 @@
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
{ {
AVR32_USBB.UDCON.uadd = 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; static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;

@ -208,6 +208,12 @@
USB.ADDR = Address; 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) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline bool USB_Device_IsAddressSet(void) static inline bool USB_Device_IsAddressSet(void)
{ {

Loading…
Cancel
Save