Device Tree
📋
1. device tree的基本单元是node。
2. 这些node被组织成树状结构,除了root node,每个node都只有一个parent。
3. 一个device tree文件中只能有一个root node。
4. 每个node中包含了若干的property/value来描述该node的一些特性。
5. 每个node用节点名字(node name)标识,节点名字的格式是node-name@unit-address。
在一个树状结构的device tree中,要想唯一指定一个node必须使用full path,例如/node-name-1/node-name-2/node-name-N。
📋
1)属性值是text string或者string list,用双引号表示。例如device_type = "memory"
2)属性值是32bit unsigned integers,用尖括号表示。例如#size-cells = <1>
3)属性值是binary data,用方括号表示。例如binary-property = [0x01 0x23 0x45 0x67]
📋
1. device tree用于HW platform识别,runtime parameter传递以及硬件设备描述。chosen节点并没有描述任何硬件设备节点的信息,它只是传递了runtime parameter。
2. aliases 节点定义一些设备节点full path的缩写。
3. 系统中有一个interrrupt tree的根节点,device1、device2以及PCI host bridge的interrupt line都是连接到root interrupt controller的。PCI host bridge设备中有一些下游的设备,也会产生中断,但是他们的中断都是连接到PCI host bridge上的interrupt controller(术语叫做interrupt nexus),然后报告到root interrupt controller的。
4. pinctrl0是一个缩写,他是/pinctrl@56000000的别名。这里同样也是使用了Labels and References机制。
pinctrl
📋
device-node-name{
//定义该device自己的属性
pinctrl-names= "sleep","default","idle";
pinctrl-0 = &xxx_State_sleep;
pinctrl-1 = &xxx_state_default;
pinctrl-2 = &xxx_state_idle;
}
pinctrl-0 pinctrl-1 pinctrl-2 .....表示了该设备的一个个状态,这里我们定义了三个pinctrl-0 pinctrl-1 pinctrl-2,数字0、1、2就是pinctrl-names中对应的字符串数组的index。其中pinctrl-0就是“sleep”状态,pinctrl-1就是“default”状态,pinctrl-2就是“idle”状态。而xxx_state_sleep,xxx_state_default,xxx_state_idel就是驱动具体的pin配置项了,需要在pinctrl设备节点处定义:
pinctrl@e01b0000{
pinctrl-names = "default";
pinctrl-0 = <&state_default>;
state_default:pinctrl_default{
};
xxx_state_sleep:xxx_sleep{
xxx_mfp{
actions,groups = "fmp1_3_1spi0_ss","mfp1_3_1_spi0_miso","mfp1_5_4";
actions,function = "spi0";
};
};
Pinctrl子系统在加载时,会调用pinctrl_dt_to_map函数将dts文件中有关pinctrl的配置项解析出来,并根据dts各驱动节点对pinctrl的引用关系,将phandle挂到各个驱动的device tree子节点,各个驱动就可以通过自己的dev句柄获得pinctrl的配置了。
📋
serial@50000000 {
……
pinctrl-names = "default";
pinctrl-0 = <0x2 0x3>;
};
该serial device只定义了一个state就是default,对应pinctrl-0属性定义。pinctrl-0是一个句柄(phandle)列表,每个句柄指向一个pin configuration。0x2对应上节中的uart0-data节点,0x03对应uart0-fctl 节点,也就是说,这个串口有两种配置,一种是从gph bank中的第一个和第二个GPIO pin引出,另外一个是从gph bank中的第8个和第9个GPIO pin引出。