diff --git a/CorsairDriverBugfix/Material/hid1_11.pdf b/CorsairDriverBugfix/Material/hid1_11.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9751c4fe031f7ba7bc4c16aa52b5d4ddbd45e67 Binary files /dev/null and b/CorsairDriverBugfix/Material/hid1_11.pdf differ diff --git a/CorsairDriverBugfix/Material/usbhid-dump.txt b/CorsairDriverBugfix/Material/usbhid-dump.txt new file mode 100644 index 0000000000000000000000000000000000000000..08290b07894d446fd5d3c453328d4b1cab7c2b2f --- /dev/null +++ b/CorsairDriverBugfix/Material/usbhid-dump.txt @@ -0,0 +1 @@ +https://github.com/DIGImend/usbhid-dump diff --git a/CorsairDriverBugfix/doc/notes.txt b/CorsairDriverBugfix/doc/notes.txt index 05dbc52afb29281b3ac2e57772ed5103e079959b..22f18337cccd40c8263ffa4b538e0272b041be0e 100644 --- a/CorsairDriverBugfix/doc/notes.txt +++ b/CorsairDriverBugfix/doc/notes.txt @@ -31,7 +31,7 @@ dmesg # Beinhaltet auch Informationen, welche Treiber geladen werden. [ 3085.620234] hid-generic 0003:1B1C:1B27.0008: input,hiddev0,hidraw4: USB HID v1.11 Device [Corsair Corsair VOID Wireless Gaming Dongle] on usb-0000:00:1a.0-1/input3 |=== - +\label{DisconnectDriver} Treiber einem Gerät zuweisen oder Gerät von Treiber trennen: cd /sys/bus/usb/drivers/hiddev ls @@ -54,16 +54,27 @@ ls /sys/bus/usb/drivers/hiddev |=== lsusb -vvv | more # Hochdetailierte Informationen über alle USB Geräte +Bevor mittels lsusb der Report Descriptor eingesehen werden kann, muss der Treiber vom Gerät getrennt werden. Siehe hierzu Abschnitt \ref{DisconnectDriver} Interessant hier: Der Report Descriptor liefert Auskunft über alle Telegramme, die das Gerät als Human Interface Device senden kann und bietet damit die Möglichkeit das Gerät zu betreiben ohne einen speziellen Treiber für dieses spezifische Gerät schreiben zu müssen. Falls der Descriptor nicht zu den in der Realität vorhandenen Daten passt, kann es zu Problemen kommen. Eine Vermutung von mir: In den HID-Treiben werden Mutexe verwendet. Ich könnte mir vorstellen, dass falls im Descriptor ein Telegramm fälschlicherweise zu lang angemeldet wird, dass ein Mutex für den Lesevorgang blockiert wird und nicht wieder auftaut, da ein zu kurzes Telegramm angekommen ist. (Würde erklären, weshalb Funktionen teilweise noch funktionieren, aber Tasten fälschlicherweise als gedrückt empfunden werden z.B. Eventuell passt die Kommunikation auch nicht mehr, wenn das falsche Telegramm kommt und durch STRG+ALT+F1 und anschließendes zurückwechseln in den xserver werden die Puffer neu initialisiert. -Andere Vermutung: Geräte die eine Fehlfunktionalität auslösen senden ein HID Event, das fehlinterpretiert wird oder vom Hersteller für eine Zusatzfunktionalität missbraucht wird und löst damit das seltsame Verhalten des XServers aus. Ein stark ähnliches Verhalten des XServers ist nachstellbar, indem man eine zweite Maus anschließt und eine beliebige Taste gedrückt hält. Auch in diesem Fall lassen sich manche Elemente nicht mehr anklicken und Fensterelemente geben kein visuelles Feedback mehr, wenn die Maus über sie hinweg fährt. Für diese Vermutung spricht auch, das mittels einer Umschaltung in ein tty und zurück in den XServer der Fehlklick bereinigt bzw. ignoriert oder ungülgtig wird, sodass trotz der weiterhin gedrückten Taste alle Elemente wieder richtig reagieren und bedienbar sind. +Andere (bessere) Vermutung: Geräte die eine Fehlfunktionalität auslösen senden ein HID Event, das fehlinterpretiert wird oder vom Hersteller für eine Zusatzfunktionalität missbraucht wird und löst damit das seltsame Verhalten des XServers aus. Ein stark ähnliches Verhalten des XServers ist nachstellbar, indem man eine zweite Maus anschließt und eine beliebige Taste gedrückt hält. Auch in diesem Fall lassen sich manche Elemente nicht mehr anklicken und Fensterelemente geben kein visuelles Feedback mehr, wenn die Maus über sie hinweg fährt. Für diese Vermutung spricht auch, das mittels einer Umschaltung in ein tty und zurück in den XServer der Fehlklick bereinigt bzw. ignoriert oder ungülgtig wird, sodass trotz der weiterhin gedrückten Taste alle Elemente wieder richtig reagieren und bedienbar sind. Zur genaueren Untersuchung, ob die Vermutung eines fälschlicherweise gesendeten Events von problematischer Hardware die Ursache ist, sollte in dem Treiber für HID-Geräte genauer untersucht werden, welche HID-Events tatsächlich generiert werden. Mittels der Spezifikation von USB.org \cite{USB-HUT_v1-12} ist nachvollziehbar, welche Events sinnvoll und welche vielleicht für eine Sonderfunktion vom Hersteller missbraucht wurden. Über die Analyse des Rohdatenverkehrs ist dann genauer analysierbar, welches ein problematisches Telegramm sein kann. Für den Fall das es tatsächlich ein Telegramm gibt, dass zwar richtig aufgebaut und vom HID-Treiber interpretiert wird, in dem Kontext der Funktionstasten des Headsets aber fehl am Platze ist, wäre die Lösung die Erstellung eines eigenen Treibers für die Hardware, der den bisherigen HID-Treiber initialisiert und verwendet, problematische Telegrammteile aber zum Beispiel weg schneidet. Für den unwahrscheinlichen Fall, dass der derzeitig aktuelle HID-Treiber ein Telegramm nicht richtig behandelt, kann ein Update des Treibers hid-input das Problem beheben. +Nützliches Tool um hid-Geräte und Rohdaten zu untersuchen: usbhid-dump. + wget https://github.com/DIGImend/usbhid-dump/archive/master.zip + unzip usbhid-dump-master.zip + ./bootstrap + sudo apt-get install libusb-1.0-0-dev + ./configure + make + sudo make install + + Möglicherweise interessante Treiber, um die Theorie zu bestätigen: snd hid-input diff --git a/CorsairDriverBugfix/lsusb-vvv.txt b/CorsairDriverBugfix/lsusb-vvv.txt new file mode 100644 index 0000000000000000000000000000000000000000..de7300b13a7d05a0e02aad5085f4e41cebd9828a --- /dev/null +++ b/CorsairDriverBugfix/lsusb-vvv.txt @@ -0,0 +1,805 @@ +Bus 003 Device 014: ID 1b1c:1b27 Corsair +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.10 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x1b1c Corsair + idProduct 0x1b27 + bcdDevice 0.00 + iManufacturer 3 Corsair + iProduct 4 Corsair VOID Wireless Gaming Dongle + iSerial 0 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 269 + bNumInterfaces 4 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 1 Audio + bInterfaceSubClass 1 Control Device + bInterfaceProtocol 0 + iInterface 1 Corsair VOID Wireless Gaming Dongle + AudioControl Interface Descriptor: + bLength 10 + bDescriptorType 36 + bDescriptorSubtype 1 (HEADER) + bcdADC 1.00 + wTotalLength 71 + bInCollection 2 + baInterfaceNr( 0) 1 + baInterfaceNr( 1) 2 + AudioControl Interface Descriptor: + bLength 12 + bDescriptorType 36 + bDescriptorSubtype 2 (INPUT_TERMINAL) + bTerminalID 6 + wTerminalType 0x0402 Headset + bAssocTerminal 0 + bNrChannels 1 + wChannelConfig 0x0000 + iChannelNames 0 + iTerminal 0 + AudioControl Interface Descriptor: + bLength 9 + bDescriptorType 36 + bDescriptorSubtype 6 (FEATURE_UNIT) + bUnitID 3 + bSourceID 6 + bControlSize 1 + bmaControls( 0) 0x03 + Mute Control + Volume Control + bmaControls( 1) 0x00 + iFeature 0 + AudioControl Interface Descriptor: + bLength 9 + bDescriptorType 36 + bDescriptorSubtype 3 (OUTPUT_TERMINAL) + bTerminalID 7 + wTerminalType 0x0101 USB Streaming + bAssocTerminal 0 + bSourceID 3 + iTerminal 0 + AudioControl Interface Descriptor: + bLength 12 + bDescriptorType 36 + bDescriptorSubtype 2 (INPUT_TERMINAL) + bTerminalID 1 + wTerminalType 0x0101 USB Streaming + bAssocTerminal 0 + bNrChannels 2 + wChannelConfig 0x0003 + Left Front (L) + Right Front (R) + iChannelNames 0 + iTerminal 0 + AudioControl Interface Descriptor: + bLength 10 + bDescriptorType 36 + bDescriptorSubtype 6 (FEATURE_UNIT) + bUnitID 2 + bSourceID 1 + bControlSize 1 + bmaControls( 0) 0x03 + Mute Control + Volume Control + bmaControls( 1) 0x00 + bmaControls( 2) 0x00 + iFeature 0 + AudioControl Interface Descriptor: + bLength 9 + bDescriptorType 36 + bDescriptorSubtype 3 (OUTPUT_TERMINAL) + bTerminalID 5 + wTerminalType 0x0402 Headset + bAssocTerminal 0 + bSourceID 2 + iTerminal 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 1 Audio + bInterfaceSubClass 2 Streaming + bInterfaceProtocol 0 + iInterface 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 1 + bNumEndpoints 1 + bInterfaceClass 1 Audio + bInterfaceSubClass 2 Streaming + bInterfaceProtocol 0 + iInterface 0 + AudioStreaming Interface Descriptor: + bLength 7 + bDescriptorType 36 + bDescriptorSubtype 1 (AS_GENERAL) + bTerminalLink 7 + bDelay 0 frames + wFormatTag 1 PCM + AudioStreaming Interface Descriptor: + bLength 32 + bDescriptorType 36 + bDescriptorSubtype 2 (FORMAT_TYPE) + bFormatType 1 (FORMAT_TYPE_I) + bNrChannels 1 + bSubframeSize 2 + bBitResolution 16 + bSamFreqType 8 Discrete + tSamFreq[ 0] 8000 + tSamFreq[ 1] 11025 + tSamFreq[ 2] 16000 + tSamFreq[ 3] 22050 + tSamFreq[ 4] 24000 + tSamFreq[ 5] 32000 + tSamFreq[ 6] 44100 + tSamFreq[ 7] 48000 + Endpoint Descriptor: + bLength 9 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 13 + Transfer Type Isochronous + Synch Type Synchronous + Usage Type Data + wMaxPacketSize 0x0090 1x 144 bytes + bInterval 1 + bRefresh 0 + bSynchAddress 0 + AudioControl Endpoint Descriptor: + bLength 7 + bDescriptorType 37 + bDescriptorSubtype 1 (EP_GENERAL) + bmAttributes 0x01 + Sampling Frequency + bLockDelayUnits 0 Undefined + wLockDelay 0 Undefined + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 2 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 1 Audio + bInterfaceSubClass 2 Streaming + bInterfaceProtocol 0 + iInterface 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 2 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 1 Audio + bInterfaceSubClass 2 Streaming + bInterfaceProtocol 0 + iInterface 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 2 + bAlternateSetting 2 + bNumEndpoints 1 + bInterfaceClass 1 Audio + bInterfaceSubClass 2 Streaming + bInterfaceProtocol 0 + iInterface 0 + AudioStreaming Interface Descriptor: + bLength 7 + bDescriptorType 36 + bDescriptorSubtype 1 (AS_GENERAL) + bTerminalLink 1 + bDelay 0 frames + wFormatTag 1 PCM + AudioStreaming Interface Descriptor: + bLength 32 + bDescriptorType 36 + bDescriptorSubtype 2 (FORMAT_TYPE) + bFormatType 1 (FORMAT_TYPE_I) + bNrChannels 2 + bSubframeSize 2 + bBitResolution 16 + bSamFreqType 8 Discrete + tSamFreq[ 0] 8000 + tSamFreq[ 1] 11025 + tSamFreq[ 2] 16000 + tSamFreq[ 3] 22050 + tSamFreq[ 4] 24000 + tSamFreq[ 5] 32000 + tSamFreq[ 6] 44100 + tSamFreq[ 7] 48000 + Endpoint Descriptor: + bLength 9 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 13 + Transfer Type Isochronous + Synch Type Synchronous + Usage Type Data + wMaxPacketSize 0x0120 1x 288 bytes + bInterval 1 + bRefresh 0 + bSynchAddress 0 + AudioControl Endpoint Descriptor: + bLength 7 + bDescriptorType 37 + bDescriptorSubtype 1 (EP_GENERAL) + bmAttributes 0x01 + Sampling Frequency + bLockDelayUnits 0 Undefined + wLockDelay 0 Undefined + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 3 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 3 Human Interface Device + bInterfaceSubClass 0 No Subclass + bInterfaceProtocol 0 None + iInterface 2 Hid Interface + HID Device Descriptor: + bLength 9 + bDescriptorType 33 + bcdHID 1.11 + bCountryCode 0 Not supported + bNumDescriptors 1 + bDescriptorType 34 Report + wDescriptorLength 603 + Report Descriptor: (length is 603) + Item(Global): Usage Page, data= [ 0x0c ] 12 + Consumer + Item(Local ): Usage, data= [ 0x01 ] 1 + Consumer Control + Item(Main ): Collection, data= [ 0x01 ] 1 + Application + Item(Global): Report ID, data= [ 0x01 ] 1 + Item(Local ): Usage, data= [ 0xe9 ] 233 + Volume Increment + Item(Local ): Usage, data= [ 0xea ] 234 + Volume Decrement + Item(Global): Report Size, data= [ 0x01 ] 1 + Item(Global): Report Count, data= [ 0x02 ] 2 + Item(Global): Logical Minimum, data= [ 0x00 ] 0 + Item(Global): Logical Maximum, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Report Size, data= [ 0x06 ] 6 + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x03 ] 3 + Constant Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Report Count, data= [ 0x03 ] 3 + Item(Global): Report Size, data= [ 0x01 ] 1 + Item(Local ): Usage, data= [ 0xb6 ] 182 + Scan Previous Track + Item(Local ): Usage, data= [ 0xcd ] 205 + Play/Pause + Item(Local ): Usage, data= [ 0xb5 ] 181 + Scan Next Track + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Report Size, data= [ 0x05 ] 5 + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x03 ] 3 + Constant Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0xc5 0xff ] 65477 + (null) + Item(Local ): Usage, data= [ 0x01 ] 1 + (null) + Item(Main ): Collection, data= [ 0x01 ] 1 + Application + Item(Local ): Usage, data= [ 0x64 ] 100 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0x64 ] 100 + Item(Local ): Usage, data= [ 0x69 ] 105 + (null) + Item(Local ): Usage, data= [ 0x6a ] 106 + (null) + Item(Local ): Usage, data= [ 0x6b ] 107 + (null) + Item(Local ): Usage, data= [ 0x6c ] 108 + (null) + Item(Local ): Usage, data= [ 0x6d ] 109 + (null) + Item(Local ): Usage, data= [ 0x6e ] 110 + (null) + Item(Local ): Usage, data= [ 0x6f ] 111 + (null) + Item(Global): Report Size, data= [ 0x01 ] 1 + Item(Global): Report Count, data= [ 0x07 ] 7 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x68 ] 104 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x70 ] 112 + (null) + Item(Global): Report Size, data= [ 0x07 ] 7 + Item(Global): Logical Maximum, data= [ 0x64 ] 100 + Item(Main ): Input, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Report Size, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x03 ] 3 + Constant Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x71 ] 113 + (null) + Item(Global): Report Size, data= [ 0x04 ] 4 + Item(Global): Logical Maximum, data= [ 0x0d ] 13 + Item(Main ): Input, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x72 ] 114 + (null) + Item(Local ): Usage, data= [ 0x73 ] 115 + (null) + Item(Local ): Usage, data= [ 0x74 ] 116 + (null) + Item(Global): Report Size, data= [ 0x01 ] 1 + Item(Global): Report Count, data= [ 0x03 ] 3 + Item(Global): Logical Maximum, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x03 ] 3 + Constant Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x75 ] 117 + (null) + Item(Global): Report Size, data= [ 0x03 ] 3 + Item(Global): Logical Maximum, data= [ 0x06 ] 6 + Item(Main ): Input, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Report Size, data= [ 0x01 ] 1 + Item(Global): Report Count, data= [ 0x05 ] 5 + Item(Main ): Input, data= [ 0x03 ] 3 + Constant Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Local ): Usage, data= [ 0x65 ] 101 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0x65 ] 101 + Item(Local ): Usage, data= [ 0xd5 ] 213 + (null) + Item(Local ): Usage, data= [ 0xd6 ] 214 + (null) + Item(Global): Report Size, data= [ 0x08 ] 8 + Item(Global): Report Count, data= [ 0x02 ] 2 + Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 + Item(Main ): Input, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Local ): Usage, data= [ 0x66 ] 102 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0x66 ] 102 + Item(Local ): Usage, data= [ 0x78 ] 120 + (null) + Item(Local ): Usage, data= [ 0x79 ] 121 + (null) + Item(Local ): Usage, data= [ 0x7a ] 122 + (null) + Item(Local ): Usage, data= [ 0x7b ] 123 + (null) + Item(Global): Report Count, data= [ 0x04 ] 4 + Item(Main ): Input, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Local ): Usage, data= [ 0xc8 ] 200 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xc8 ] 200 + Item(Local ): Usage, data= [ 0xd5 ] 213 + (null) + Item(Local ): Usage, data= [ 0xd6 ] 214 + (null) + Item(Global): Report Count, data= [ 0x02 ] 2 + Item(Main ): Output, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Local ): Usage, data= [ 0xc9 ] 201 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xc9 ] 201 + Item(Local ): Usage, data= [ 0xd4 ] 212 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Output, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Local ): Usage, data= [ 0xca ] 202 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xca ] 202 + Item(Local ): Usage, data= [ 0xd8 ] 216 + (null) + Item(Main ): Output, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0xd9 ] 217 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x03 ] 3 + Instance 3 + Item(Global): Report Count, data= [ 0x03 ] 3 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0xc5 0xff ] 65477 + (null) + Item(Local ): Usage, data= [ 0xcb ] 203 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xcb ] 203 + Item(Local ): Usage, data= [ 0xd2 ] 210 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Output, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0xd3 ] 211 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x12 ] 18 + (null) + Item(Global): Report Count, data= [ 0x12 ] 18 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0xc5 0xff ] 65477 + (null) + Item(Local ): Usage, data= [ 0xcc ] 204 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xcc ] 204 + Item(Local ): Usage, data= [ 0xd7 ] 215 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Output, data= [ 0x22 ] 34 + Data Variable Absolute No_Wrap Linear + No_Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x01 ] 1 + (null) + Item(Main ): Collection, data= [ 0x01 ] 1 + Application + Item(Local ): Usage, data= [ 0x0a ] 10 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xff ] 255 + Item(Global): Report Size, data= [ 0x20 ] 32 + Item(Local ): Usage, data= [ 0x0b ] 11 + (null) + Item(Global): Logical Minimum, data= [ 0x01 0x00 0x00 0x80 ] -2147483647 + Item(Global): Logical Maximum, data= [ 0xff 0xff 0xff 0x7f ] 2147483647 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Local ): Usage, data= [ 0x22 ] 34 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0x90 ] 144 + Item(Local ): Usage, data= [ 0x33 ] 51 + (null) + Item(Global): Report Size, data= [ 0x08 ] 8 + Item(Global): Logical Minimum, data= [ 0x00 ] 0 + Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x34 ] 52 + (null) + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x01 ] 1 + Generic Desktop Controls + Item(Local ): Usage, data= [ 0x3b ] 59 + Byte Count + Item(Global): Report Size, data= [ 0x10 ] 16 + Item(Global): Logical Maximum, data= [ 0xff 0xff 0x00 0x00 ] 65535 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x0a ] 10 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x0a ] 10 + (null) + Item(Global): Report Count, data= [ 0x0a ] 10 + Item(Global): Report Size, data= [ 0x08 ] 8 + Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x22 ] 34 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0x90 ] 144 + Item(Local ): Usage, data= [ 0x33 ] 51 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x34 ] 52 + (null) + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x01 ] 1 + Generic Desktop Controls + Item(Local ): Usage, data= [ 0x3b ] 59 + Byte Count + Item(Global): Report Size, data= [ 0x10 ] 16 + Item(Global): Logical Maximum, data= [ 0xff 0xff 0x00 0x00 ] 65535 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x0a ] 10 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x0a ] 10 + (null) + Item(Global): Report Count, data= [ 0x0a ] 10 + Item(Global): Report Size, data= [ 0x08 ] 8 + Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x22 ] 34 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xc4 ] 196 + Item(Local ): Usage, data= [ 0x33 ] 51 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x34 ] 52 + (null) + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x01 ] 1 + Generic Desktop Controls + Item(Local ): Usage, data= [ 0x3b ] 59 + Byte Count + Item(Global): Report Size, data= [ 0x10 ] 16 + Item(Global): Logical Maximum, data= [ 0xff 0xff 0x00 0x00 ] 65535 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x0a ] 10 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x3b ] 59 + (null) + Item(Global): Report Count, data= [ 0x3b ] 59 + Item(Global): Report Size, data= [ 0x08 ] 8 + Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x22 ] 34 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xc4 ] 196 + Item(Local ): Usage, data= [ 0x33 ] 51 + (null) + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x34 ] 52 + (null) + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x01 ] 1 + Generic Desktop Controls + Item(Local ): Usage, data= [ 0x3b ] 59 + Byte Count + Item(Global): Report Size, data= [ 0x10 ] 16 + Item(Global): Logical Maximum, data= [ 0xff 0xff 0x00 0x00 ] 65535 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x0a ] 10 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x3b ] 59 + (null) + Item(Global): Report Count, data= [ 0x3b ] 59 + Item(Global): Report Size, data= [ 0x08 ] 8 + Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255 + Item(Main ): Output, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x0c ] 12 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xff ] 255 + Item(Global): Usage Page, data= [ 0x01 ] 1 + Generic Desktop Controls + Item(Local ): Usage, data= [ 0x3b ] 59 + Byte Count + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Feature, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x3a ] 58 + Counted Buffer + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x3e ] 62 + (null) + Item(Global): Report Count, data= [ 0x3e ] 62 + Item(Main ): Feature, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Global): Usage Page, data= [ 0x00 0xff ] 65280 + (null) + Item(Local ): Usage, data= [ 0x0c ] 12 + (null) + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Report ID, data= [ 0xe2 ] 226 + Item(Global): Usage Page, data= [ 0x01 ] 1 + Generic Desktop Controls + Item(Local ): Usage, data= [ 0x3b ] 59 + Byte Count + Item(Global): Report Count, data= [ 0x01 ] 1 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Local ): Usage, data= [ 0x3a ] 58 + Counted Buffer + Item(Main ): Collection, data= [ 0x02 ] 2 + Logical + Item(Global): Usage Page, data= [ 0x0a ] 10 + Ordinal + Item(Local ): Usage Minimum, data= [ 0x01 ] 1 + Instance 1 + Item(Local ): Usage Maximum, data= [ 0x3e ] 62 + (null) + Item(Global): Report Count, data= [ 0x3e ] 62 + Item(Main ): Input, data= [ 0x02 ] 2 + Data Variable Absolute No_Wrap Linear + Preferred_State No_Null_Position Non_Volatile Bitfield + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Item(Main ): End Collection, data=none + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0020 1x 32 bytes + bInterval 1 +Device Status: 0x0000 + (Bus Powered) diff --git a/CorsairDriverBugfix/usbhid-dump_CorsairRGBVoid.txt b/CorsairDriverBugfix/usbhid-dump_CorsairRGBVoid.txt new file mode 100644 index 0000000000000000000000000000000000000000..138e204e168d733c9d0d5f12ee667f6e7e29cca6 --- /dev/null +++ b/CorsairDriverBugfix/usbhid-dump_CorsairRGBVoid.txt @@ -0,0 +1,46 @@ +003:010:003:DESCRIPTOR 1463316538.072320 + 05 0C 09 01 A1 01 85 01 09 E9 09 EA 75 01 95 02 + 15 00 25 01 81 02 75 06 95 01 81 03 95 03 75 01 + 09 B6 09 CD 09 B5 81 02 75 05 95 01 81 03 C0 06 + C5 FF 09 01 A1 01 09 64 A1 02 85 64 09 69 09 6A + 09 6B 09 6C 09 6D 09 6E 09 6F 75 01 95 07 81 02 + 09 68 95 01 81 02 09 70 75 07 25 64 81 22 75 01 + 81 03 09 71 75 04 25 0D 81 22 09 72 09 73 09 74 + 75 01 95 03 25 01 81 02 95 01 81 03 09 75 75 03 + 25 06 81 22 75 01 95 05 81 03 C0 09 65 A1 02 85 + 65 09 D5 09 D6 75 08 95 02 26 FF 00 81 22 C0 09 + 66 A1 02 85 66 09 78 09 79 09 7A 09 7B 95 04 81 + 22 C0 09 C8 A1 02 85 C8 09 D5 09 D6 95 02 91 22 + C0 09 C9 A1 02 85 C9 09 D4 95 01 91 22 C0 09 CA + A1 02 85 CA 09 D8 91 22 09 D9 A1 02 05 0A 19 01 + 29 03 95 03 91 02 C0 C0 06 C5 FF 09 CB A1 02 85 + CB 09 D2 95 01 91 22 09 D3 A1 02 05 0A 19 01 29 + 12 95 12 91 02 C0 C0 06 C5 FF 09 CC A1 02 85 CC + 09 D7 95 01 91 22 C0 C0 06 00 FF 09 01 A1 01 09 + 0A A1 02 85 FF 75 20 09 0B 17 01 00 00 80 27 FF + FF FF 7F 81 02 C0 09 22 A1 02 85 90 09 33 75 08 + 15 00 26 FF 00 81 02 09 34 81 02 05 01 09 3B 75 + 10 27 FF FF 00 00 81 02 06 00 FF 09 0A A1 02 05 + 0A 19 01 29 0A 95 0A 75 08 26 FF 00 81 02 C0 C0 + 06 00 FF 09 22 A1 02 85 90 09 33 95 01 91 02 09 + 34 91 02 05 01 09 3B 75 10 27 FF FF 00 00 91 02 + 06 00 FF 09 0A A1 02 05 0A 19 01 29 0A 95 0A 75 + 08 26 FF 00 91 02 C0 C0 06 00 FF 09 22 A1 02 85 + C4 09 33 95 01 81 02 09 34 81 02 05 01 09 3B 75 + 10 27 FF FF 00 00 81 02 06 00 FF 09 0A A1 02 05 + 0A 19 01 29 3B 95 3B 75 08 26 FF 00 81 02 C0 C0 + 06 00 FF 09 22 A1 02 85 C4 09 33 95 01 91 02 09 + 34 91 02 05 01 09 3B 75 10 27 FF FF 00 00 91 02 + 06 00 FF 09 0A A1 02 05 0A 19 01 29 3B 95 3B 75 + 08 26 FF 00 91 02 C0 C0 06 00 FF 09 0C A1 02 85 + FF 05 01 09 3B 95 01 B1 02 09 3A A1 02 05 0A 19 + 01 29 3E 95 3E B1 02 C0 C0 06 00 FF 09 0C A1 02 + 85 E2 05 01 09 3B 95 01 81 02 09 3A A1 02 05 0A + 19 01 29 3E 95 3E 81 02 C0 C0 C0 + +003:010:003:STREAM 1463316542.769211 + 01 00 00 + +003:010:003:STREAM 1463316542.778205 + 64 00 00 33 00 +