我正在努力讓更現代的 Linux 在單板電腦上運行,原來的公司已經倒閉,但硬體得到了開源社群的良好支援。我已經取得了很好的進展,但遇到了一個問題,即為特定設備加載了不正確的驅動程式模組。
平台為全志R8(與全志A13相同),設備為電阻式觸控螢幕。 ARM 的發行版是 Slackware-current,這意味著沒有 systemd,但它使用 eudev。我從原始碼編譯了內核 5.2.0-rc6,因為我想嘗試 Mali lima 驅動程序,並且需要一些未包含在發行版建置中的模組。設備樹中的相關部分如下。
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當我需要的是時,為該設備加載模組sun4i-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
看來在這種特殊情況下,我真的很想禁用sun4i_gpadc模組。我注意到ATTRS{driver_override}上面的輸出中的一部分udevadm info
是我之前沒有註意到的,並在谷歌上搜尋了這一點,這導致我找到了更多關於設備樹條目如何透過「相容」屬性確定模組的資訊。這讓我發現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]
對於沒有正確 RTFMing 表示歉意:)