Как использовать драйвер связывания / снятия привязки драйвера ядра Linux для устройств USB-HID?

26

Первый фон Я разрабатываю драйвер для игровых панелей Logitech. Это клавиатура с экраном на нем. Драйвер работает хорошо, но по умолчанию устройство обрабатывается HID. Чтобы не допустить захвата устройства HID перед моим драйвером, я могу внести его в черный список в hid-core.c. Это работает, но это не лучшее решение, так как я работаю с несколькими людьми, и мы все должны продолжать исправлять наш HID-модуль, который становится рутиной, особенно потому, что он часто требует пересоздания initramfs и тому подобного.

Я провел некоторое исследование по этой проблеме и нашел этот пост в списке рассылки , который в конечном итоге привел меня к этой статье на LWN . Здесь описан механизм привязки устройств к конкретным драйверам во время выполнения. Кажется, это именно то, что мне нужно.

Итак, я попробовал это. Я смог отсоединить клавиатуру от HID. Это сработало, и, как и ожидалось, я больше не мог печатать на нем. Но когда я пытался привязать его к нашему драйверу, я получаю «ошибку: такого устройства нет», и операция завершается неудачно.

Итак, мой вопрос: как я могу использовать операции связывания / отсоединения ядра, чтобы реплицировать то, что происходит, когда вы заносите устройство HID в черный список в hid-core и предоставляете свой собственный драйвер? - то есть - заменить необходимость все время исправлять hid-core.c?

Источник нашего драйвера находится здесь: https://github.com/ali1234/lg4l

ali1234
источник

Ответы:

27

Хорошо, оказывается, ответ смотрел мне в лицо.

Во-первых, независимо от того, используете ли вы наш пользовательский драйвер или универсальный драйвер, который обычно захватывает устройство, все это в конечном итоге все же контролируется HID, а не USB.

Ранее я пытался отвязать его от HID, что не является подходящим способом. HID имеет под-драйверы, тот, который принимает устройства, которые не имеют специализированного драйвера, называется generic-usb. Это то, от чего мне нужно было избавиться, прежде чем связываться с hid-g19. Кроме того, мне нужно было использовать адрес HID, который выглядит как «0003: 046d: c229.0036», а не адрес USB, который выглядит как «1-1.1: 1.1».

Так что перед повторной привязкой я бы увидел это на dmesg:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Тогда я делаю:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

И тогда я вижу на dmesg:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Как я уже сказал, глядя мне в лицо, потому что две ключевые части информации - это первые две вещи на линии, когда устройство связывается ...

ali1234
источник
Вы должны были указать в своем драйвере, что этот поставщик / продукт совместим с вашим драйвером? Или «связывание» просто вызывает проблему. Я получаю «нет такого устройства» для устройства, которое было занесено в черный список, но я хочу, чтобы оно было связано, и я представляю, что черный список - это не просто «предотвращение автоматического связывания», а «предотвращение связывания». что за тип вещи
Дмансфилд
Связывание форсирует его, поэтому не требуется запрашивать идентификаторы в источнике драйвера. Однако, если вы хотите, чтобы он загружался автоматически.
ali1234
У меня возникли две причины: во-первых, устройство занесено в список ядра hid_ignore_list, и поэтому оно не получит привязанный к номеру предмет. Мне пришлось добавить «usbhid.quirks = 0x0b0e: 0x0412: 0x40000000» в командную строку ядра и перезагрузиться. Флаг 0x40000000 - «не игнорировать». Во-вторых, последняя часть идентификатора «0003: 046D: C229.0036» равна «0036». Что это представляет? Не уверена. Единственный способ найти его (кажется) состоит в том, чтобы связать его уже, затем развязать и снова связать.
Дмансфилд
Вы нашли способ переподключения автоматически?
Владик
Добавил мое собственное решение для автоматического переплета: unix.stackexchange.com/a/475277/96686
Vladius 13.10-18