xbows-driver
xbows-driver copied to clipboard
kbdtest2 stalls on non-LED keyboard
kbdtest2
hangs when trying to program a non-LED keyboard presumably because it is trying to do something with the lights.
Sending this file with kbdtest2 -v file.yaml
makes kbdtest2 hang at the first "RECEIVING PACKET".
---
layer: custom 3
keymap:
U: 7
I: 8
O: 9
J: 4
K: 5
L: 6
M: 1
Comma: 2
Period: 3
Space_R: 0
If I invoke it with -n
so nothing is actually sent, you will see that the first part after "RECEIVING PACKET" is Sending light program DONE
which leads me to assume it's trying to do something with lighting which is what makes it hang.
This is the output when invoked with -n
:
DEVICE:
path: 0005:0004:00
vendprod: 7847 2311
release: 768
mfgstr: SEMITEK
prodstr: USB-HID Gaming Keyboard
usagepg: 0
usage: 0
interface: 0
DEVICE:
path: 0005:0004:01
vendprod: 7847 2311
release: 768
mfgstr: SEMITEK
prodstr: USB-HID Gaming Keyboard
usagepg: 0
usage: 0
interface: 1
DEVICE:
path: 0005:0004:02
vendprod: 7847 2311
release: 768
mfgstr: SEMITEK
prodstr: USB-HID Gaming Keyboard
usagepg: 0
usage: 0
interface: 2
Sending packets now...
SENDING PACKET
Packet:
0c 00 00 00 00 00 a7 0d 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
Sending light program DONE
Sent program in 102 ms
Sending packets now...
SENDING PACKET
Packet:
0b 05 00 00 00 00 57 6a 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
01 09 00 00 00 00 94 84 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 01 00 00 00 be 55 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 00 00 38 00 f1 b3 ff ff ff ff ff ff ff ff
01 00 00 02 02 00 00 02 04 00 00 02 08 00 00 02
10 00 00 02 20 00 00 02 40 00 00 02 ff ff ff ff
00 04 00 02 00 05 00 02 00 1f 00 02 00 22 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 38 00 38 00 1f 00 00 25 00 02 00 23 00 02
00 0a 00 02 00 0b 00 02 00 25 00 02 00 21 00 02
00 22 00 02 00 23 00 02 00 1e 00 02 00 11 00 02
00 26 00 02 00 13 00 02 00 14 00 02 00 26 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 70 00 38 00 aa 99 00 21 00 02 00 17 00 02
00 24 00 02 00 19 00 02 00 24 00 02 00 1e 00 02
00 1c 00 02 00 1d 00 02 00 1e 00 02 00 1f 00 02
00 20 00 02 00 21 00 02 00 22 00 02 00 23 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 a8 00 38 00 6a ec 00 24 00 02 00 25 00 02
00 26 00 02 00 27 00 02 00 28 00 02 00 29 00 02
00 2a 00 02 00 2b 00 02 00 27 00 02 00 2d 00 02
00 2e 00 02 00 2f 00 02 00 30 00 02 00 31 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 e0 00 38 00 64 5c 00 33 00 02 00 34 00 02
00 35 00 02 00 1f 00 02 00 20 00 02 00 38 00 02
00 39 00 02 00 3a 00 02 00 3b 00 02 00 3c 00 02
00 3d 00 02 00 3e 00 02 00 3f 00 02 00 40 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 18 01 38 00 eb 12 00 41 00 02 00 42 00 02
00 43 00 02 00 44 00 02 00 45 00 02 00 46 00 02
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 4b 00 02 00 4c 00 02 ff ff ff ff 00 4e 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 50 01 38 00 dc 34 00 4f 00 02 00 50 00 02
00 51 00 02 00 52 00 02 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 88 01 38 00 b4 1c ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 c0 01 20 00 e8 43 00 2a 00 02 00 28 00 02
01 00 00 02 20 00 00 02 00 27 00 02 ff ff ff ff
ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 04 00 00 00 33 d1 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
25 04 00 00 00 00 49 67 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 05 00 00 00 ef aa 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
26 04 00 00 38 00 52 eb ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
26 04 38 00 38 00 99 42 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
26 04 70 00 08 00 94 32 ff ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 06 00 00 00 8b 26 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 00 00 00 38 76 1a 00 02 00 00 00 00 00 00
00 02 00 00 00 00 00 00 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 38 00 00 38 31 6f ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 70 00 00 38 4d 85 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 a8 00 00 38 e8 ab ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 e0 00 00 38 94 41 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 18 01 00 38 ee bc ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 50 01 00 38 92 56 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 88 01 00 38 37 78 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 c0 01 00 38 4b 92 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 f8 01 00 08 83 a2 ff ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
0b 04 00 00 00 00 ab 79 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
Sending light program DONE
Sent program in 65 ms
Sending packets now...
SENDING PACKET
Packet:
0c 00 00 00 00 00 a7 0d 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
Sending light program DONE
Sent program in 102 ms
Hi Peter, thanks for reporting. Huh, that is interesting. I'm unaware of how to distinguish led from non-led keyboards programmatically, so there may need to be a configuration setting to handle it. Or perhaps a timer that expires and treats the keyboard as non-led after that.
The first thing you can do is lsusb -vd
Does the windows driver offer you led programming even though the keyboard doesn't support it?
so there may need to be a configuration setting to handle it
The simplest solutions to me is a flag you pass along to kbdtest2
that tells it to ignore the lighting. The timer option if you cannot dynamically detect it sounds very nice of course as it means it'll "just work".
Does the windows driver offer you led programming even though the keyboard doesn't support it?
It does not.
Here's the output of lsusb
:
Bus 005 Device 004: ID 1ea7:0907 SHARKOON Technologies GmbH
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1ea7 SHARKOON Technologies GmbH
idProduct 0x0907
bcdDevice 3.00
iManufacturer 1 SEMITEK
iProduct 2 USB-HID Gaming Keyboard
iSerial 3 SN0000000001
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x005b
bNumInterfaces 3
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.11
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 64
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.11
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 34
Report Descriptor: (length is 34)
Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
(null)
Item(Local ): Usage, data= [ 0x50 ] 80
(null)
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Local ): Usage, data= [ 0x02 ] 2
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x40 ] 64
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage, data= [ 0x03 ] 3
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x40 ] 64
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
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.11
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 203
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Device Status: 0x0000
(Bus Powered)
Anything else I can help provide @jlquinn ?
Unfortunately I don't see anything in the lsusb output that distinguishes the two keyboards.
Likely it will require setting up windows in a vm and recording the USB packets back and forth for your keyboard while using the windows driver. That's how I got as far as I did.
It sounds like there must be some difference between the early packets your keyboard sends and mine does. I'll have to take a closer look at the packets and see if I can see anything.
I won't be able to touch it for a week or so. If you're ambitious you can try to set up USB packet recording yourself.
The next step will be to look at the basic messages coming back from your keyboard vs mine. I'm putting this as a placeholder so that I remember when I come back to this.
I'll dump the traffic next weekend.
Haven't had time, sorry.