Как создать и развернуть драйвер 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, чтобы он загружался во время загрузки.