Зарегистрировать (/ связать / сопоставить) устройство с драйвером - PullRequest
4 голосов
/ 02 августа 2010

Я пишу драйвер USB (для геймпада) на Linux, и когда я подключаю его, ti загружает USB. Как я могу сделать так, чтобы он загружал мой драйвер (gp_driver)? Я сделал unbind usbhid и привязал к своему трюку с водителем, но я не хочу делать это каждый раз.

Должен ли я загрузить драйвер? Должен ли я что-то кодировать в моем драйвере? У меня есть продавец и идентификатор продукта в моем драйвере ..

спасибо

Ответы [ 3 ]

4 голосов
/ 02 августа 2010

Вы захотите создать правило udev для вашего устройства, которое может позаботиться о создании файла вашего устройства, установке разрешений для файла устройства и загрузке соответствующих драйверов.

Ресурсы

Пример

Взято из: http://plugcomputer.org/plugwiki/index.php/Load_Serial_Drivers_Automatically_Using_udev

# if no driver has claimed the interface yet, load ftdi_sio
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", \
        ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", \
        DRIVER=="", \
        RUN+="/sbin/modprobe -b ftdi_sio"
1 голос
/ 22 января 2019

Привязка (в вашем случае HID-) устройства к конкретному драйверу не является тривиальной задачей и зависит от используемой версии ядра :

Ядро <4.16 </h2> До ядра 4.16 вам пришлось редактировать и перекомпилировать drivers/hid/hid-core.c, так как этот файл содержал список устройств, которые не должны обрабатываться hid-generic (hid_have_special_driver struct), вы можете увидетьпример того, как это было сделано здесь: https://github.com/atar-axis/xpadneo/blob/master/misc/kernel_patches/0002-hid_generic_claims_devices.patch Ядро> = 4.16

Начиная с Ядра 4.16, список был удален и hid-generic проверяет, хочет ли устройство использовать какой-либо другой драйвересли так - то hid-generic отступает назад и не претендует на устройство.Связанный патч: https://github.com/torvalds/linux/commit/e04a0442d33b8cf183bba38646447b891bb02123#diff-88d50bd989bbdf3bbd2f3c5dcd4edcb9

Обходной путь (работает всегда)

Вы всегда можете использовать правило udev (например, /etc/udev/rules.d/99-xpadneo.rules), либо до 4.16, либо при наличии более одногоспециализированный драйвер в вашей системе:

# unbind the device from hid-generic on kernel < 4.16
# and bind it to the specialized driver (xpadneo in this case)
ACTION=="add", KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", SUBSYSTEM=="hid",\
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/hid-generic/unbind'", \
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/xpadneo/bind'"

# unbind the device from another specialized driver which came first
# and bind it to xpadneo
ACTION=="add", KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", SUBSYSTEM=="hid",\
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/microsoft/unbind'", \
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/xpadneo/bind'"

Примечания

  • Вместо bash вам следует использовать sh
  • Iне помню, когда bind и unbind где добавлено, но это довольно давно.

Вы можете прочитать немного больше о loading , привязка и регистрация (HID-) драйверов здесь:

1 голос
/ 02 августа 2010

Согласно этой Linux Journal статье вам необходимо иметь:

  1. Указатель на владельца модуля вашего драйвера
  2. Название драйвера USB
  3. Список идентификаторов USB, которые должен предоставить этот драйвер
  4. Функция зонда ()
  5. Функция отключения ()

Теперь, я подозреваю, поскольку он загружает стандартный драйвер, у вас может не быть 3, 4 или, возможно, вы вообще не зарегистрировали драйвер в подсистеме USB.

Я никогда раньше не писал драйвер USB (только взломанный char / mem.c), но эта информация может пригодиться.

...