Which drivers are used by usb mouse in linux kernel?
Yes, but there are some additional things you need to take care of. First understand how a particular module(driver) gets loaded. The key to this is MODULE_DEVICE_TABLE(usb, &my_id_table); Whenever a particular module is «installed» (using make modules_install ), an entry, according to the id table passed in MODULE_DEVICE_TABLE gets created in /lib/modules//modules.usbmap and /lib/modules//modules.dep file(search for the string «usbhid» in the files). Whenever a new usb device is detected, the kernel reads these files to find the matching parameters. If it is found, the following module is loaded from the corresponding path found in /lib/modules//modules.dep which holds the info. about the path where the driver is located and also its dependencies.
So, now even if you unload(rmmod) usbhid from the kernel, it will be loaded again when you re-insert your mouse. To avoid this from happening you need to modify those files, i.e. remove the entries from the files. To do so, «move» the usbhid driver from its original path(generally located at /lib/modules//kernel/drivers/hid/usbhid/usbhid.ko to a safe place. Now rebuild the dependencies such that the entries would be removed from the dependency files.
Now you need to create entries of your driver. Just install your driver and you are good to go!
$ 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
Now check the dependency files for the string «usbhid» again. It shouldn’t be there!
$ 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
After this step, search for the string corresponding to your module in the dependency files, and it should be there! From this moment on, whenever you insert the mouse(or from boot itself) your driver will be loaded, instead of the original.
Once your are done playing with your driver, you may copy back the original usbhid file to its original destination and rebuild the dependency files ( sudo depmod -a )
Now I also see that you are trying to use vendor and device id to match your device, in which case, the driver would work only for your mouse. The recommended way is to use class ids, which makes your driver work for any usb mouse.
2) I also read about USB core drivers and USB device drivers. So these HID drivers are core drivers or device drivers?
usbhid is basically a «device driver». The classification of drivers could be briefed out as : core drivers, host controller drivers and device drivers :
Device Drivers : This is the software used to control the devices. For example usb mouse, pci based ethernet card, usb pendrive, i2c based accelerometer.
Host Controller Drivers : This is the software written to control the bus controller. For example USB Host Controllers(EHCI, UHCI, OHCI, etc.), PCI Host Controller, I2C Masters, etc.
Core Drivers : These actually glues up the above discussed drivers. Examples are USB core, PCI core, etc. Core drivers provides helper routines(APIs) such that the device and host-controller driver could make use of them(concept of module stacking!). These are the ones, which bind the correct device to its driver. There are many other services provided by the core drivers.
Example code for USB Device Driver :
You may find the USB Host Controller Drivers under :
I think this also answers your third question!
Solution 2
The device driver is usbhid .
To prevent it from attaching to your device, add a HID_QUIRK_IGNORE entry to drivers/hid/usbhid/hid-quirks.c , or use the quirks parameter of the usbhid module.
Какие драйверы используются usb-мышью в ядре Linux?
Я прочитал из главы 14 LDD3 о драйверах горячего подключения. Мне нужно написать драйвер мыши 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
Module Size Used by hid_generic 12541 0 usbhid 47259 0 hid 105241 2 hid_generic,usbhid psmouse 102541 0
Мои сомнения заключаются в следующем,
1) Чтобы мой модуль загружался (горячее подключение), когда эта мышь подключается, мне нужно отключить эти 3 драйвера в ядре и собрать все ядро с моим драйвером с идентификатором поставщика и устройства в id_table. Верно?
2) Я также читал о драйверах ядра USB и драйверах устройств USB. Значит, эти драйверы HID являются основными драйверами или драйверами устройств?
3) Какие основные драйверы и драйвер устройства для USB-мыши? А где их найти в исходниках ядра?
Psmouse — это драйвер устройства, отвечающий за обнаружение событий мыши в Linux, если вы отключите его, то есть $ sudo rmmod psmouse, вы не сможете обнаруживать события мыши на своем ПК.
2 ответа
Постараюсь по очереди ответить на ваши вопросы:
1) Чтобы мой модуль загружался (горячее подключение), когда эта мышь подключается, я должен отключить эти 3 драйвера в ядре и собрать все ядро с моим драйвером с идентификатором поставщика и устройства в id_table. Верно?
Да, но вам нужно позаботиться о некоторых дополнительных вещах. Сначала разберитесь, как загружается конкретный модуль (драйвер). Ключ к этому — MODULE_DEVICE_TABLE(usb, &my_id_table); . Каждый раз, когда определенный модуль «устанавливается» (с использованием make modules_install ), запись в соответствии с таблицей идентификаторов, переданной в MODULE_DEVICE_TABLE , создается в /lib/modules//modules.usbmap и файл /lib/modules//modules.dep (ищите в файлах строку «usbhid»). Каждый раз, когда обнаруживается новое устройство USB, ядро считывает эти файлы, чтобы найти соответствующие параметры. Если он найден, следующий модуль загружается из соответствующего пути, найденного в /lib/modules//modules.dep , который содержит информацию. о пути, по которому находится драйвер, а также о его зависимостях.
Итак, теперь, даже если вы выгрузите (rmmod) usbhid из ядра, оно будет загружено снова, когда вы снова вставите мышь. Чтобы этого не произошло, вам необходимо изменить эти файлы, т.е. удалить записи из файлов. Для этого «переместите» драйвер usbhid с его исходного пути (обычно расположенного в /lib/modules//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-мышь, Ethernet-карта на базе pci, USB-накопитель, акселерометр на базе i2c.
Драйверы хост-контроллера . Это программное обеспечение, написанное для управления контроллером шины. Например, хост-контроллеры USB (EHCI, UHCI, OHCI и т. Д.), Хост-контроллер PCI, мастера I2C и т. Д.
Основные драйверы . Фактически они склеивают упомянутые выше драйверы. Примерами являются ядро USB, ядро PCI и т. Д. Драйверы ядра предоставляют вспомогательные процедуры (API), чтобы устройство и драйвер хост-контроллера могли их использовать (концепция стекирования модулей!). Это те, которые привязывают правильное устройство к его драйверу. Есть много других услуг, предоставляемых основными драйверами.
Пример кода для драйвера USB-устройства:
Вы можете найти драйверы USB Host Controller в следующих разделах:
Думаю, это тоже ответ на ваш третий вопрос!