n_hachiのメモ

メモです。

device treeにおけるアンパサンド(&)の意味

はじめに

device treeを触っているときの疑問を解消する内容が下記リンクにかかれていた。
linux kernel - Meaning of an ampersand prefix in a device tree - Unix & Linux Stack Exchange
本記事は上記ページを備忘録を兼ねて翻訳しようと思う。
※英語が得意なわけではないので意訳を含みます。誤りがあれば指摘ください。

翻訳

質問

異なるノードを指定しようとするDTSファイルを眺めていたときに、興味深い、いくつかのノードの命名規則を見つけた。

/ {
    model = "TI AM335x BeagleBone Black";
    compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
};

&ldo3_reg {
    regulator-min-microvolt = <1800000>;
    regulator-max-microvolt = <1800000>;
    regulator-always-on;
};

&mmc1 {
    vmmc-supply = <&vmmcsd_fixed>;
};

&mmc2 {
    vmmc-supply = <&vmmcsd_fixed>;
    pinctrl-names = "default";
    pinctrl-0 = <&emmc_pins>;
    bus-width = <8>;
    status = "okay";
};

/ {
    hdmi {
        compatible = "ti,tilcdc,slave";
        i2c = <&i2c0>;
        pinctrl-names = "default", "off";
        pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
        pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
        status = "okay";
    };
};

ノードの先頭に&がついている場合どのような影響があるのでしょうか?

  • 上の例における&ldo3_reg&mmc1&mmc2のケースです

ノードはルートノードの中に存在できる一方で、ルートノードから分離されている必要性は何でしょうか?

  • device treeでは / の中がルートノードとして表現されます
  • 上の例ではルートノードの中に、ノードhdmiが存在している一方で、&から始まるノードは/{ };の外側に記述されていることを述べていると予想します

興味深いことに、上の例では2つのルートノードが存在します。これは問題ないのでしょうか?

  • 先頭と末尾の方に存在する2つの/を示していると予想します

回答

https://developer.toradex.com/device-tree-customization より
ノードはampersand(&)とラベルを用いて参照可能です

プロパティの上書き

プロパティを上書きする場合、ノードはampersandとラベルを使って参照される必要があります
後に記述されたdevice treeのエントリーは、それより以前に記述されたエントリーを上書きします(エントリの順番は重要であり、したがってインクルードの順番も重要です)
一般的に高いレイヤ(キャリアが作成するボードのためのdevice tree)は、低いレイヤ(例えばSoCのdevice tree)を上書きします。

  • 高いレイヤ = dtsファイル、 低いレイヤ = dtsiファイル と考えれば良いかもしれません。

これを実現するために高いレイヤ(のdevice tree)は低いレイヤ(のdevice tree)を最初に取り込みます(includeします)

例えば、デバイスもしくはホストになれる(デュアルロールな)USBコントローラは、dr_modeをプロパティを使い明示的にデフォルトモードを上書きします

&usbdev0 {
    dr_mode = "host";
};

まとめ

プロパティの上書きのためには&labelの形式が必要ということを知った

ただ、上記がdevice treeの公式のページか不明なので、公式なページで明言されているならば知りたい