Драйвер компьютерной мыши это модуль ядра

Обновлено: 02.06.2024

Существует бесконечное множество аппаратных конфигураций, рассмотреть каждую из которых не представляется возможным. Даже если говорить только о типах устройств, и то рассмотреть их все будет трудновато. А, поскольку данная книга предназначена для начинающих пользователей Linux, будем для простоты считать, что компьютер такого пользователя имеет следующую конфигурацию:

  • жесткий диск достаточно большого объема, разбитый на три раздела (раздел для DOS/Windows, раздел для Linux, swap-раздел);
  • дисковод для гибких дисков на 3,5 дюйма;
  • дисковод CD-ROM;
  • принтер;
  • клавиатура;
  • мышь;
  • звуковая карта;
  • модем;
  • внешний дисковод Zip фирмы Iomega, подключаемый через параллельный порт.

Вопросы настройки перечисленных аппаратных компонентов и рассмотрим. Причем, поскольку настройка монитора была разобрана в "Графический интерфейс" , а о подключении и настройке модема будет рассказано в разделе, посвященном работе в Интернете, то нам остается рассмотреть только 8 типов устройств. Но, прежде чем переходить к рассказу об устройствах конкретных типов, необходимо пояснить такие общие понятия как драйвер устройства и специальный файл устройства .

Драйверы устройств

Как уже говорилось выше, одной из основных задач операционной системы является управление аппаратной частью. Ту программу или тот кусок программного кода, который предназначен для управления конкретным устройством, и называют обычно драйвером устройства. Необходимость драйверов устройств в операционной системе объясняется тем, что каждое отдельное устройство воспринимает только свой строго фиксированный набор специализированных команд, с помощью которых этим устройством можно управлять. Причем команды эти чаще всего предназначены для выполнения каких-то простых элементарных операций. Если бы каждое приложение вынуждено было использовать только эти команды, писать приложения было бы очень сложно, да и размер их был бы очень велик. Поэтому приложения обычно используют какие-то команды высокого уровня (типа "записать файл на диск"), а о преобразовании этих команд в управляющие последовательности для конкретного устройства заботится драйвер этого устройства. Поэтому каждое отдельное устройство, будь то дисковод, клавиатура или принтер, должно иметь свой программный драйвер, который выполняет роль транслятора или связующего звена между аппаратной частью устройства и программными приложениями, использующими это устройство.

В Linux драйверы устройств бывают трех типов.

Драйверы первого типа являются частью программного кода ядра (встроены в ядро). Соответствующие устройства автоматически обнаруживаются системой и становятся доступны для приложений. Обычно таким образом обеспечивается поддержка тех устройств, которые необходимы для монтирования корневой файловой системы и запуска компьютера. Примерами таких устройств являются стандартный видеоконтроллер VGA, контроллеры IDE-дисков, материнская плата, последовательные и параллельные порты.

Драйверы второго типа представлены модулями ядра. Они оформлены в виде отдельных файлов и для их подключения (на этапе загрузки или впоследствии) необходимо выполнить отдельную команду подключения модуля , после чего будет обеспечено управление соответствующим устройством. Если необходимость в использовании устройства отпала, модуль можно выгрузить из памяти (отключить). Поэтому использование модулей обеспечивает большую гибкость, так как каждый такой драйвер может быть переконфигурирован без остановки системы . Модули часто используются для управления такими устройствами как SCSI-адаптеры, звуковые и сетевые карты.

Файлы модулей ядра располагаются в подкаталогах каталога /lib/modules . Обычно при инсталляции системы задается перечень модулей, которые будут автоматически подключаться на этапе загрузки. Список загружаемых модулей хранится в файле /etc/modules . А в файле /etc/modules.conf находится перечень опций для таких модулей. Редактировать этот файл "вручную" не рекомендуется, для этого существуют специальные скрипты (типа update-modules).

Для подключения или отключения модулей в работающей системе имеются специальные утилиты.


Модуль ядра и драйвер устройства
Здравствуйте, чем отличается модуль ядра от драйвера устройства? Само понятие. Если я правильно.

Модуль ядра не компилируется в Ubuntu-18.04
Здравствуйте! Есть маленький модуль ядра, он компилируется в Astra Linux 1.4, но не.


