Compile the driver module with make
and run ./rapoo7_hotfix
, then enjoy
typing (≡^∇^≡)
The HID descriptor of interface #3 sent by the device is probably broken so the host usbhid driver module cannot find a proper interrupt input endpoint, we have to turn to use the most basic and simple Boot Protocol. The weird thing is: this device could work well in BIOS setup and grub 2, which means that the HID boot protocol is supported and worked, but it could not work with linux usbkbd (HIDBP keyboard support) module. So I have to dig into USB 1.1 HID specification to figure out if the implemetation of the device or usbkbd module violated the standard.
The key to this problem was lying on pg.54 of HID 1.1 spec documentation: it said that all devices defaults to report protocol when initialized, and the host should always issue a SET_PROTOCOL control message and should not make any assumptions about the device’s state. So I added a set protocol and set idle request to usbkbd.c and fixed the problem.
Maybe we should fix the broken HID descriptor instead of using the old crappy boot protocol, just like hid-cherry.c (in linux source tree) for Cherry Cymotion Keyboard.
Do not touch those volume control keys and the [M] key at the upper right
corner, or it would drive all keyboards attached to your system crazy. Try
pressing Ctrl
+ Shift
or Ctrl
+ Shift
+ Alt
to make them calm down.