Open1

Device Tree をざっくりキャッチアップ

zuribozuribo

Device Tree

  • Linux における Device Tree の存在理由は、ハードウェアリソースを記述するための方法を提供するためである。
  • Device Tree のデータは複数の異なるフォーマットで記述することができる。
    • Device Tree のデータは、human-readable な形で作成・管理され、ソースファイル (拡張子: .dts) とインクルードファイル (拡張子: .dtsi) で構成される。
    • Device Tree のソースファイルは、バイナリフォーマット (拡張子: .dtb) にコンパイルされ、これは Flattened Device Tree (FDT) と呼ばれる。
    • システムブートの初期のフェーズで FDT は生の状態でアクセスされ、その後 Expanded Device Tree (EDT) として kernel に渡されて利用される。

FDT

  • FDT とは、ただのデータ構造であり、それ以外の何者でもない。
  • Open Firmware が使っていたフォーマットから派生したものであり、ハードウェアの構成を記述することができる。
  • ソースコードからハードウェアリソースの構成の定義を分離しておくために導入された。

Data Format (.dts)

/dts-v1/;

/ {
    node1 {
        a-string-property = "A string";
        a-string-list-property = "first string", "second string";
        // hex is implied in byte arrays. no '0x' prefix is required
        a-byte-data-property = [01 23 34 56];
        child-node1 {
            first-child-property;
            second-child-property = <1>;
            a-string-property = "Hello, world";
        };
        child-node2 {
        };
    };
    node2 {
        an-empty-property;
        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};

上記の例は、.dts ファイルの構造を説明している。

  • ルートノード "/" が1つある。
  • "node1" と "node2" が、子ノードとして存在する。
  • "node1" には、さらに子ノード "child-node1" と "child-node2" が存在する。
  • 各ノードにプロパティが定義されている。

プロパティは key-value ペアであり、空か任意のバイトストリームを含む。

  • 文字列: string-property = "a string";
  • セル (32-bit unsigned interger): cell-property = <0xbeef 123 0xabcd1234>;
  • バイナリデータ: binary-property = [0x01 0x23 0x45 0x67];
  • コンマ区切りで異なる表現を結合: mixed-property = "a string", [0x01, 0x23, 0x45, 0x67], <0x12345678>;

Sample

/dts-v1/;

/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };

    serial@101F0000 {
        compatible = "arm,pl011";
    };

    serial@101F2000 {
        compatible = "arm,pl011";
    };

    gpio@101F3000 {
        compatible = "arm,pl061";
    };

    interrupt-controller@10140000 {
        compatible = "arm,pl190";
    };

    spi@10115000 {
        compatible = "arm,pl022";
    };

    external-bus {
        ethernet@0,0 {
            compatible = "smc,smc91c111";
        };

        i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            rtc@58 {
                compatible = "maxim,ds1338";
            };
        };

        flash@2,0 {
            compatible = "samsung,k8f1315ebm", "cfi-flash";
        };
    };
};

参考リンク