Open1
Device Tree をざっくりキャッチアップ
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";
};
};
};