November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Monday, January 3rd, 2011 07:53 pm

На самом деле это не клавиатура, а ИК-пульт, но с точки зрения ОС это комплект из 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

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Monday, January 3rd, 2011 10:01 pm (UTC)
Чтобы помочь мне разобраться надо будет сделать дамп report descriptor'а.
С помощью моей утилитки (http://digimend.sourceforge.net/#proj-usbhid-dump).
Monday, January 3rd, 2011 10:26 pm (UTC)
003:002:001:DESCRIPTOR         1294093132.612876
 05 01 09 02 A1 01 85 01 09 01 A1 00 05 09 19 01
 29 05 15 00 25 01 95 05 75 01 81 02 95 01 75 03
 81 03 05 01 09 30 09 31 09 38 15 81 25 7F 75 08
 95 03 81 06 05 0C 0A 38 02 95 01 75 08 81 06 C0
 09 3C 15 00 26 FF 00 75 08 95 08 B1 06 C0 05 0C
 09 01 A1 01 85 02 19 00 2A 3C 02 15 00 26 3C 02
 95 01 75 10 81 00 C0 05 01 09 80 A1 01 85 03 19
 81 29 83 15 00 25 01 75 01 95 03 81 02 95 05 81
 01 C0

003:002:000:DESCRIPTOR         1294093132.626838
 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
 75 01 95 08 81 02 95 01 75 08 81 01 95 05 75 01
 05 08 19 01 29 05 91 02 95 01 75 03 91 01 95 06
 75 08 15 00 25 01 05 07 19 00 29 65 81 00 05 01
 09 3C 15 00 26 FF 00 75 08 95 08 B1 06 C0


Tuesday, January 4th, 2011 07:59 am (UTC)
Это время может занять, если вдруг spb_nick разберётся и отпишет что -- сделай новый пост.
Tuesday, January 4th, 2011 08:02 am (UTC)
В общем-то, есть только два варианта: кривой дескриптор или кривая его обработка.
Tuesday, January 4th, 2011 11:25 am (UTC)
Банально разработчик ошибся в дескрипторе.
Тестировалось только на Windows, где драйвер это проинтерпретировал так, а Linux'овый по-другому.

Сейчас поподробней напишу.
Tuesday, January 4th, 2011 11:39 am (UTC)
Исправляется дескриптор клавиатуры на интерфейсе 0.

Вот он:
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 спецификация регламентирует обработку таких ситуаций, а может и нет - надо посмотреть на досуге.
Tuesday, January 4th, 2011 11:49 am (UTC)
Ага, спасибо. Интересно, как же оно работает в windows. То ли там явный фикс для этого девайса есть, то ли как-то по умолчанию такой явно неправильный диапазон увеличивает до разумных пределов.
Tuesday, January 4th, 2011 11:52 am (UTC)
Скорее всего увеличивает диапазон просто. Хотя, я не уверен, что это правильно. Все-таки, диапазон значений важнее, чем описание каждого их этих значений.