aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Demos/Device/LowLevel/Keyboard/Keyboard.c12
-rw-r--r--Demos/Device/LowLevel/Mouse/Mouse.c12
-rw-r--r--LUFA/Drivers/USB/Class/Device/HID.c23
-rw-r--r--LUFA/Drivers/USB/LowLevel/DevChapter9.c96
-rw-r--r--LUFA/Drivers/USB/LowLevel/DevChapter9.h4
-rw-r--r--LUFA/ManPages/ChangeLog.txt1
6 files changed, 83 insertions, 65 deletions
diff --git a/Demos/Device/LowLevel/Keyboard/Keyboard.c b/Demos/Device/LowLevel/Keyboard/Keyboard.c
index 185d968d7..252714808 100644
--- a/Demos/Device/LowLevel/Keyboard/Keyboard.c
+++ b/Demos/Device/LowLevel/Keyboard/Keyboard.c
@@ -225,8 +225,8 @@ void EVENT_USB_UnhandledControlPacket(void)
{
Endpoint_ClearSETUP();
- /* Get idle period in MSB */
- IdleCount = (USB_ControlRequest.wValue >> 8);
+ /* Get idle period in MSB, IdleCount must be multiplied by 4 to get number of milliseconds */
+ IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
/* Acknowledge status stage */
while (!(Endpoint_IsINReady()));
@@ -239,8 +239,8 @@ void EVENT_USB_UnhandledControlPacket(void)
{
Endpoint_ClearSETUP();
- /* Write the current idle duration to the host */
- Endpoint_Write_Byte(IdleCount);
+ /* Write the current idle duration to the host, must be divided by 4 before sent to host */
+ Endpoint_Write_Byte(IdleCount >> 2);
/* Send the flag to the host */
Endpoint_ClearIN();
@@ -329,8 +329,8 @@ void SendNextReport(void)
/* Check if the idle period is set and has elapsed */
if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))
{
- /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */
- IdleMSRemaining = (IdleCount << 2);
+ /* Reset the idle time remaining counter */
+ IdleMSRemaining = IdleCount;
/* Idle period is set and has elapsed, must send a report to the host */
SendReport = true;
diff --git a/Demos/Device/LowLevel/Mouse/Mouse.c b/Demos/Device/LowLevel/Mouse/Mouse.c
index c0989c5db..60eb7fad7 100644
--- a/Demos/Device/LowLevel/Mouse/Mouse.c
+++ b/Demos/Device/LowLevel/Mouse/Mouse.c
@@ -197,8 +197,8 @@ void EVENT_USB_UnhandledControlPacket(void)
{
Endpoint_ClearSETUP();
- /* Get idle period in MSB */
- IdleCount = (USB_ControlRequest.wValue >> 8);
+ /* Get idle period in MSB, must multiply by 4 to get the duration in milliseconds */
+ IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
/* Acknowledge status stage */
while (!(Endpoint_IsINReady()));
@@ -211,8 +211,8 @@ void EVENT_USB_UnhandledControlPacket(void)
{
Endpoint_ClearSETUP();
- /* Write the current idle duration to the host */
- Endpoint_Write_Byte(IdleCount);
+ /* Write the current idle duration to the host, must be divided by 4 before sent to host */
+ Endpoint_Write_Byte(IdleCount >> 2);
/* Send the flag to the host */
Endpoint_ClearIN();
@@ -289,8 +289,8 @@ void SendNextReport(void)
/* Check if the idle period is set and has elapsed */
if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))
{
- /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */
- IdleMSRemaining = (IdleCount << 2);
+ /* Reset the idle time remaining counter */
+ IdleMSRemaining = IdleCount;
/* Idle period is set and has elapsed, must send a report to the host */
SendReport = true;
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index d0320868f..bad934a3c 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -38,8 +38,11 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterf
if (!(Endpoint_IsSETUPReceived()))
return;
- if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)
- return;
+ if ((USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) &&
+ (USB_ControlRequest.bRequest != SetIdle))
+ {
+ return;
+ }
switch (USB_ControlRequest.bRequest)
{
@@ -105,12 +108,16 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterf
case REQ_SetIdle:
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{
- Endpoint_ClearSETUP();
-
- HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue >> 8) << 2);
-
- while (!(Endpoint_IsINReady()));
- Endpoint_ClearIN();
+ if ((USB_ControlRequest.wIndex == HIDInterfaceInfo->Config.InterfaceNumber) ||
+ (USB_ControlRequest.wValue & 0xFF) == 0)
+ {
+ Endpoint_ClearSETUP();
+
+ HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
+
+ while (!(Endpoint_IsINReady()));
+ Endpoint_ClearIN();
+ }
}
break;
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
index f49f5b39b..231821646 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
@@ -174,59 +174,65 @@ void USB_Device_GetConfiguration(void)
Endpoint_ClearOUT();
}
-static void USB_Device_GetDescriptor(void)
+#if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+static void USB_Device_GetInternalSerialDescriptor(void)
{
- void* DescriptorPointer;
- uint16_t DescriptorSize;
+ struct
+ {
+ USB_Descriptor_Header_t Header;
+ int16_t UnicodeString[12];
+ } SignatureDescriptor;
- #if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
- if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
+ uint8_t SigReadAddress = 0x0E;
+ bool OddNibbleRead = false;
+
+ #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
+ SignatureDescriptor.Header.Size = sizeof(SignatureDescriptor);
+ SignatureDescriptor.Header.Type = DTYPE_String;
+ #else
+ SignatureDescriptor.Header.bLength = sizeof(SignatureDescriptor);
+ SignatureDescriptor.Header.bDescriptorType = DTYPE_String;
+ #endif
+
+ for (uint8_t SerialCharNum = 0; SerialCharNum < 12; SerialCharNum++)
{
- struct
- {
- USB_Descriptor_Header_t Header;
- int16_t UnicodeString[12];
- } SignatureDescriptor;
-
- #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
- SignatureDescriptor.Header.Size = sizeof(SignatureDescriptor);
- SignatureDescriptor.Header.Type = DTYPE_String;
- #else
- SignatureDescriptor.Header.bLength = sizeof(SignatureDescriptor);
- SignatureDescriptor.Header.bDescriptorType = DTYPE_String;
- #endif
+ uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
- uint8_t SigReadAddress = 0x0E;
- bool OddRead = false;
-
- for (uint8_t SerialCharNum = 0; SerialCharNum < 12; SerialCharNum++)
+ if (OddNibbleRead)
{
- uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
-
- if (OddRead)
- {
- SerialByte >>= 4;
- SigReadAddress++;
- }
- else
- {
- SerialByte &= 0x0F;
- }
-
- OddRead = !(OddRead);
-
- if (SerialByte < 0x0A)
- SerialByte += '0';
- else
- SerialByte += ('A' - 0x0A);
-
- SignatureDescriptor.UnicodeString[SerialCharNum] = SerialByte;
+ SerialByte >>= 4;
+ SigReadAddress++;
+ }
+ else
+ {
+ SerialByte &= 0x0F;
}
- Endpoint_ClearSETUP();
- Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
- Endpoint_ClearOUT();
+ OddNibbleRead = !(OddNibbleRead);
+
+ if (SerialByte < 0x0A)
+ SerialByte += '0';
+ else
+ SerialByte += ('A' - 0x0A);
+
+ SignatureDescriptor.UnicodeString[SerialCharNum] = SerialByte;
+ }
+
+ Endpoint_ClearSETUP();
+ Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
+ Endpoint_ClearOUT();
+}
+#endif
+static void USB_Device_GetDescriptor(void)
+{
+ void* DescriptorPointer;
+ uint16_t DescriptorSize;
+
+ #if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+ if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
+ {
+ USB_Device_GetInternalSerialDescriptor();
return;
}
#endif
diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.h b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
index fdef72757..2640cbba1 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.h
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.h
@@ -99,6 +99,10 @@
static void USB_Device_GetDescriptor(void);
static void USB_Device_GetStatus(void);
static void USB_Device_ClearSetFeature(void);
+
+ #if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+ static void USB_Device_GetInternalSerialDescriptor(void);
+ #endif
#endif
#endif
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 1610059cc..2281ca595 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -55,6 +55,7 @@
* - Fixed USB_Host_SendControlRequest() not re-suspending the USB bus when initial device ready-wait fails
* - Fixed USB Pad regulator not being disabled on some AVR models when the USB_OPT_REG_DISABLED option is used
* - Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected
+ * - Fixed Mouse/Keyboard demos not performing the correct arithmetic on the Idle period at the right times (thanks to Brian Dickman)
*
*
* \section Sec_ChangeLog090605 Version 090605