文章目录
Zephyr中设备树的用途
- 以设备驱动模型描述硬件
- 提供硬件的初始化配置
设备树中的重要属性
compatible
编译时用于匹配绑定文件,输出对应的节点信息,程序中通过该属性查找相应的设备结构体。
#address-cells and #size-cells
#address-cells 属性定义了子节点中 reg 属性中表示地址的32位整数个数。
#size-cells 属性定义了子节点中 reg 属性中表示长度的32位整数个数。
&flash0 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x000000000 0x00010000>;
};
slot0_partition: partition@10000 {
label = "image-0";
reg = <0x000010000 0x000074000>;
};
slot1_partition: partition@75000 {
label = "image-1";
reg = <0x00084000 0x000074000>;
};
};
};
reg
用于描述设备地址,对于具体的设备而言是确定的,该属性由一对称作寄存器块的(地址,长度)序列组成,通常使用16进制表示,
下面是一些常见的样式:
- 通过内存映射的 I/O 寄存器访问设备,以 i2c@40003000 为例,地址通常指的是 i2C I/O 寄存器的基地址,长度指的是被寄存器占用的字节数。
- I2C 设备 (如apds9960@39): 地址指的是从设备地址,因此它没有长度信息。
- SPI 设备 地址指的是从设备选择线的编号,没有长度信息。
从这些例子中可以看出reg属性和单元地址有一些相似,这并不是巧合,reg属性可以看作是比单元地址对设备中可寻址的资源更详细的叙述。
status
以一个字符串代表节点是否被使能,设备树手册中允许该值为 “okay”, “disabled”, “reserved”, “fail”, “fail-sss”,当前Zephyr中仅使用了"okay", “disabled”。
interrupts
-
每个产生中断的设备包含一个 interrupts 属性,其值描述了该设备的一个或多个中断源,中断源使用中断说明符来表示,中断说明符的格式和含义是特定于中断域的,它依赖于其中断域根节点上的属性。
-
中断域是用来解释中断说明符的上下文,域的根要么是中断控制器要么是中断连接。
- 中断控制器是一种物理设备,它需要一个驱动程序来处理通过它路由的中断。它也可能级联到另一个中断域。中断控制器可通过 interrupt-controller 属性进行识别。
- 中断连接定义了一个中断域和另一个中断域之间的转换。转换基于特定域和特定总线,域之间的转换是使用 interrupt-map 属性实现的。例如,PCI控制器设备节点可以是一个中断连接节点,它定义了从PCI中断名称空间(INTA、INTB等)到具有中断号(IRQ)的中断控制器之间的转换。
-
中断源与中断控制器之间的连接由 interrupt-parent 属性表示,interrupt-parent 的值为 phandle类型,指向被设备中断路由到的设备,在中断控制器中,如果一个产生中断的设备没有 interrupt-parent 属性,那么它的中断父节点即为设备树中的父节点。
-
#interrupt-cells 属性的值代表设备中断说明符所需要的32位无符号整数个数。
- #interrupt-cells 为1,代表别的节点使用这个中断控制器只需要一个中断号。
- #interrupt-cells 为2,代表别的节点使用这个中断控制器提供中断号和触发方式。
- #interrupt-cells 为3,需要提供中断类型,中断号,中断触发方式。
-
中断触发方式
- 1 = low-to-high edge triggered,上升沿触发
- 2 = high-to-low edge triggered,下降沿触发
- 3 = both edge triggered,双边沿触发
- 4 = active high level-sensitive,高电平触发
- 8 = active low level-sensitive,低电平触发
-
中断类型
- IPI 核间中断
- PPI 私有外设中断
- SPI 共享外设中断
- SGI 软中断
-
arm-gic.h 中的中断类型定义
#define GIC_SPI 0x0
#define GIC_PPI 0x1
interrupts-extended
interrupts-extended 属性就可以既指定 interrupt-parent,也指定interrupts,比如:
interrupts-extended = <&exti 5 1>, <&exti 1 0>;