aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/USB
diff options
context:
space:
mode:
Diffstat (limited to 'LUFA/Drivers/USB')
-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
3 files changed, 70 insertions, 53 deletions
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