Как создать и развернуть драйвер Linux?

Я использую ubuntu, но вопрос для linux вообще.

Я установил модуль/драйвер, скомпилировав мое ядро ​​Linux и установив новое скомпилированное ядро. Он работает нормально.

Чтобы этот драйвер работал на другом компьютере без установки нового ядра, я скопировал файл .ko на новый компьютер под /lib/modules/<version>/..., а затем запустил sudo depmod -a. Затем запустите sudo modprobe <drivername>. Модуль может быть загружен без проблем. но устройство не работает с этим модулем .ko.

Эти две машины не идентичны аппаратным средствам, но они идентичны версии ядра и версии выпуска ubuntu. Обычно копирование файла .ko должно работать для той же версии Linux и того же ядра.

Дополнительная информация о драйвере. это спрятанный планшетный драйвер. Все файлы патчей:

  • один файл .c в drivers/hid/
  • добавить одну строку в drivers/hid/Makefile
  • добавьте несколько строк в drivers/hid/usbhid/Kconfig
  • добавьте несколько строк в drivers/hid/hid-ids.h
  • добавьте несколько строк в drivers/hid/usbhid/hid-quirks.c hid_blacklist struct до {0, 0}

Это все.

Я даже попытался скопировать весь каталог drivers/hid/, включающий все файлы .ko с первой машины на вторую. но не повезло. Планшет для планшета можно распознать на второй машине, я могу сделать клик левой кнопкой мыши с помощью пера, но перо не может перемещать курсор.

Надеюсь, я представил достаточно подробностей. Моя цель - установить модуль только в идентичную версию Linux (ядро) без переустановки ядра. Я не уверен, как достичь этого или если это возможно.

Большое спасибо.

PS:

В 1-м аппарате перед подключением планшета lsmod не отображает модуль. после подключения модуль может быть загружен автоматически. Я вижу, что lsmod показывает модуль.

Во втором mahcine модуль не может быть загружен автоматически, подключив устройство. Мне нужно сделать sudo modprobe <module> вручную.

Поскольку мне нужно будет установить модуль на многие машины в моей компании, проще установить модуль, не переустанавливая ядро. Я попытался установить пакеты ядра .deb, которые были построены на 1-й машине на второй машине, отлично работает на 2-й машине. но мне нехорошо переустанавливать ядро ​​на многие машины. Спасибо.

Ответ 1

Кажется, что ядро, которое вы построили, не соответствует 1:1. Кроме того, вообще нет необходимости компилировать новое ядро.

Самый простой способ справиться с развертыванием драйверов вне дерева - это использовать DKMS.

Что вам нужно предоставить, это всего лишь файл dkms.conf, определяющий имена и адреса пакетов, версии и имена драйверов и адресатов (в пределах /lib/modules/{kernel}).

В следующих примерах вещи в фигурных скобках необходимо заменить на реальную вещь, например. если версия 1.0.0, то {version} с 1.0.0, очевидно.

Пример dkms.conf:

PACKAGE_NAME="{mydriver}"
PACKAGE_VERSION="{version}"
BUILT_MODULE_NAME[0]="{mydriver}"
BUILT_MODULE_LOCATION[0]="/{mycompany?}"
AUTOINSTALL="yes"

Затем вам просто нужно установить источники на /usr/src/{mydriver}-{version} и запустить dkms:

 dkms add -m {mydriver} -v {version}
 dkms build -m {mydriver} -v {version}
 dkms install -m {mydriver} -v {version}

Вы должны взглянуть на то, что сделали другие люди в этой области, там есть большая автоматизация, которую вы можете применить к процессам тестирования и выпуска. Bluecherry solo6x10 версия из дерева предоставляет некоторые полезные make цели (раскрытие: я тот, кто написал это).

Кроме того, вы определенно хотите создавать и распространять пакеты, вы можете использовать solo6x10/debian в качестве шаблона, и вы можете читать о репозиториях в вики Debian.

Ответ 2

Вы можете добавить модуль в /etc/modules, чтобы он загружался во время загрузки.