Модуль ядра изменяющий IP пакет
Возник такой вопрос, я немного изучил windows filteroing platform, а аналог драйвера под windows.

Модуль пространства ядра WinXP.
В модуль пространства ядра подгружается фаил "yk51x86.sys" из C:\WINDOWS\system32\DRIVERS это.

Модуль тут не нужен, достаточно читать из файла устройства из юзерспейса. Или это постановка задачи такая?

да,задача именно модуль написать.

Добавлено через 23 часа 43 минуты
с обычным кодом разобрался. читаю с dev/input/mouse, всё работает. теперь вот не понятно,как это оформить в модуль ядра. будьте добры, подкиньте умных мыслей.

Решение

ну если ты хочешь непременно читать файл из ядра, то вот код какой то набросал
кстати говоря ты писал что из mouse0 читаешь, но я никаких сигналов отмышки перехватить из него не смог, так как его тупо никто не читает

так как я не эксперт по этой части, методом научного тыка выяснил, что нужно читать event1, только там и клава и мышь в одной куче как я понял, но раз ты из юзерспейса чтото читал, значит и здесь сможешь. Добавишь после вызова oldread из newrad парсинг переменной __buffer, только она помечена как __user, поэтому не забывай использовать функции copy_*_user вм есто прямого к ней обращения.

Ну и вообще это крайне плохой способ, из ядра в общем случае нельзя открывать, читать или писать файлы таким образом. Насколько я понимаю insmod вызывает системный вызов sys_init_module, а он вызывает init функцию модуля, которая вызывает filp_open. Но от чьего имени открывается файл? Есть такой указатель current, который указывает на task_struct, который собственно и прервал ядро системным вызовом, получаетчся от его имени втихаря был открыт какой-то файл, это же нехорошо?

Есть хороший и очень простой способ навешивать хуки на различные функции, в том числе не экспортированные ядром. Это kprobes(точнее kretprobe в данном случае). Найти функцию, в том числе неэкспортированную можно с помощью kallsyms_lookup_name(). Но для этого необходимо собрать ядро с поддержкой kprobes, так как это довольно специфичная функция и пользуются ей только хаккеры, то в конфигах большинства дистров по дефолту она не включена

Как вы уже знаете, при настройке ядра можно включить или отключить некоторые свойства ядра, например, вы можете разрешить или запретить использование конкретного Ethernet-адаптера. На рис. 1.1 видно, что существуют опции, значения которых можно выбирать более чем из двух возможных вариантов. В качестве примера рассмотрим опцию Packet Socket. Для этой опции могут быть заданы значения Y, M и N. Значение Y (Yes) указывает на то, что средства, соответствующие данной опции, должны быть включены в основной файл ядра, а значение N (No) запрещает использование этих средств. Значение M задает некоторое "промежуточное" решение. Если вы выберете значение M, то соответствующие средства будут скомпилированы, но не войдут в основной файл ядра. Вместо этого фрагмент кода будет реализован как отдельный модуль ядра, который по мере надобности загружается или удаляется из памяти. Для опций, являющихся подопциями других опций (например, Packet Socket: Mmapped IO, показанной на рис. 1.1), значение M обычно не предусмотрено. Решение о включении их в основной файл ядра или реализации в виде отдельного модуля принимается в зависимости от значения родительской опции.

Средства, включенные в основной файл ядра, доступны с момента загрузки системы и до окончания ее работы. Ситуация, при которой фрагмент кода будет удален из памяти, возникнуть не может. Существуют опции, для которых реализующий их программный код должен быть включен в основной файл ядра. Так, например, файловая система, в которой содержится корневой каталог системы, должна быть доступна с момента загрузки, поэтому соответствующий драйвер должен быть включен непосредственно в ядро. Если вы установили рассмотренную ранее опцию Root File System on NFS, вам придется скомпилировать средства поддержки сетевых устройств и включить их в ядро.

