デバイスツリーと特定のデバイスオーバーライドからシリアルドライバにパ​​ラメータを渡す

デバイスツリーと特定のデバイスオーバーライドからシリアルドライバにパ​​ラメータを渡す

このデバイスツリーオーバーレイ(Raspbianの未修正ファイル)によって定義されたデバイスのシリアルポートドライバ設定linux,rs485-enabled-at-boot-time;にフラグ/パラメータを渡したいと思います。sc16is752

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";

    fragment@0 {
        target = <&gpio>;
        __overlay__ {
            spi1_pins: spi1_pins {
                brcm,pins = <19 20 21>;
                brcm,function = <3>; /* alt4 */
            };

            spi1_cs_pins: spi1_cs_pins {
                brcm,pins = <18>;
                brcm,function = <1>; /* output */
            };
        };
    };

    fragment@1 {
        target = <&spi1>;
        frag1: __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            pinctrl-names = "default";
            pinctrl-0 = <&spi1_pins &spi1_cs_pins>;
            cs-gpios = <&gpio 18 1>;
            status = "okay";


            sc16is752: sc16is752@0 {
                compatible = "nxp,sc16is752";
                reg = <0>; /* CE0 */
                clocks = <&sc16is752_clk>;
                interrupt-parent = <&gpio>;
                interrupts = <24 2>; /* IRQ_TYPE_EDGE_FALLING */
                gpio-controller;
                gpio-cells = <2>;
                spi-max-frequency = <4000000>;

                sc16is752_clk: sc16is752_clk {
                    compatible = "fixed-clock";
                    #clock-cells = <0>;
                    clock-frequency = <14745600>;
                };
            };
        };
    };

    fragment@2 {
        target = <&aux>;
        __overlay__ {
            status = "okay";
        };
    };

    __overrides__ {
      int_pin = <&sc16is752>,"interrupts:0";
    };
};

SC16IS752GPIOピンがほとんどなく、2つのUARTインターフェイスを備えたチップで、ハードウェアRS485をサポートし、SC16IS752のLinuxドライバを使用すると、次の機能を使用できます。

https://github.com/raspberrypi/linux/blob/04c8e47067d4873c584395e5cb260b4f170a99ea/drivers/tty/serial/sc16is7xx.c#L729(729行参照)

SC16IS752のデバイスツリーバインディングにはこれらのパラメータがないため、linux,rs485-enabled-at-boot-time;内部sc16is752: sc16is752@0ノードだけを追加することはできません。

どのように通過できますか?

編集する:

@Philipposのおかげで、いくつかの進歩がありました。

ソース sc16is752-spi1 オーバーレイソースをコピーしました。RPiカーネルソースコード(linux/arch/arm/boot/dts/overlays/どこかにあります)。

linux,rs485-enabled-at-boot-time;私は次のようにfrag1に追加しました。

(...)

        frag1: __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            pinctrl-names = "default";
            pinctrl-0 = <&spi1_pins &spi1_cs_pins>;
            cs-gpios = <&gpio 18 1>;
            status = "okay";

            linux,rs485-enabled-at-boot-time; /* HERE */

(...)

これが私がコンパイルした方法です:

dtc -O dtb -o sc16is752-ses.dtbo -b 0 -@ sc16is752-spi1-overlay-edited.dts

出力ファイルを/boot/overlaysにコピーし、この行(Raspbianの元のオーバーレイdtoverlay=sc16is752-ses,int_pin=24の代わりに)を/boot/config.txtに配置しました。dtoverlay=sc16is752-spi1,int_pin=24

再起動後、sudo vcdbg log msgオーバーレイがロードされていることを確認してください。

017319.445: brfs: File read: 1810 bytes
017327.250: brfs: File read: /mfs/sd/overlays/sc16is752-ses.dtbo
017346.010: Loaded overlay 'sc16is752-ses'
017346.065: dtparam: int_pin=24
019273.102: Device tree loaded to 0x2eff9400 (size 0x6b27)

私は以下を見つけました:

  • 私のクリスタルクロックの変更はうまくいきましたが(私の転送速度はめちゃくちゃで、今は大丈夫です)、ロジックアナライザでRTS信号を見ることはできません。
  • RTSラインは低いが(元のオーバーライド時は高い)、データを送信しても変更されません。

昨日、ポートフラグを変更してC ++でこの機能を有効にしようとしましたが、うまくいったので、私のハードウェアは問題ありません。

関連情報