xbows-driver icon indicating copy to clipboard operation
xbows-driver copied to clipboard

kbdtest2 stalls on non-LED keyboard

Open peterhoeg opened this issue 4 years ago • 8 comments

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

peterhoeg avatar Jun 16 '20 08:06 peterhoeg

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 . If you just do lsusb, you should be able to see the keyboard device name and then rerun with -v for the detail. With luck, there will be some difference between what you get for non-led keyboard and what I get from an led keyboard. If so, I can tweak the driver to avoid sending lighting commands.

jlquinn avatar Jun 16 '20 20:06 jlquinn

Does the windows driver offer you led programming even though the keyboard doesn't support it?

jlquinn avatar Jun 16 '20 21:06 jlquinn

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)

peterhoeg avatar Jun 17 '20 02:06 peterhoeg

Anything else I can help provide @jlquinn ?

peterhoeg avatar Jun 19 '20 08:06 peterhoeg

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.

jlquinn avatar Jun 19 '20 16:06 jlquinn

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.

jlquinn avatar Jun 26 '20 17:06 jlquinn

I'll dump the traffic next weekend.

peterhoeg avatar Jun 29 '20 07:06 peterhoeg

Haven't had time, sorry.

peterhoeg avatar Jul 06 '20 11:07 peterhoeg