Device Tree詳解

Yoichi Yuasa
OSAKA NDS Embedded Linux Cross Forum #8

自己紹介
●

湯浅陽一

●

1999年よりよりLinux kernel開発に参加に参加参加●

MIPSアーキテクチャのいくつかののいくつかのCPUへLinuxkernelを移植移植

本日の内容の内容●●

Device Treeの概要
デバイスドライバの機能拡張にに参加Device Treeで対応する方法の説明する方法の説明方法の説明の説明

Device Treeとは●●Open Firmware Device Tree
Open Firmwareでハードウエア情報をやり取りを移植やり取りりする方法の説明ためのデータ構造構造

Device Treeとは(続きき)●●

中身はハードウエア構成情報はハードウエア構成情報をやり取り–

CPU情報をやり取り–

バス接続き構成情報をやり取り–

アドレス&サイズ情報情報をやり取り–

割り込み情報り込み情報み情報情報をやり取り–

クロック情報をやり取り–

デバイス有効/無効情報をやり取り–

その他デバイス特有情報などデバイス特有情報をやり取りなど

LinuxではPowerPCで最初にサポートに参加サポート

Device Treeのスタ構造イル/{};node1 {
a-bool-property;
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
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 {};};Open Firmware●●

SunのSPARCベースマシン、IBMのPOWERベースマシン、AppleのPowerPCベースマシンなどで利用
ハードウエアに参加依存しないファームウエアしないファームウエア– Open Firmware上で動作するプログラムは                    で動作するプログラムは                    する方法の説明プログラムはバイトコード(FCode)を移植利用●

IEEE 1275-1994として標準化標準化

Linux ArmでDevice Treeを移植導入した背景した背景●

2000年より前半ははArmではATAGを移植利用●

ATAGはリスト形式のデータのデータ構造●

データ構造例
Tag name

Value

ATAG_CORE

0x54410001

5( 2 if empty) Start list(flags, pagesize, rootdev)

ATAG_MEM

0x54410002

4

Physical area of memory

ATAG_SERIAL 0x54410006

4

Board serial No.

ATAG_NONE

2End list...

0x00000000

Size

DescriptionLinux ArmでDevice Treeを移植導入した背景した背景(続きき)●ATAGに参加プラスの対応する方法の説明– ボード毎のデータをソースコードにハードコーディングのデータ構造を移植ソースコードに参加ハードコーディング– ボード毎のデータをソースコードにハードコーディングに参加カーネルコンフィグレーションを移植用意●

サポートする方法の説明ボード数が増えると破綻が見えてきたが増えると破綻が見えてきた増えると破綻が見えてきたえる方法の説明と破綻が見えてきたが増えると破綻が見えてきた見えてきたえて標準化きた– 1つのボードを移植サポートする方法の説明ために参加複数が増えると破綻が見えてきたファイルを移植追加– Arm開発に参加者がボードサポートに本腰を入れてボード数が急激に増加が増えると破綻が見えてきたボードサポートに参加本腰を入れてボード数が急激に増加を移植入した背景れて標準化ボード数が増えると破綻が見えてきたが増えると破綻が見えてきた急激に増加に参加増えると破綻が見えてきた加●

既存しないファームウエアでサポートされて標準化いる方法の説明Open Firmware Device Treeを移植採用

Device Treeの利用
Device Treeソースからコンパイルしてバイナリコンパイルして標準化バイナリ(dtb)dtb))を移植生成dtc -O dtb) -o foo.dtb) foo.dts●dtb)単体またはまたはLinux kernelとdtb)を移植結合して利用可能して標準化利用可能●●–

ブートローダででdtb)を移植メモリ上で動作するプログラムは                    に参加配置–

起動したkernelからコンパイルしてバイナリDevice Treeを移植参照–

結合して利用可能した状態でもでもLinux kernelと同時にロードされるだけで動作は同一に参加ロードされる方法の説明だけで動作するプログラムは                    は同一dtb)を移植入した背景れ替えれば容易に複数のボードをえれば容易に複数のボードを容易に複数のボードをに参加複数が増えると破綻が見えてきたのボードを移植1つのLinux kernel
バイナリ(dtb)カーネルコンフィグレーション)でサポートできる方法の説明

Device Treeの問題点●