На первый взгляд может показаться, что все средства, которые будут использоваться при работе системы, следует включить в основной файл ядра, однако такой подход имеет серьезный недостаток: при этом увеличивается объем оперативной памяти, занимаемой ядром. Кроме того, размер файла ядра на диске также увеличивается, что может создавать трудности при загрузке системы. Поэтому в системе Linux предусмотрена возможность компилировать средства, соответствующие большей части опций, в виде модулей. Это позволяет работать с ядром небольшого размера и в то же время обеспечивает поддержку большого количества разнообразных устройств. В частности, в виде модулей могут быть скомпилированы средства для работы с большинством сетевых устройств, поэтому драйверы, включаемые в состав дистрибутивных пакетов, обычно подготавливаются именно в таком виде.

Если администрирование компьютера под управлением Linux является вашей обязанностью, то именно вам предстоит решить, следует ли использовать драйверы сетевых карт, реализованные в виде модулей, или их следует включить в состав ядра. Если вы включите драйвер сетевой карты непосредственно в ядро системы, вам не придется обеспечивать при настройке системы, чтобы перед началом сетевого обмена загружался требуемый модуль. (На самом деле система, поставляемая как дистрибутивный пакет, изначально сконфигурирована так, что данная задача решается корректно.) С другой стороны, если вы администрируете большое количество компьютеров, на которых установлена система Linux, то, возможно, предпочтете создать ядро и набор модулей, которые будете устанавливать на различные компьютеры. В этом случае целесообразно реализовать драйверы в виде модулей.

Программные средства поддержки стека протоколов также могут быть непосредственно включены в ядро или скомпилированы как модули. (Исключением являются протоколы TCP/IP; их можно либо включить в основной файл ядра, либо не использовать вовсе; в виде модулей можно реализовать лишь средства, соответствующие некоторым подопциям опции, управляющей использованием данного стека протоколов.) Так, например, если вы знаете, что каталоги в файловых системах других компьютеров, предоставляемые средствами NFS, будут использоваться лишь непродолжительное время, целесообразно реализовать средства поддержки клиента NFS как отдельный модуль. Поступив таким образом, вы сэкономите часть оперативной памяти в течение времени, когда средства NFS не используются, но монтирование внешних каталогов будет осуществляться несколько дольше, чем это было бы в том случае, если бы фрагмент кода, реализующий клиент NFS, был включен непосредственно в ядро.

Драйверы устройств

Драйверы устройств Драйверы устройств обеспечивают интерфейс между ядром UNIX и аппаратной частью компьютера. Благодаря этому от остальной части ядра скрыты архитектурные особенности компьютера, что значительно упрощает перенос системы и поддержку работы различных

10.2 ДИСКОВЫЕ ДРАЙВЕРЫ

10.2 ДИСКОВЫЕ ДРАЙВЕРЫ Так сложилось исторически, что дисковые устройства в системах UNIX разбивались на разделы, содержащие различные файловые системы, что означало "деление [дискового] пакета на несколько управляемых по-своему частей" (см. [System V 84b]). Например, если на диске

10.3 ТЕРМИНАЛЬНЫЕ ДРАЙВЕРЫ

10.3 ТЕРМИНАЛЬНЫЕ ДРАЙВЕРЫ Терминальные драйверы выполняют ту же функцию, что и остальные драйверы: управление передачей данных от и на терминалы. Однако, терминалы имеют одну особенность, связанную с тем, что они обеспечивают интерфейс пользователя с системой.

12.3.3.3 Драйверы

12.3.3.3 Драйверы В многопроцессорной реализации вычислительной системы на базе компьютеров AT&T 3B20 семафоры в структуру загрузочного кода драйверов не включаются, а операции типа P и V выполняются в точках входа в каждый драйвер (см. [Bach 84]). В главе 10 мы говорили о том, что

9.1. Драйверы устройств

9.1. Драйверы устройств Как уже говорилось выше, одной из основных задач операционной системы является управление аппаратной частью. Ту программу или тот кусок программного кода, который предназначен для управления конкретным устройством, и называют обычно драйвером

Драйверы телефонии Zapata

Драйверы телефонии Zapata Компиляция драйверов телефонии Zapata для использования с оборудованием Digium проста; однако из-за различия сред сборки в версиях 1.2 и 1.4 для этого применяются немного разные методы. Сначала необходимо выполнить команду . /configu re, чтобы определить, какие

Драйверы

Драйверы Поговорим об очередном преимуществе Ubuntu Linux.Если вспомнить момент установки Windows, когда установка прошла, но осталось поставить драйвера, то я уверен, что каждый может вспомнить копание по полкам и шкафам в поисках дров к нашему ненаглядному компьютеру. Ubuntu

