aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2013-01-03 10:53:47 +0000
committerDean Camera <dean@fourwalledcubicle.com>2013-01-03 10:53:47 +0000
commit2608fd1dd48096c1867676de337767ff3fb1a951 (patch)
treecca01486688aaa7dfa9426a0afdf23f0834f5c87 /LUFA
parent7d037c7db812be4dac1a742c990f3631fbd82cb5 (diff)
downloadlufa-2608fd1dd48096c1867676de337767ff3fb1a951.tar.gz
lufa-2608fd1dd48096c1867676de337767ff3fb1a951.tar.bz2
lufa-2608fd1dd48096c1867676de337767ff3fb1a951.zip
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).
Diffstat (limited to 'LUFA')
-rw-r--r--LUFA/Common/Common.h4
-rw-r--r--LUFA/DoxygenPages/ChangeLog.txt9
-rw-r--r--LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h10
-rw-r--r--LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h9
-rw-r--r--LUFA/Drivers/USB/Core/DeviceStandardReq.c11
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Device_UC3.h7
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h6
7 files changed, 34 insertions, 22 deletions
diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h
index c302eacb0..082f4d5e7 100644
--- a/LUFA/Common/Common.h
+++ b/LUFA/Common/Common.h
@@ -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__)
diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index b07e666a0..1e2c10ccb 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -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
diff --git a/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h b/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
index ceeb44bc1..f153629ae 100644
--- a/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
@@ -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
diff --git a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
index d60cb336a..e0435e21b 100644
--- a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
+++ b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
@@ -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;
diff --git a/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/LUFA/Drivers/USB/Core/DeviceStandardReq.c
index ef1a278d4..514286dc1 100644
--- a/LUFA/Drivers/USB/Core/DeviceStandardReq.c
+++ b/LUFA/Drivers/USB/Core/DeviceStandardReq.c
@@ -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)
diff --git a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
index 35e081b37..603caad3f 100644
--- a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
@@ -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;
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
index 7dd020296..1cf3557b5 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
@@ -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)
{