На самом деле это не клавиатура, а ИК-пульт, но с точки зрения ОС это комплект из USB-мыши и клавиатуры с небольшим набором мультимедийных кнопок.
В Windows работает влёт без всяких дополнительных драйверов. В линуксе работало очень частично и местами неправильно, пока я не нашел драйвер. Хотя если выражаться точно, то это не драйвер устройства. Это маленький патч, который на лету фиксит ошибку в описании одного конкретного USB- устройства. Собственно, вот весь функционал, остальное только привязка вызова этой функции в нужное время в нужном месте:
static void aureal_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int rsize)
{
if (rsize >= 54 && rdesc[52] == 0x25 && rdesc[53] == 0x01) {
dev_info(&hdev->dev, "fixing Aureal Cy se W-01RN USB_V3.1 "
"report descriptor. Keyboard Logical Maximum = 101\n");
rdesc[53] = 0x65;
}
}
Невыясненным остаётся вопрос, почему оно таки работает в Windows без всяких телодвижений. Потому что в линуксе криво реализована поддержка USB HID? Или потому что она криво реализована в Windows, а пульт, заточенный для работы с Windows Media Center, работает с учётом этой кривизны? Или потому что эта часть вообще не регламенитруется спецификациями, а производители сделали так, чтобы оно работало с учетом реализации HID в Windows?
Более ранние ссылки о том же пульте: https://ru-linux.livejournal.com/2579350.html, https://ru-linux.livejournal.com/2647723.html
Оригинал этой записи. Комментировать можно тут или там.
no subject
Вот он:
Usage Page (Desktop), ; Generic desktop controls (01h) Usage (Keyboard), ; Keyboard (06h, application collection) Collection (Application), Usage Page (Keyboard), ; Keyboard/keypad (07h) Usage Minimum (KB Leftcontrol), ; Keyboard left control (E0h, dynamic value) Usage Maximum (KB Right GUI), ; Keyboard right GUI (E7h, dynamic value) Logical Minimum (0), Logical Maximum (1), Report Size (1), Report Count (8), Input (Variable), Report Count (1), Report Size (8), Input (Constant), Report Count (5), Report Size (1), Usage Page (LED), ; LEDs (08h) Usage Minimum (01h), Usage Maximum (05h), Output (Variable), Report Count (1), Report Size (3), Output (Constant), Report Count (6), Report Size (8), Logical Minimum (0), Logical Maximum (1), ; Значение 1 здесь исправляется на 101 Usage Page (Keyboard), ; Keyboard/keypad (07h) Usage Minimum (None), ; No event (00h, selector) Usage Maximum (KB Application), ; Keyboard Application (65h, selector) Input, Usage Page (Desktop), ; Generic desktop controls (01h) Usage (Motion Wakeup), ; Motion wakeup (3Ch, one-shot control) Logical Minimum (0), Logical Maximum (255), Report Size (8), Report Count (8), Feature (Variable, Relative), End CollectionОригинальный дескриптор говорит, что каждый из шести байт начиная со смещения 3 - это индекс одной из ста (одновременно) нажатых кнопок (или 0), но диапазон этого индекса указан как [0, 1]. Указанный кусок кода исправляет этот диапазон чтобы вместить все кнопки и соответствовать тому что присылает девайс на самом деле, т.е. [0, 101].
Формат дескриптора допускает излишнюю информацию (это упрощает формат), и в нашем случае эта информация расходится.
Возможно HID спецификация регламентирует обработку таких ситуаций, а может и нет - надо посмотреть на досуге.
no subject
no subject