Ответ 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/
Я думаю, что это также отвечает на ваш третий вопрос!
Надеюсь, что это помогло.