1.6 Драйверы и буферы ввода-вывода

1.6 Драйверы и буферы ввода-вывода В этом разделе рассматриваются буферы ввода-вывода, которые уже упоминались ранее в главе. Драйверы используют буферы для осуществления ввода-вывода и управления им (IOCTL). Для этого драйверы посредством соответствующего объекта

24.2 Драйверы

24.2 Драйверы Вообще говоря, в Ubuntu по умолчанию присутствуют все необходимые драйверы для всего поддерживаемого оборудования. Однако для некоторых устройств существуют также проприетарные драйверы от производителя, которые из-за забористых лицензий необходимо

Драйверы

Драйверы Драйверы — это специальные программы, управляющие работой оборудования, для которого они были написаны. Сейчас практически каждое устройство — от оптической мыши до видеокамеры — требует для своего взаимодействия с компьютером отдельный драйвер. Конечно, не

УСТАНАВЛИВАЕМ ДРАЙВЕРЫ

5.2.8. Условия и драйверы

5.2.8. Условия и драйверы Некоторые условия могут требовать специфической обработки. Эти условия могут касаться ошибок или общего управления потоком данных внутри

Глава 13. Драйверы

Глава 13. Драйверы Как известно, для управления устройствами, входящими в состав компьютера, служат небольшие программы — драйверы. Для нормальной работы сканера также необходим драйвер, причем для каждой модели эта программа разрабатывается отдельно. Но «услуги»

Драйверы с цифровой подписью

Драйверы с цифровой подписью Никто не будет отрицать, что значительная часть потенциальных проблем безопасности операционных систем связана именно с драйверами. По заявлениям Microsoft, x64-версии Vista будут допускать установку драйверов исключительно с цифровой подписью.

Драйвер- (1) Модуль ядра: три элемента модуля ядра, команда модуля драйвера, уровень печати printk, многофайловая компиляция драйвера.

Модуль

Общая земля: операционное оборудование
Разница:
1. Драйвер легко переносится.

2. Привод может быть модульным.

3. Операция Arm на голом железе не требует ядра, для работы драйвера требуется ядро.

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

5. Способ работы с оборудованием отличается от «голого металла»: «голое железо» напрямую управляет оборудованием, драйвер управляется работой приложения, а затем драйвер управляет оборудованием. (Поскольку ARM может напрямую манипулировать физическим адресом: регистр, но драйвер не может напрямую манипулировать регистром. Драйвер управляет виртуальным адресом, отображаемым из физического адреса через MMU.

6. Пространство ядра (3G-4G), в котором запущен драйвер.

7. Драйвер имеет фиксированный вход и выход; (вход и выход из чистого металла ARM являются основной функцией, все операции выполняются в основной функции для работы с оборудованием)

8. Прикладная программа обращается к ядру.Ядро сопоставляет физический адрес с виртуальным адресом через MMU, а затем драйвер управляет оборудованием.

(1)Когда каждый процесс запущен, ядро ​​открывает для него отдельное виртуальное пространство пользователя (0G-3G), но имеет общий доступ к тому же пространству ядра.
Виртуальный адрес, соответствующий каждому процессу, может быть одинаковым, но в mmap физический адрес, соответствующий каждому виртуальному адресу, и занимаемое пространство физической памяти различаются.
например: когда процесс открывает файл, fd начинается с 3; когда другой процесс открывает файл, fd также начинается с 3. Это показывает, что виртуальная память, занятая каждым процессом, не зависит друг от друга.


(2) Почему эффективность разделяемой памяти высока?

Три элемента модуля ядра

(1) Роль статики: ограничить область действия функции только в этом файле.
Поскольку вход и выход всех модулей находятся в этом шаблоне формата, если stctic не записан, он будет конфликтовать с входом и выходом других модулей дисковода.
(2) demo_init: адрес функции входа
(3) __init: cd kernel -> vi -t __init Просмотрите определение __init:

(2) Экспорт

static void __exit demo_exit(void);
__section (.exit.text) сообщает компилятору указать функцию, указанную __exit, в разделе .exit.text скрипта связи.

(3) Лицензия

Лицензия: следуйте соглашению с открытым исходным кодом "GPL"

(4) Отслеживание файла заголовка диска

В верхнем каталоге ядра сделайте теги -> vi -t module_init
Выйдите и включите содержимое файла заголовка после включения:

Отслеживание кода: ctags

(1) Установите ctags

(Два) создать индекс
Если вы хотите отслеживать код, вам нужно перейти в верхний каталог соответствующего файла и создать теги индекса для всех файлов.
Обычный файл:
ctags -R

Файл ядра: генерировать теги в соответствии с Makefile в верхнем каталоге ядра с более полным содержанием
make tags

(3) Код отслеживания
ввод терминала:vi -t контент, за которым нужно следить

Как отследить код в файле:
Введите файл, выберите код для выполнения,
ctrl +] (правая скобка): вперёд
ctrl + t: назад, возврат

