デバイスツリーでモジュールをロードした後にスクリプトを実行する

デバイスツリーでモジュールをロードした後にスクリプトを実行する

私がこれをしたいのはなぜですか?

私は組み込みデバイスから赤外線信号を送信するためにpwm-ir-txカーネルモジュールを使用しています。ただし、起動中にPWMカーネルモジュールがロードされると、このピンはHighになります。 lirc irsend信号を使用してローに設定するのに約10秒かかります。 IR-LEDが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をオフにするためにLEDをオフにするデバイスエントリ「After = lircd.service」を使用してsystemdサービス「lircd-out」を有効にしましたが、起動プロセス後約10秒間実行されます。

DTオーバーレイのモジュールを「無効」に設定してからmodprobeを使用してロードしても効果はありません(pwmまたはrcデバイスまたは/ dev / lircxキャラクタデバイスはsysfsに生成されません)。おそらくこれらのモジュールが組み込まれているからです(つまり、.configファイル内の「M」ではなく「Y」で構成されています)、私の理解はまだ少し曖昧であることを認識する必要があります。

理想的なものは何ですか?

pwm-sun4iがロードされた後、スクリプトを実行してpwmピンをローに設定し、pwm-ir-txをロードできるようにpwm-sun4iおよびpwm-ir-txモジュールのロードを制御する機能。ただし、前述したように、これらのモジュールを手動でロードすると、sysfsはそのモジュールにアクセスできません。

またはfragment @ 0のパラメータをpwmに渡してlowに設定できます。しかし、どうすればいいのかわかりません。アップデートとの互換性を維持するためにカーネルソースコードを変更したくありません。

どんな提案がありますか?

ベストアンサー1

これに一致するudevルールを作成します。

「モジュールがロードされた後」スクリプトを実行する必要はありません。これは特定のデバイスを扱うので、「デバイスが検出された後に」実行することをお勧めします。それは問題ではありませんどのようにこのデバイスは、カーネルが「新しい」デバイスとして報告する限り機能します。

つまり、モジュールはデバイスと同様に/sysに存在します。つまり、udevルールをトリガーし、そのモジュール用にシステム化された.deviceユニットを作成することもできます。

たとえば、pwm-sun4iがロードされるとすぐにサービスをトリガーするには、次のudevルールを使用します。

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

単純なワンタイムコマンドを実行するには、次のようにします。

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

おすすめ記事