Inconsistência no módulo do kernel

1

todos.

Eu tenho um dispositivo USB especial (touchscreen chinês), o que preciso para conectar ao meu computador com o Linux.

Por padrão, o Linux atribui o dispositivo conectado ao usbhid (achei essa informação executando usb-devices e o nó hidraw * aparece após a conexão touchscreen para o computador), então meu sistema não pode ver a tela sensível ao toque como dispositivo de entrada. Além disso, tenho drivers para este dispositivo. Eu construo e instalo o driver em meu sistema Linux, e crio instruções para carregar este módulo na inicialização do sistema em /etc/modules-load.d/ .

Driver carregado com sucesso na inicialização (recebo essa informação executando lsmod ), mas a tela sensível ao toque ainda está anexada ao usbhid . Eu sei que o driver funciona bem porque se eu descarregar o usbhid e o dispositivo de replicação, o driver da tela sensível ao toque captura a tela sensível ao toque.

[alarm@alarmpi ~]$ usb-devices 

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC'g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(usbhid)

Descobri que existe uma maneira de desvincular o dispositivo do usbhid criando a regra do udev. Então, aqui está minha regra do udev:

ATTRS{idVendor}=="0eef", ATTRS{idProduct}=="0005", DRIVER=="usbhid", RUN="/bin/sh -c 'echo -n $kernel > /sys/bus/usb/drivers/usbhid/unbind'"

Após a reinicialização do computador, os usb-devices mostram que a tela sensível ao toque não tem nenhum driver conectado !!! Eu acho que meu motorista irá capturar:

[alarm@alarmpi ~]$ usb-devices 

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC'g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(none)

Ok, também acho que o sysfs fornece o campo new_id no meu driver. Pesquisando por new_id em sys_fs , descobri que, se eu enviar IDs de produtos e fornecedores, o dispositivo será vinculado ao driver e o driver capturará o dispositivo. Então, se eu executar no shell algo assim:

[alarm@alarmpi ~]# echo -n 0eef 0005 > /sys/bus/usb/drivers/eleduino_ts/new_id

Tudo funciona como eu preciso. Então, decido atualizar minha regra do udev com essa string:

# 1. Unbind our device from usbhid:
ATTRS{idVendor}=="0eef", ATTRS{idProduct}=="0005", DRIVER=="usbhid", RUN="/bin/sh -c 'echo -n $kernel > /sys/bus/usb/drivers/usbhid/unbind'"

# 2. Bind device to eleduino_ts driver:
ATTRS{idVENDOR}=="0eef", ATTRS{idProduct}=="0005", RUN="/bin/sh -c 'echo -n '0eef 0005' > /sys/bus/usb/drivers/eleduino_ts/new_id'"

Aplique a nova regra do udev, reinicialize, execute usb-device:

[alarm @ alarmpi ~] $ usb-devices

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC'g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(usbhid)

O que está acontecendo? Por que usbhid ?

Bem, decido fazer o downgrade da regra do udev e criar o serviço system.d . Aqui está:

[alarm@alarmpi ~]$ cat /etc/systemd/system/eleduino_ts.service 
[Unit]
Description=Bind device to eleduinos_ts
[email protected] plymouth-quit.service
After=systemd-user-sessions.service [email protected] plymouth-quit.service

[Service]
ExecStart=/bin/echo -n 0eef 0005 > /sys/bus/usb/drivers/eleduino_ts/new_id
Restart=always
IgnoreSIGPIPE=no

[Install]
WantedBy=multi-user.targets

Eu sei que esse serviço é executado bem, mas minha tela sensível ao toque ainda não tem drivers conectados:

[alarm@alarmpi ~]$ usb-devices 

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC'g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(none)

Então, minha pergunta é: como posso anexar meu driver ao meu dispositivo?

P.S. Talvez isso ajude:

[alarm@alarmpi ~]$ uname -a 
Linux alarmpi 4.1.12-1-ARCH #1 PREEMPT Tue Oct 27 19:16:04 MDT 2015 armv6l GNU/Linux

Obrigado antecipadamente.

P.S. Eu fiz essa pergunta em outros tópicos, mas ninguém me deu uma resposta.

    
por ArhiChief 10.11.2015 / 22:55

0 respostas