Linux kernelのサイズ情報が増えると破綻が見えてきた大きくなるきくなる方法の説明– 1つのkernelで複数が増えると破綻が見えてきたボードを移植サポートする方法の説明場合して利用可能– kernelが増えると破綻が見えてきた大きくなるきくなりやすいので小さなシステムで  さなシステムで利用する方法の説明に参加はカーネルコンフィグレーションのチューニングが増えると破綻が見えてきた必要

デバイスドライバの機能拡張にとDevice Tree●

個別機能のON/OFF– ソースコードを移植変更してして標準化ON/OFFする方法の説明とkernelのコンパイルが増えると破綻が見えてきた

必要●

デバイス設定値をボード毎に細く調整を移植ボード毎のデータをソースコードにハードコーディングに参加細く調整く調整– ソースコードを移植変更してして標準化対応する方法の説明する方法の説明とkernelのコンパイルが増えると破綻が見えてきた必要– 管理するする方法の説明kernelバイナリの数が増えると破綻が見えてきたが増えると破綻が見えてきた増えると破綻が見えてきたえる方法の説明●

Device Treeだけを移植変更してして標準化機能を移植切り替えるり替えれば容易に複数のボードをえる方法の説明

Device Tree propertyを移植
デバイスドライバで読み出すみ情報出すす●

デバイスドライバのprobe関数が増えると破綻が見えてきた内でpropertyを移植読み出すみ情報出すすstatic struct platform_driver foo_driver = {.driver = {.name = “foodev”,.of_match_table = foo_id_table,},.probe = foo_probe,.remove = foo_remove,};個別機能を移植ON/OFFする方法の説明(Device Tree)●●

Bool propertyを移植利用
Device Treeのデバイスnode内に参加Bool propertyが増えると破綻が見えてきた有る方法の説明か無いかで動作するプログラムは                    を移植切り替えるり替えれば容易に複数のボードをえる方法の説明
foodev: foodev0 {compatible = “foodev”;
foodev-barfunc-enable;};個別機能を移植ON/OFFする方法の説明(デバイスドライバ)●

Device Treeのpropertyを移植読み出すみ情報出すして標準化設定を移植切り替えるり
替えれば容易に複数のボードをえる方法の説明
sturct device *dev;
if (of_property_read_bool(dev->of_node, “foodev-barfunc-enable”)) {個別機能enable処理する} else {個別機能disable処理するor何もしないもしない}

デバイス設定値をボード毎に細く調整を移植ボード毎のデータをソースコードにハードコーディングに参加
細く調整かく調整(Device Tree)●●

数が増えると破綻が見えてきた値をボード毎に細く調整propertyを移植利用
Device Treeのデバイスnode内に参加数が増えると破綻が見えてきた値をボード毎に細く調整propertyが増えると破綻が見えてきた
有れば容易に複数のボードをその値をボード毎に細く調整を移植読み出すみ情報出すし設定する方法の説明
foodev: foodev0 {compatible = “foodev”;
foodev-barvalue = <123>;};

デバイス設定値をボード毎に細く調整を移植ボード毎のデータをソースコードにハードコーディングに参加細く調整かく調整(デバイスドライバ)●

Device Treeのpropertyを移植読み出すみ情報出すして標準化値をボード毎に細く調整を移植利用
sturct device *dev;
u32 value;
int ret;ret = of_property_read_u32(dev->of_node, “foodev-barvalue”, &value)) ;if (ret) {エラー処理する}
valueの値をボード毎に細く調整を移植デバイスへ設定

まとめ
●

●

Device TreeからコンパイルしてバイナリBoolや数が増えると破綻が見えてきた値をボード毎に細く調整以外にも文字列やに参加も文字列やや数が増えると破綻が見えてきた値をボード毎に細く調整/文字列やの配列やなども取り得できるできる方法の説明
Device Treeからコンパイルしてバイナリ値をボード毎に細く調整を移植取り得できるして標準化利用する方法の説明ことに参加
よりソースコードの値をボード毎に細く調整を移植いちいち書き換える  き換える  える方法の説明
より柔軟性が増すが増えると破綻が見えてきた増えると破綻が見えてきたす参考●●●

Documentation/arm/Booting
http://www.simtec.co.uk/products/SWLINUX/
files/booting_article.html
https://elinux.org/Device_Tree_Reference