Systemd

由於設備樹載入模組後執行腳本

  • April 21, 2019

我為什麼要這個?

我使用 pwm-ir-tx 核心模組從我的嵌入式設備中釋放 IR 信號。但是,在引導過程中載入 pwm 核心模組時,該引腳為高電平。大約需要 10 秒左右,直到我可以使用 lirc irsend 信號將其設置為低電平。如果僅在 PWM 模式下使用而不是永久開啟,原則上您可以“過載”IR-LED 以使其更亮。然而,引導過程中的 10 秒破壞了這一策略。

到目前為止,我的系統在做什麼(例如,什麼工作、DT-Overlay 文件等)?

我正在使用 Armbian 並修改了主線核心中的 pwm-ir-tx 驅動程序,以保證發送後的狀態為低(將佔空比設置為 0,當我只是禁用我設備上的 pwm 通道時,它是隨機的 1 或 0 )。

我正在使用啟動 pwm 和 pwm-ir-tx 的設備樹覆蓋。

/dts-v1/;
/plugin/;

/ {
   compatible = "allwinner,sun4i-a10";

   fragment@0 {
       target = <&pwm>;
       __overlay__ {
           pinctrl-names = "default";
           pinctrl-0 = <&pwm0_pin>, <&pwm1_pin>;
           status = "okay";
       };
   };

   fragment@1 {
       target-path = "/";
       __overlay__ {
           pwm-ir-transmitter {
               compatible = "pwm-ir-tx";
               pwms = <&pwm 0 0 0>;
           };
       };
   };

};

當我啟動時,pwm-sun4i 模組和 pwm-ir-tx 已載入,並且可以使用 /dev/lircx 字元設備。為了關閉 LED,我使用單元條目“After=lircd.service”啟用了 systemd 服務“lircd-out”,這會關閉 LED,但它會在啟動過程後大約 10 秒執行。

將 DT Overlay 中的模組設置為“禁用”並在之後使用 modprobe 載入它們不起作用(不在 sysfs 中創建 pwm 或 rc 設備,或 /dev/lircx 字元設備)。也許因為這些模組是內置的(即在.config文件中配置了’Y’,而不是’M’),但我必須承認我的理解仍然有點模糊,在這裡。

什麼是理想的?

能夠控制模組 pwm-sun4i 和 pwm-ir-tx 的載入,因此能夠在載入 pwm-sun4i 後執行腳本,將 pwm 引腳設置為低,然後載入 pwm-ir-tx。但正如我所提到的,當我手動載入這些模組時,sysfs 無法訪問它們。

或者,我可以將 fragment@0 中的參數傳遞給將其設置為低的 pwm。但我不知道怎麼做,也看不到 pwm-sun4i.c 的程式碼中允許這樣做的任何內容。我不想修改核心原始碼以使其與更新兼容。

有什麼建議麼?

創建一個 udev 規則來匹配它。

不必在“載入模組後”執行腳本——它處理特定的設備,因此最好在“檢測到設備後”執行它。不管設備是如何被檢測到的;只要核心將其報告為“新”設備,它就可以工作。

也就是說,模組像設備一樣存在於 /sys 中,這意味著它們也可以觸發 udev 規則,甚至為它們生成 systemd .device 單元。

例如,要在 pwm-sun4i 載入後立即觸發服務,請使用以下 udev 規則:

ACTION=="add", SUBSYSTEM=="module", KERNEL=="pwl-sun4i", \
   TAG+="systemd", ENV{SYSTEMD_WANTS}+="fixup-pwl.service"

執行一個簡單的 oneshot 命令:

ACTION=="add", SUBSYSTEM=="module", KERNEL=="pwl-sun4i", RUN+="/etc/fix-pwl.sh"

引用自:https://unix.stackexchange.com/questions/512393