複数のドライバーが適用可能な場合に、どのドライバーをデバイスに使用するかを指定する方法

複数のドライバーが適用可能な場合に、どのドライバーをデバイスに使用するかを指定する方法

私は、元の会社は倒産したが、ハードウェアはオープンソース コミュニティによって十分にサポートされているシングル ボード コンピューターで、より新しい Linux を動作させることに取り組んでいます。かなり順調に進んでいますが、特定のデバイスに対して誤ったドライバー モジュールがロードされるという問題が発生しています。

プラットフォームは Allwinner R8 (Allwinner A13 と同じ) で、デバイスは抵抗膜方式タッチスクリーンです。ディストリビューションは ARM 用の Slackware-current です。つまり、systemd はありませんが、eudev を使用します。Mali lima ドライバーを試してみたかったので、ディストリビューション ビルドに含まれていないモジュールがいくつか必要だったため、カーネル 5.2.0-rc6 をソースからコンパイルしました。デバイス ツリーの関連セクションは次のとおりです。

u-boot/arch/arm/dts/sun5i.dtsi:

587         rtp: rtp@1c25000 {                                                                                                                                                                 
588             compatible = "allwinner,sun5i-a13-ts";                                                                                                                                         
589             reg = <0x01c25000 0x100>;                                                                                                                                                      
590             interrupts = <29>;                                                                                                                                                             
591             #thermal-sensor-cells = <0>;                                                                                                                                                   
592         };

オーバーレイ (一部のデバイス用のツリー パッチから組み込まれた、修正された 4.4 カーネルの製造元のオーバーレイからコピーされています)

 76   /* Enable the touchscreen */                                                                                                                                                             
 77   fragment@4 {                                                                                                                                                                             
 78     target = <&rtp>;                                                                                                                                                                       
 79     __overlay__ {                                                                                                                                                                          
 80       touchscreen-inverted-x;                                                                                                                                                              
 81       touchscreen-inverted-y;                                                                                                                                                              
 82       allwinner,ts-attached;                                                                                                                                                               
 83     };                                                                                                                                                                                     
 84   };

問題は、sun4i-gpadcこのデバイスにモジュールがロードされているのに、必要なのはサン4i-ts前者は汎用 ADC ドライバーであり、後者は必要なタッチスクリーン ドライバーです。

root@pocketslack:/etc# udevadm info -a /sys/devices/platform/soc\@1c00000/1c25000.rtp

  looking at device '/devices/platform/soc@1c00000/1c25000.rtp':
    KERNEL=="1c25000.rtp"
    SUBSYSTEM=="platform"
    DRIVER=="sun4i-gpadc"
    ATTR{driver_override}=="(null)"

modprobe を使用して sun4i_gpadc と sun4i_ts を削除し、最初に sun4i-ts からロードすると、デバイスが取得され、正常に動作します。

root@pocketslack:/etc# modprobe -r sun4i_gpadc
root@pocketslack:/etc# modprobe -r sun4i_ts
root@pocketslack:/etc# modprobe sun4i_ts
root@pocketslack:/etc# modprobe sun4i_gpadc
root@pocketslack:/etc# udevadm info -a /sys/devices/platform/soc\@1c00000/1c25000.rtp

  looking at device '/devices/platform/soc@1c00000/1c25000.rtp':
    KERNEL=="1c25000.rtp"
    SUBSYSTEM=="platform"
    DRIVER=="sun4i-ts"
    ATTR{driver_override}=="(null)"

私も会社の古いリポジトリから入手した udev ルールを持っており、これでこの問題を処理できると思いましたが、デバイスは依然として gpadc ドライバーによって占有されています。

root@pocketslack:/etc# cat /etc/udev/rules.d/10-sun4i-ts.rules 
ACTION=="add", SUBSYSTEM=="input", DRIVERS=="sun4i-ts", SYMLINK+="input/sun4i-ts-%k"

ただし、私は udev についてはまったくの初心者なので、そのルールが何を指示しているのか正確にはわかりません。私の直感では、そのモジュールをロードし、それを接続するデバイスに名前を付けるように指示しているだけだと思います。また、sun4i-gpadc ドライバーが必要かどうかもわかりませんが、カーネルのドキュメントから、SoC の温度センサーが機能するために必要であることがわかりました。このデバイスにはプロジェクト用にピンも公開されているため、実際にそのように付属の ADC を使用したい場合に備えて、ピンがあると便利かもしれないと思いました。また、複数のドライバーが適用される可能性がある場合は、正しいドライバーを指定するための何らかのメカニズムが必要であるように思われ、gpadc モジュールをビルドしないかブラックリストに登録するのではなく、その方法を学ぶ必要があると考えました。

答え1

この特定のケースでは、私は本当に無効にしたいようです翻訳者モジュール。ATTRS{ドライバーオーバーライド}上記の出力の一部はudevadm info以前は気付かなかったので、グーグルで検索したところ、デバイスツリーエントリが「compatible」属性を介してモジュールを決定する方法についてもう少し詳しく知ることができました。これにより、modinfo両方のモジュールが同じ互換性のある文字列を探していることがわかりました。カーネル構成をもう一度確認した後、ドライバーに互換性がないため、この場合はgpadcドライバーをビルドしないか、ブラックリストに登録する必要があります。!タッチスクリーン_SUN4I

Symbol: MFD_SUN4I_GPADC [=m]                                                                                                                                                           │   
  │ Type  : tristate                                                                                                                                                                       │   
  │ Prompt: Allwinner sunxi platforms' GPADC MFD driver                                                                                                                                    │   
  │   Location:                                                                                                                                                                            │   
  │     -> Device Drivers                                                                                                                                                                  │   
  │ (2)   -> Multifunction device drivers                                                                                                                                                  │   
  │   Defined at drivers/mfd/Kconfig:54                                                                                                                                                    │   
  │   Depends on: HAS_IOMEM [=y] && (ARCH_SUNXI [=y] || COMPILE_TEST [=n]) && !TOUCHSCREEN_SUN4I [=m]                                                                                      │   
  │   Selects: MFD_CORE [=y] && REGMAP_MMIO [=y] && REGMAP_IRQ [=y]

きちんとRTFMしなかったことをお詫びします:)

関連情報