Skip to content
Advertisement

How to debug USB HID scancode-keycode translation in Linux

I have recently converted a 122-key terminal keyboard to USB as a configfs USB gadget (the keyboard portion is using HID codes), it works quite well in except that I cannot seem to get my Archlinux installation to recognize certain HID codes (specifically at the moment F13-F24) and translate them into event codes that I can use in X.

HID codes received properly

I am able to see the HID being received by the computer through /dev/hidraw2 (the output below is when pressing F24, HID code 0x73 based on: https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2.

JavaScript

HID codes not translated to events

However, as soon as I try showkey -s, evtest, or xev I get absolutely nothing, it is as if I am not pressing a key. All of the “normal” HID codes work (in fact this message is being typed on the keyboard right now) so it must be something between the receipt of the HID code and its translation.

Interestingly, my evtest capabilities do not list the event codes for the F13-F24 (see below) but I have seen these capabilities listed in other people’s output (eg https://unix.stackexchange.com/questions/130656/how-to-get-all-my-keys-to-send-keycodes).

JavaScript

Is it the driver?

Based on the difference between my evtest EV_KEY capabilities and others I have seen I thought maybe it is that my driver can’t map the USB HID codes to the appropriate event codes.

Using hwinfo I can tell that my keyboard is using the hid-generic driver. Looking at the source for hid-input.c (http://elixir.free-electrons.com/linux/v3.5.2/source/drivers/hid/hid-input.c) I can see that the mapping is indeed there (the HID code 0x73 maps to 194 which maps to the KEY_F24 event, at least according to what I found here: https://github.com/wayland-project/libinput/blob/master/include/linux/input-event-codes.h). So I am led from what I have read online to believe that the problem lies somewhere between the hid-generic and libinput.

I’m not sure where to go from here, with nothing coming out of evtest I am not sure what to map the keys to. Is it just that the capability for those keys isn’t defined? Is there anyway to specify the capabilities of my keyboard to evdev?

Advertisement

Answer

Found the problem. After looking through the code for usbhid I realized that it was what was assigning the available event codes discovered by evtest. To do this, it reads through the HID descriptor. As it turned out I had used a generic HID descriptor and the Logical Maximum and Usage Maximum were cutting off the higher numbered HID codes. I used https://github.com/DIGImend/hidrd to get an editable version of my binary descriptor and then changed the Usage Maximum and Logical Maximum to the highest HID code I use. Reconverted it to binary format, uploaded and started the keyboard. Now evtest recognizes all keys.

Here is my original spec:

JavaScript

And my updated spec:

JavaScript
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement