LINUX.ORG.RU

Компиляция общего драйвера HID

 ,


0

1

Требуется скомпилировать в модуль и установить общий драйвер устройств 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
и установка драйвера в директорию /lib/modules/3.13.0-85-generic/updated не решает проблему.

После переименования в основном дереве драйверов 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).


А собрать заменяемый драйвер под иным именем и заблеклистить оригинальный не вариант?

Ну и подумай про dkms, для автоматической сборки.

Radjah ★★★★★
()
Ответ на: комментарий от Radjah

От этого драйвера зависят другие драйверы, тот же usbhid, в них нужно править зависимости, и изменённые версии этих драйверов снова нужно как-то устанавливать, их тоже переименовывать?

Каков типичный вариант поведения в случае ошибки, приведённой выше, когда нехватает каких-то символов (в dmesg при этом ничего не выводится)? Может быть, драйвер ещё нужно как-то конфигурировать перед сборкой (make menuconfig)?

ad
() автор топика
Ответ на: комментарий от xmikex

Я уже написал в последнем абзаце первого поста, зачем мне понадобилась компиляция драйвера HID.

ad
() автор топика
Ответ на: комментарий от xmikex

Согласен, не противоречит, но так можно во всех темах форума Development спрашивать о том, не пишет ли автор темы какие-либо вредоносные программы. Мой ответ на твоё высказывание: нет, мой драйвер не содержит вредоносной функциональности, в том числе не содержит функциональности ведения журнала событий, генерируемых устройством ввода.

ad
() автор топика
Ответ на: комментарий от anonymous

Если использовать libusb, то нужно весь драйвер HID переносить в режим пользователя и переписывать для libusb. Я использую драйвер HID в ядре, мой драйвер вставляется как тонкая прослойка между драйвером HID и инфраструктурой поддержки устройств ввода (Linux Input), из режима пользователя будет невозможно вернуться обратно в режим ядра в Linux Input с тем, чтобы сгенерировать там событие ввода.

А проблему тем временем я решил. Видимо, в новых версиях ядра в дереве модулей вместо директории updated используется extra, и модули в ней уже не имеют приоритета над модулями в основном дереве. Так что устанавливать модуль нужно прямо в основное дерево, в моём случае в директорию kernel/drivers/hid. Оригинальный драйвер просто переименовал из hid.ko в hid.ko.original. Теперь всё работает.

ad
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.