web-dev-qa-db-ja.com

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

なぜこれが欲しいのですか?

Pwm-ir-txカーネルモジュールを使用して、組み込みデバイスからのIR信号をブラストします。ただし、ブートプロセス中にpwmカーネルモジュールがロードされると、ピンはHighになります。 lirc irsend信号でローに設定できるようになるまで、約10秒かかります。原則として、IR-LEDをPWMモードでのみ使用し、永続的にオンにしない場合は、IR-LEDを「オーバーロード」して明るくすることができます。ただし、起動プロセス中の10秒は、この戦略を損ないます。

これまでのところ、私のシステムは何をしていますか(たとえば、何が機能しているのか、DT-オーバーレイファイルなど)?

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 = lilcd.service」でsystemdサービス「lircd-out」を有効にしました。これにより、LEDがオフになりますが、起動プロセスの約10秒後に実行されます。

DTオーバーレイでモジュールを「無効」に設定し、後でmodprobeでモジュールをロードしても機能しません(sysfsでpwmまたはrcデバイス、または/ dev/lircx文字デバイスを作成しません)。これらのモジュールが組み込まれているため(つまり、.configファイルの「M」ではなく「Y」で構成されているため)、ここでは理解がまだ少しあいまいであることを認めなければなりません。

理想は何ですか?

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

または、fragment @ 0のパラメーターをpwmに渡してlowに設定することもできます。しかし、私はその方法がわからず、これを可能にするpwm-Sun4i.cのコードには何も表示されません。カーネルソースを変更して、更新との互換性を維持したくありません。

助言がありますか?

1
user3117071

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

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

とは言うものの、モジュールはデバイスと同じように/ sysに存在します。つまり、モジュールもudevルールをトリガーでき、systemd.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"
1
user1686