由於設備樹載入模組後執行腳本
我為什麼要這個?
我使用 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"