设备树(Device Tree)是Linux内核用于描述硬件设备及其配置的一种方法,通常用于嵌入式系统和一些需要详细描述硬件拓扑结构的系统中。设备树使用设备树源文件(DTS)和设备树包含文件(DTSI)来描述硬件,这些文件最终会被编译为设备树二进制文件(DTB),内核在启动时解析这些DTB文件以了解硬件配置。
以下是设备树语法的一些基本元素和示例:
基本元素
- 节点(Node):
- 节点表示设备或总线。
- 每个节点都有一个名称,并用大括号
{}
包含其属性和子节点。
- 属性(Property):
- 属性描述节点的特性,格式为
name = value;
。 - 值可以是字符串、整数、数组等。
- 属性描述节点的特性,格式为
- 标签(Label):
- 标签用于引用节点或属性,用
&label_name
表示。
- 标签用于引用节点或属性,用
- 包含文件(Include):
- 使用
/include/
指令包含其他 DTSI 文件。
- 使用
示例
以下是一个简单的设备树示例,描述了一个具有GPIO和UART接口的设备:
/dts-v1/;
/include/ "some_common_file.dtsi"
/ {
model = "My Custom Board";
compatible = "myvendor,mycustomboard";
aliases {
serial0 = &uart0;
};
chosen {
bootargs = "console=ttyS0,115200";
};
memory {
device_type = "memory";
reg = <0x80000000 0x10000000>; // 起始地址和大小
};
gpio@4804c000 {
compatible = "fsl,imx6q-gpio", "fsl,imx21-gpio";
reg = <0x4804c000 0x4000>;
interrupt-parent = <&intc>;
interrupts = <56>;
#gpio-cells = <2>;
gpio-controller;
};
uart0: serial@4806c000 {
compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
reg = <0x4806c000 0x4000>;
interrupts = <58>;
clocks = <&clks 200>;
status = "okay";
};
};
解释
/dts-v1/;
:这是固定的文件头,标识设备树版本。/
:根节点。model
和compatible
:描述设备的型号和兼容性字符串。aliases
:定义别名,方便引用其他节点。chosen
:包含一些系统启动时使用的参数,如bootargs
。memory
:描述内存区域。gpio@4804c000
:GPIO控制器节点,包含兼容性和寄存器地址等信息。uart0: serial@4806c000
:UART接口节点,包含兼容性、寄存器地址、中断号等信息。
常用属性
compatible
:用于指定设备的兼容性字符串,通常是vendor,model
格式。reg
:描述设备的寄存器地址和大小。interrupts
:描述设备使用的中断号。clocks
:描述设备使用的时钟源。status
:描述设备状态,常用值有"okay"
、"disabled"
等。
编译设备树
使用 DTC(Device Tree Compiler)编译 DTS 文件为 DTB 文件:
dtc -I dts -O dtb -o my_device_tree.dtb my_device_tree.dts
总结
设备树是描述硬件配置的强大工具,通过掌握其基本语法和常用属性,可以灵活地为各种嵌入式系统定义硬件配置。希望这个介绍对你有所帮助!