Компиляция модуля драйвера: uImage

(1) Скопируйте созданный вами модуль драйвера demo.c в каталог драйверов символьных устройств соответствующей версии ядра:
/kernel/drivers/char

(2) Добавьте информацию о компиляции драйвера символьного устройства, откройте Kconfig в / kernel / drivers / char,
Добавьте информацию о драйвере:

(3) Настройте главное меню: вернитесь в верхний каталог, сделайте menuconfig и войдите в меню для отображения:
Device Drivers —》 Character devices —》[ ] module_demo (new)
Имя настраиваемого меню, выберите: y или пробел
Информация об успешной настройке: конфигурация записывается в .config // записывает информацию о конфигурации в файл .config

(4) Отслеживание файла .config: просмотр сохраненной информации о конфигурации
В верхнем каталоге ls -a: вы можете просмотреть скрытый файл .config.
vi .config: откройте файл .config и найдите имя пользовательской переменной в командной строке: / MOUDLE_DEMO
Имя пользовательской переменной в Kconfig:
config MOUDLE_DEMO становится именем переменной в файле .config: CONFIG_MOUDLE_DEMO = y

(5) Вышеупомянутые 4 шага представляют собой только связанные операции конфигурации для драйвера, который будет скомпилирован, чтобы получить окончательную переменную конфигурации = y:
CONFIG_MOUDLE_DEMO=y// - y означает выбранный, скомпилировать драйвер в ядро.

Но реальный процесс компиляции управляется и выполняется Makefile в каталоге / kernel / drivers / char /.
Следовательно, переменные конфигурации необходимо добавить в Makefile.

Примечание: demo.o полагается на demo.c, написанный мной

(6) Скомпилируйте драйвер в ядро:
make uImage: создание образа ядра uImage для компиляции драйвера.
make modules: скомпилировать все модули драйверов в каталоге ядра, чтобы они не зависели от uImage
независимый файл demo.ko (модуль привода)

Способ составления

1. Внутренняя компиляция: компилировать в дереве исходных кодов ядра.
2. Внешняя компиляция: компиляция вне дерева исходного кода ядра.
3. Статическая компиляция: модуль драйвера, сгенерированный статической компиляцией, может быть выполнен отдельно (uImage) // Подобная ссылка статической библиотеки
4. Динамическая компиляция: компилируйте и генерируйте файлы .ko, которые должны полагаться на uImage для выполнения.// Динамическая библиотека похожих ссылок

Настройте процесс компиляции: Makefile

Поскольку описанный выше процесс внутренней статической компиляции слишком сложен, эффективность интеграции драйвера в uImage слишком мала. Следовательно, более эффективно использовать внешнюю динамическую компиляцию.
Общий процесс компиляции Makefile:

Расположение ядра Linux: /lib/modules/3.2.0-29-generic-pae/build/
uname -r: получить версию ядра
$ (shell uname -r): получить версию ядра Linux на любом компьютере.
Общая версия ядра Linux: текущий путь к ядру в Linux.

Результат выполнения linux показывает:

(1) Команда

1)Установите драйвер: sudo insmod demo.ko
или su root -》 insmod demo.ko

2)Удалите драйвер: sudo rmmod demo

3)Посмотреть драйвер: lsmod

4)Просмотрите информацию о печати ядра: dmesg
сначала sudo dmesg -c echo, а затем очистите информацию для печати
sudo dmesg -C напрямую очищает информацию для печати

