カーネルモジュールが一貫性がない

カーネルモジュールが一貫性がない

みんな。

私のLinuxコンピュータに接続するために必要な特別なUSBデバイス(中国語タッチスクリーン)があります。

デフォルトでは、Linuxは接続されたデバイスをUSBHID(私は以下を実行してこの情報を見つけました。USBデバイスとノード図*タッチスクリーンをコンピュータに接続した後に表示されます)カーネルモジュールのため、システムはタッチスクリーンを入力デバイスとして表示できません。また、デバイス用のドライバもあります。 Linuxシステムでドライバをビルドしてインストールし、システム起動時にこのモジュールをロードするための指示を生成します。/etc/modules-load.d/

起動時にドライバが正常にロードされます(次を実行してこの情報を取得します)。lsmod)、タッチスクリーンはまだ接続されています。USBHID。ドライバが正しく実行されていることを知っています。削除するとUSBHIDデバイスを再接続すると、タッチスクリーンドライバはタッチスクリーンをキャプチャします。

[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)

デバイスバインディングを解除する方法があることがわかりました。USBHIDudev ルールを生成します。私のudevルールは次のとおりです。

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

コンピュータの再起動後、USBデバイスタッチスクリーン用の追加ドライバが全くないそうです!私の考えでは、ドライバーが捕まえると思います:

[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)

わかりました。システムファイルシステム供給新しいID私のドライバーのフィールド。 Google検索新しいID存在するシステムファイルシステムベンダーと製品IDを送信すると、デバイスがドライバにバインドされ、ドライバがデバイスをキャプチャすることがわかりました。したがって、シェルで次のようなことを実行すると:

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

すべてが私が望む方法で正確に動作します。だから私は次の文字列でudevルールを更新することにしました。

# 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'"

新しいudevルールを適用して再起動し、usb-deviceを実行します。

[alarm@alarmpi ~]$ USB デバイス

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)

どうなりますか?なぜUSBHID? 。

まあ、私はudevルールをダウングレードすることにしましたシステム.d提供する。この一つ:

[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

サービスは正常に実行されていますが、タッチスクリーンにまだドライバが接続されていません。

[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)

私の質問は:ドライバを自分のデバイスにどのように接続しますか?

PSはおそらく役に立ちます:

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

よろしくお願いします。

PS他の記事にも質問をしたが、誰も答えをしなかった。

ベストアンサー1

おすすめ記事