6. デバイスツリーソース (DTS) フォーマット (バージョン 1)

デバイスツリーソース(DTS)形式は、カーネルが期待する形式のバイナリデバイスツリーにdtcで処理できる形式のデバイスツリーのテキスト表現です。 次の説明は、DTSの正式な構文定義ではありませんが、デバイスツリーを表すために使用される基本的な構成について説明しています。

DTSファイルの名前は「.dts」で終わる必要があります。

6.1. コンパイラ指令

他のソースファイルは、DTSファイルから含めることができます。 インクルードファイルの名前は「.dtsi」で終わる必要があります。 含まれるファイルには、追加のファイルを含めることができます。

/include/ "FILE"

6.2. ラベル

ソース形式を使用すると、デバイスツリー内の任意のノードまたはプロパティ値にラベルを付けることができます。 phandle値またはノードへのフルパスを明示的に指定する代わりに、ラベルを参照することにより、phandleおよびpath参照を自動的に生成できます。 ラベルはデバイスツリーソース形式でのみ使用され、DTBバイナリにエンコードされません。

ラベルの長さは1〜31文字で、セット 表 6.1 の文字のみで構成され、数字で始めることはできません。

ラベルは、ラベル名にコロン(':')を追加することによって作成されます。 参照は、ラベル名の前にアンパサンド('&')を付けることによって作成されます。

表 6.1 DTSラベルの有効な文字

文字

説明

0-9

数字

a-z

小文字

A-Z

大文字

_

アンダースコア

6.3. ノードとプロパティの定義

デバイスツリーノードは、ノード名とユニットアドレスで定義され、中括弧はノード定義の開始と終了を示します。 それらの前にラベルを付けることができます。

[label:] node-name[@unit-address] {
    [properties definitions]
    [child nodes]
};

ノードには、プロパティ定義や子ノード定義が含まれる場合があります。 両方が存在する場合、プロパティは子ノードの前に来る必要があります。

以前に定義されたノードは削除される可能性があります。

/delete-node/ node-name;
/delete-node/ &label;

プロパティ定義は、次の形式の名前と値のペアです。

[label:] property-name = value;

次の形式の空(長さがゼロ)の値を持つプロパティを除きます。

[label:] property-name;

以前に定義されたプロパティは削除される場合があります。

/delete-property/ property-name;

プロパティ値は、32ビット整数セルの配列、null終端文字列、バイト文字列、またはこれらの組み合わせとして定義できます。

  • セルの配列は、スペースで区切られたCスタイルの整数のリストを囲む山かっこで表されます。 例:

interrupts = <17 0xc>;
  • 値は、括弧内に算術式、ビット式、または論理式として表すことができます。

算術演算子

+   加算
-   減算
*   乗算
/   除算
%   剰余演算
ビット演算子

&    and
|    or
^    exclusive or
~    not
<<  左シフト
>>  右シフト
論理演算子

&&   論理積
||   論理和
!    否定
関係演算子

<    less than
>    greater than
<=   less than or equal
>=   greater than or equal
==   equal
!=   not equal
三項演算子

?:   (条件 ? value_if_true : value_if_false)
  • 64ビット値は、2つの32ビットセルで表されます。例:

clock-frequency = <0x00000001 0x00000000>;
  • null終端文字列値は、二重引用符を使用して表されます(プロパティ値には、NULL終端文字が含まれていると見做されます)。例:

compatible = "simple-bus";
  • バイト文字列は角かっこ [ ] で囲まれ、各バイトは2桁の16進数で表されます。 各バイト間のスペースはオプションです。例:

local-mac-address = [00 00 12 34 56 78];

または次も同等:

local-mac-address = [000012345678];
  • 値には、連結された複数のコンマ区切りのコンポーネントが含まれる場合があります。例:

compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";
  • セル配列では、別のノードへの参照がそのノードのハンドルに展開されます。 参照は & 後にはノードのラベルが続く場合があります。 例:

interrupt-parent = < &mpic >;

または、中かっこで囲まれたノードのフルパスが & の後に続く場合があります。例:

interrupt-parent = < &{/soc/interrupt-controller@40000} >;
  • セル配列の外側では、別のノードへの参照がそのノードのフルパスに展開されます。例:

ethernet0 = &EMAC0;
  • ラベルは、プロパティ値のコンポーネントの前後、セル配列のセル間、またはバイト文字列のバイト間に表示される場合もあります。例:

reg = reglabel: <0 sizelabel: 0x1000000>;
prop = [ab cd ef byte4: 00 ff fe];
str = start: "string value" end: ;

6.4. ファイルレイアウト

バージョン1のDTSファイルの全体的なレイアウトは次のとおりです。

/dts-v1/;
[memory reservations]
    / {
        [property definitions]
        [child nodes]
    };

/dts-v1/; はファイルをバージョン1 DTSとして識別するために存在する必要があります (このタグのないdtsファイルは、dtcによって、他の小さいが互換性のない変更に加えて、 整数に異なる形式を使用する廃止されたバージョン0にあるものとして扱われます)。

メモリ予約(5.3 章 を参照)は、次の形式の行で表されます。

/memreserve/ <address> <length>;

ここで、 <address><length> は64ビットのCスタイルの整数です。例:

/* Reserve memory region 0x10000000..0x10003fff */
/memreserve/ 0x10000000 0x4000;

/ { ... }; セクションはデバイスツリーのルートノードを定義し、すべてのデバイスツリーデータがその中に含まれます。

Cスタイル (/* ... \*/) およびC++スタイル (//) のコメントがサポートされています。