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 в любой форме и любом объёме

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)
Скорее всего увеличивает диапазон просто. Хотя, я не уверен, что это правильно. Все-таки, диапазон значений важнее, чем описание каждого их этих значений.