5) ПросмотрИнформация о модуле:modinfo demo.ko

(2) Печать в ядре: printk (ядро печати)

8 уровней печати в ядре: чем меньше число, тем выше уровень

1) grep "printk" * -nR: Рекурсивный поиск с использованием printk

2) Код отслеживания: vi -t KERN_INFO

4) Просмотр текущего уровня терминала
Просмотрите текущий уровень терминала и запишите его в следующий файл:/proc/sys/kernel/printk

Терминал ubuntu был изменен разработчиком, независимо от уровня, информация о печати ядра не будет активно отображаться.
Только когда вы входите в виртуальный терминал, вы можете видеть информацию для печати.
Введите: (fn) ctrl + alt +
Выход: (fn) ctrl + alt + F7

5)Активно просматривайте информацию о печати ядра: dmesg
сначала sudo dmesg -c echo, а затем очистите информацию для печати
sudo dmesg -C напрямую очищает информацию для печати

6) Смена суперпользователя (суперадминистратора): su root
7) Измените пароль: sudo passwd root

Напишите код с несколькими функциями, инкапсулируйте каждую функцию в файл .c, затем вызовите каждую функцию-функцию в записи и, наконец, скомпилируйте все файлы .c для создания объектного файла .ko.
Общий процесс компиляции Makefile:

(1) obj-m: = hello.o: укажите hello.o для создания модуля .ko, hello.o зависит от hello.c
(2) hello-y: = demo.o add.o: hello.o зависит от hello.c, но hello.c не найден, hello зависит от demo.o и add.o , Скомпилируйте demo.o и добавьте add.o в hello.

Общее объяснение: при компиляции модуля demo.o найдет файл hello.c, но hello.c не существует, а затем найдет, от кого hello зависит в Makefile. Hello-y означает, что это зависит от demo.o и add.o, и demo.o зависит от demo.c, add.o зависит от add.c.

Интеллектуальная рекомендация

Поверните строку в целые числа

Тема Описание Преобразуйте строку в целое число (реализация функции integer.valueof (строка), но строка не совпадает 0), требуя функции библиотеки, которая нельзя использовать для преобразования целых.

Docker создает репликацию Redis Master-Slave

Centos установить докер быстрый старт докера Создать Dockerfile Поместите файл на сервер Linux, создайте папку / usr / docker / redis и поместите его в этот каталог Выполните следующий код в каталоге .


Установка GateOne на новом CentOS7

Установка GateOne на новом CentOS7 В последнее время исследуются такие инструменты, как WebSSH2, в настоящее время требуется встроить терминал ssh в веб-приложение и найти GateOne. GateOne - это веб-в.


Примечания к исследованию Qt4 (5), QWaitCondition of QThread Learning


Практические занятия: решения проблем системы управления обучением

Сразу после получения задания будет много трудностей и много проблем. Хорошо иметь проблему, а это значит, что вы можете получить новые знания. Неважно, есть ли проблемы, ключ в том, как их решить. пр.

Вам также может понравиться


искробезопасная практика (5) обратный индекс

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


Решение центра тяжести неправильного многоугольника

Справочник статей Во-первых, решение центра тяжести неправильных многоугольников 1.1 Метод расчета треугольника центра тяжести 1.2 Метод расчета площади треугольника 1.3 Метод расчета площади полигона.

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

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

Мои сомнения заключаются в следующем,

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

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

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

2 ответа

Постараюсь по очереди ответить на ваши вопросы:

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

Да, но вам нужно позаботиться о некоторых дополнительных вещах. Сначала разберитесь, как загружается конкретный модуль (драйвер). Ключ к этому - MODULE_DEVICE_TABLE(usb, &my_id_table); . Каждый раз, когда определенный модуль "устанавливается" (с использованием make modules_install ), запись в соответствии с таблицей идентификаторов, переданной в 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 в безопасное место. Теперь перестройте зависимости так, чтобы записи были удалены из файлов зависимостей.

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

Итак, подведем итог:

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

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

Когда вы закончите играть с драйвером, вы можете скопировать исходный файл 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 в следующих разделах:

Думаю, это тоже ответ на ваш третий вопрос!

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

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

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

Читайте также: