Требуется скомпилировать в модуль и установить общий драйвер устройств USB HID. Компиляция проходит успешно, однако после установки драйвер не загружается.
Ubuntu 14.04, Linux 3.13.0, исходники получаются при помощи apt-get source
, linux-3.13.0/drivers/hid/Makefile:
hid-y := hid-core.o hid-input.o hid-debug.o hidraw.o
obj-m += hid.o
all:
$(MAKE) -C "/lib/modules/`uname -r`/build" M=`pwd` modules
install:
$(MAKE) -C "/lib/modules/`uname -r`/build" M=`pwd` modules_install
clean:
$(MAKE) -C "/lib/modules/`uname -r`/build" M=`pwd` clean
Далее make && sudo make install && depmod -a
. Драйвер устанавливается в /lib/modules/3.13.0-85-generic/extra. Далее sudo rmmod hid_generic && sudo rmmod usbhid && sudo rmmod hid && sudo modprobe hid && sudo modprobe usbhid
. После этого драйвер hid_generic загружается уже автоматически и всё работает как при использовании оригинального драйвера из репозитория, в основном дереве драйверов.
Добавление в Makefile
INSTALL_MOD_DIR := updated
export INSTALL_MOD_DIR
После переименования в основном дереве драйверов hid.ko в hid.ko.original с целью вынуждения ядра загружать изменённую версию драйвера из updated при загрузке драйвера (sudo modprobe hid
) выдаётся сообщение об ошибке:
modprobe: ERROR: could not insert 'hid': Unknown symbol in module, or unknown parameter (see dmesg)
При этом в dmesg
ничего не выводится. Я так понял, проблема с динамическим связыванием этого модуля с другими модулями, что делать в этой ситуации? Как скомпилировать общий драйвер HID, установить его (в extra или updated?) и добиться того, чтобы работала именно новая скомпилированная версия, а не версия в основном дереве драйверов из репозитория. Или для этого нужно компилировать этот драйвер с другими зависящими от него драйверами, т. е. usbhid, hid-generic и специальными драйверами различных устройств USB HID?
Компиляция требуется для того, чтобы внести небольшое изменение в драйвер, а именно добавить устройство USB HID, для которого я пишу драйвер, в таблицу устройств, для которых существует специализированный драйвер, который требуется загрузить вместо общего драйвера hid-generic.ko
, которая находится в общем драйвере HID (hid.ko
), без этого изменения мой драйвер загружается при подключении, но не задействуется (вариант с отсутствием цифровой подписи модуля я исключил, так как, во-первых, модуль загружается, а во-вторых, отсутствие цифровой подписи лишь включает для модуля kernel taint).