Какие драйверы используются usb-мышью в ядре linux?

Я прочитал из главы 14 LDD3 о драйверах hotplug. Мне нужно написать драйвер мыши usb, который загружается при подключении оборудования. Теперь, проведя некоторый эксперимент, я узнал, что есть драйвер с именем "hid-generic", который вызывается при отключении от сети.

[ 6654.232046] usb 3-1: new low-speed USB device number 3 using uhci_hcd
[ 6654.462061] usb 3-1: New USB device found, idVendor=093a, idProduct=2510
[ 6654.462067] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 6654.462071] usb 3-1: Product: USB OPTICAL MOUSE
[ 6654.462074] usb 3-1: Manufacturer: PIXART
[ 6654.489316] input: PIXART USB OPTICAL MOUSE as /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input12
[ 6654.489445] hid-generic 0003:093A:2510.0004: input,hidraw0: USB HID v1.10 Mouse [PIXART USB OPTICAL MOUSE] on usb-0000:00:1d.1-1/input0

Также показывает lsmod,

Module                  Size  Used by
hid_generic            12541  0 
usbhid                 47259  0 
hid                   105241  2 hid_generic,usbhid
psmouse               102541  0 

Мои сомнения таковы:

1) Чтобы сделать загрузку модуля (hotplug), когда эта мышь подключается, я должен отключить эти 3 драйвера в ядре и построить целое ядро ​​с моим драйвером с идентификатором поставщика и устройства в id_table. Правильно?

2) Я также читал о основных драйверах USB и драйверах USB-устройств. Итак, эти драйверы HID являются основными драйверами или драйверами устройств?

3) Каковы основные драйверы и драйвер устройства в случае USB-мыши? И где я могу найти их в исходном тексте ядра?

Спасибо, Сунил.

Ответ 1

Я постараюсь ответить на ваши вопросы один за другим:

1) Чтобы сделать загрузку модуля (hotplug) при подключении этой мыши, я должен отключить эти 3 драйвера в ядре и построить целое ядро ​​с моим драйвером с идентификатором поставщика и устройства в id_table. Правильно?

Да, но есть некоторые дополнительные вещи, о которых вам нужно позаботиться. Сначала поймите, как загружается конкретный модуль (драйвер). Ключом к этому является MODULE_DEVICE_TABLE(usb, &my_id_table); Всякий раз, когда определенный модуль "устанавливается" (используя make modules_install), запись в соответствии с таблицей id, переданной в MODULE_DEVICE_TABLE, создается в файлах /lib/modules/<your_kernel>/modules.usbmap и /lib/modules/<your_kernel>/modules.dep (поиск строка "usbhid" в файлах). Когда обнаружено новое устройство USB, ядро ​​считывает эти файлы, чтобы найти соответствующие параметры. Если он найден, следующий модуль загружается из соответствующего пути, найденного в /lib/modules/<your_kernel>/modules.dep, который содержит информацию. о пути, в котором находится драйвер, а также его зависимостях.

Итак, теперь, даже если вы выгрузите (rmmod) usbhid из ядра, он будет снова загружен при повторной установке мыши. Чтобы этого избежать, вам необходимо изменить эти файлы, т.е. Удалить записи из файлов. Для этого "переместите" драйвер usbhid из его исходного пути (обычно расположенного в /lib/modules/<your_kernel>/kernel/drivers/hid/usbhid/usbhid.ko) в безопасное место. Теперь перестройте зависимости, чтобы записи были удалены из файлов зависимостей.

Теперь вам нужно создать записи своего драйвера. Просто установите ваш драйвер, и вам хорошо идти!

Итак, суммируем:

$ sudo rmmod usbhid                                      # Unload the usb mouse driver
$ cd /lib/modules/$(uname -r)/                           # Move to your current kernel
$ vim modules.usbmap                                     # Check for the "usbhid" string
$ vim modules.dep                                        # Check for "usbhid.ko:" string
$ sudo mv kernel/drivers/hid/usbhid/usbhid.ko ~/Desktop  # Take backup of your current 
                                                           usb mouse driver
$ sudo depmod -a                                         # Rebuild the dependency files

Теперь снова проверьте файлы зависимостей для строки "usbhid". Его не должно быть!

$ cd /path/to/your/driver
$ sudo make modules_install  # Install your driver into /lib/modules/$(uname -r)/extra
$ sudo depmod -a             # Rebuild the dependency files

После этого шага найдите строку, соответствующую вашему модулю в файлах зависимостей, и она должна быть там! С этого момента всякий раз, когда вы вставляете мышь (или из самой загрузки), ваш драйвер будет загружен вместо оригинала.

Как только вы закончите играть со своим драйвером, вы можете скопировать исходный файл usbhid в исходный пункт назначения и перестроить файлы зависимостей (sudo depmod -a)

Теперь я также вижу, что вы пытаетесь использовать идентификатор поставщика и устройства в соответствии с вашим устройством, и в этом случае драйвер будет работать только для вашей мыши. Рекомендуемый способ - использовать идентификаторы классов, что заставляет ваш драйвер работать с usb-мышью любой.


2) Я также читал о основных драйверах USB и драйверах USB-устройств. Итак, эти драйверы HID являются основными драйверами или драйверами устройств?

usbhid - это в основном "драйвер устройства". Классификация драйверов может быть представлена ​​в виде: основных драйверов, драйверов хост-контроллера и драйверов устройств:

Драйверы устройств: Это программное обеспечение, используемое для управления устройствами. Например, usb mouse, pci based ethernet card, usb pendrive, акселерометр на основе i2c.

Драйверы хост-контроллера: Это программное обеспечение, предназначенное для управления контроллером шины. Например, USB Host Controllers (EHCI, UHCI, OHCI и т.д.), PCI Host Controller, I2C Masters и т.д.

Основные драйверы: На самом деле они склеивают вышеупомянутые драйверы. Примерами являются ядро ​​USB, ядро ​​PCI и т.д. Основные драйверы предоставляют вспомогательные подпрограммы (API), которые могут использовать драйвер устройства и хост-контроллера (концепция укладки модулей!). Это те, которые привязывают правильное устройство к его драйверу. Существует множество других услуг, предоставляемых основными драйверами.

Пример кода для драйвера USB-устройства:

http://lxr.free-electrons.com/source/drivers/hid/usbhid/usbmouse.c

Вы можете найти драйверы хост-контроллера USB по адресу:

http://lxr.free-electrons.com/source/drivers/usb/host/

USB Core находится здесь: http://lxr.free-electrons.com/source/drivers/usb/core/

Я думаю, что это также отвечает на ваш третий вопрос!

Надеюсь, что это помогло.

Ответ 2

Драйвер устройства usbhid.

Чтобы он не подключался к вашему устройству, добавьте запись HID_QUIRK_IGNORE в drivers/hid/usbhid/hid-quirks.c или используйте параметр quirks модуля usbhid.