私がこれをしたいのはなぜですか?
私は組み込みデバイスから赤外線信号を送信するために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"