Привязка (в вашем случае HID-) устройства к конкретному драйверу не является тривиальной задачей и зависит от используемой версии ядра :
Ядро <4.16 </h2> До ядра 4.16 вам пришлось редактировать и перекомпилировать drivers/hid/hid-core.c
, так как этот файл содержал список устройств, которые не должны обрабатываться hid-generic
(hid_have_special_driver
struct), вы можете увидетьпример того, как это было сделано здесь: https://github.com/atar-axis/xpadneo/blob/master/misc/kernel_patches/0002-hid_generic_claims_devices.patch Ядро> = 4.16
Начиная с Ядра 4.16, список был удален и hid-generic
проверяет, хочет ли устройство использовать какой-либо другой драйвересли так - то hid-generic
отступает назад и не претендует на устройство.Связанный патч: https://github.com/torvalds/linux/commit/e04a0442d33b8cf183bba38646447b891bb02123#diff-88d50bd989bbdf3bbd2f3c5dcd4edcb9
Обходной путь (работает всегда)
Вы всегда можете использовать правило udev (например, /etc/udev/rules.d/99-xpadneo.rules
), либо до 4.16, либо при наличии более одногоспециализированный драйвер в вашей системе:
# unbind the device from hid-generic on kernel < 4.16
# and bind it to the specialized driver (xpadneo in this case)
ACTION=="add", KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", SUBSYSTEM=="hid",\
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/hid-generic/unbind'", \
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/xpadneo/bind'"
# unbind the device from another specialized driver which came first
# and bind it to xpadneo
ACTION=="add", KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", SUBSYSTEM=="hid",\
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/microsoft/unbind'", \
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/xpadneo/bind'"
Примечания
- Вместо
bash
вам следует использовать sh
- Iне помню, когда
bind
и unbind
где добавлено, но это довольно давно.
Вы можете прочитать немного больше о loading , привязка и регистрация (HID-) драйверов здесь: