[DTS]设备树实例解析
前言
前面对设备树的一些基本语法进行了讲解,然后这一节通过一个demo来实践一下具体的语法,可以和上一小节一起阅读。多看多改自然就慢慢理解语法规则了。^_^
实例解析
下面的dts文件内容是网上比较常见的一个demo,我们把它拿过来解析。为什么不从arch/arm/boot/dts/中找一份呢? 因为里面的dts内容都很多,看着很容易晕,所以找一份简短的来学习会更容易获取成就感。
/ {
compatible = "acme,coyotes-revenge";
#address-cells = <1>; //子结点需要一个 cell 描述地址
#size-cells = <1>; //子结点需要一个 cell 描述长度
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a9";
reg = <0>;
};
cpu@1 {
compatible = "arm,cortex-a9";
reg = <1>;
};
};
serial@101f1000 { //串口
compatible = "arm,pl011";
reg = <0x101f1000 0x1000 >;
interrupts = < 1 0 >;
};
serial@101f2000 { //串口
compatible = "arm,pl011";
reg = <0x101f2000 0x1000 >;
interrupts = < 2 0 >;
};
intc: interrupt-controller@10140000 { //中断控制器
compatible = "arm,pl190";
reg = <0x10140000 0x1000 >;
interrupt-controller;
#interrupt-cells = <2>;
};
spi@10115000 { //spi 控制器
compatible = "arm,pl022";
reg = <0x10115000 0x1000 >; 起始地址为 0x10115000,长度为 0x1000
interrupts = < 4 0 >;
};
external-bus { //external bus 桥
#address-cells = <2> //子结点需要两个 cell 描述地址,片选
#size-cells = <1>; //子结点需要一个 cell 描述长度
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 片选 0 0,地址 0x10100000 ,长度 0x10000
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = "smc,smc91c111";
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};
i2c@1,0 {
compatible = "acme,a1234-i2c-bus";
#address-cells = <1>; //rtc 需要一个 cell 描述地址
#size-cells = <0>; //rtc 不需要 0 描述长度
reg = <1 0 0x1000>;
rtc@58 {
compatible = "maxim,ds1338";
reg = <58>;
interrupts = < 7 3 >;
};
};
flash@2,0 {
compatible = "samsung,k8f1315ebm", "cfi-flash";
reg = <2 0 0x4000000>;
};
}; //external-bus
};
解析:
(1) 根节点
compatible: 内核通过root节点"/"的compatible属性来判断它启动的是哪个machine。
#address-cells : 子结点(reg属性)需要多少个cell描述地址。
#size-cells : 子结点(reg属性)需要多少个cell描述长度。
interrupt-parent : 标示该节点属于哪个中断控制器,如果没有该属性,则依附于父节点。
(2) cpus节点
#address-cells : 同上
#size-cells : 同上
(3) cpu节点
@unit-address: 可选项,设备地址,节点名相同时可以通过这个来区分不同节点。unit-address地址也经常在其对应的reg属性中给出。
reg : region,描述设备地址
格式: reg = <address1 length1 [address2 length2] [address3 length3]>
(4) serial节点
compatible: 外设节点上的compatible属性用于驱动和设备的绑定(匹配)
reg: 外设基地址和偏移量 ,比如:reg = <0x101f1000 0x1000 >
interrupts: 中断号和标识(上升沿,下降沿等), 里面多少个值要根据中断控制器的#interrupt-cells属性来决定。而#interrupt-cells属性值要由中断控制器的类型决定。
中断控制器类型:
GIC: Generic Interrupt Controller(通用中断控制器)
中断类型,中断号,标识(上升沿,下降沿等)
VIC : Vectored Interrupt Controller(向量中断控制器)
中断号
NVIC:Nested Vectored Interrupt Controller(内嵌向量中断控制器)
中断号,中断优先级
参考: Documentation\devicetree\bindings\interrupt-controller
(5) interrupt-controller节点
compatible: 中断控制器类型,查看上面路径下的文件来获知, 芯片datasheet也有说明。
reg:同上
interrupt-controller:空属性,用来声明这个节点接收中断信号。
#interrupt-cells:标识该控制器需要几个cell来描述中断,其实就是决定了interrupts属性需要几个cell
(6) external-bus节点
ranges: 地址转换表,每一行都包含子地址、父地址、在子地址空间内的区域大小。
ranges属性值为空的话,表示1:1映射。
ranges属性值的格式 <local地址, parent地址, size>
local地址的个数取决于当前含有ranges属性的节点的#address-cells属性的值。
parent地址的个数取决于父节点的#address-cells的值。
size取决于当前含有ranges属性的节点的#size-cells属性的值。
(7) rtc节点
reg: i2c设备地址
精彩还在继续,欢迎继续关注!!!!
欢迎加入QQ群聊
如果你喜欢就请分享给你的朋友,感谢大家的支持