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.
Tags drivers udev kernel-modules