文章目录
前言
设备树是Linux驱动开发中必不可少的环节之一,它可以帮助我们快速了解设备硬件结构及快速配置,提高工作效率
一、设备树是什么
dts:设备树,是一种描述硬件的数据结构,一个dts对应一个开发板。dts文件中会包含有dtsi,就类似于C语言当中的头文件,把板级相同的节点定义都包含在同一个文件中。很多时候我们不必从头开始写一个设备树,大多数情况下都是在原厂Soc提供的设备树基础上进行修改。
dtc:编译dts的工具,一般路径在内核目录的scripts/dtc下,要编译dts文件,只需在源码目录make all或make dtbs或 make xxx.dtb(指定)即可。
二、节点说明
1.简单结构示意图
下面展示一个最基础,简单的设备树结构图。
/{
node1{
p1 = a;
p2 = b;
};
node2{
p3 = c;
node3{
p4 = d;
};
};
};
2.设备节点的命名格式
[label:]node-name[@unit-address] {
[properties definitions]
[child nodes]
};
即:
cpus{
cpu1:cpu@0{
compatible = "cpu";
};
};
[ ] 代表可忽略
label 方便给其他节点引用
node-name 节点名字
unit-address 设备地址
properties 属性值,不一定要有
常用属性值的形式:
字符串: compatible = "arm,cortex-a53";
32位无符号整形 clock-latency = <1000>;
二进制 local-mac-address = [00 0a 35 00 1e 53];
字符串数组 compatible = "n25q512a","micron,m25p80";
混合 mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
节点引用 clocks = <&clkc 3>; 引用clkc这个节点,clkc即是“label”
3.linux下的标准属性
常用的节点属性如下:
compatible 属性,非常重要,用于将驱动和设备绑定起来,与驱动程序文件的OF匹配表中值相等,就表示设备可以使用这个驱动
compatible = "xlnx,xuartps", "cdns,uart-r1p8";
model 属性,指定制造商型号,内核解析设备树时会打印出来
model = "Alientek Zynq MpSoc Development Board";
status 属性,禁止或启用设备
status = okay(默认)/disabled
#address-cells 和#size-cells 属性 描述子节点的地址信息
#address-cells reg中的首地址数量 address占用字长 1个字长32bit
#size-cells reg中的地址长度 length占用字长
reg = <address1 length1 address2 length2 address3 length3……>
reg 属性 描述设备地址空间资源信息
reg = <0x0 0xff000000 0x0 0x1000>;
64位时:address= 0xff000000( 0x0 为高 32 位), length= 0x1000
reg = <0xff000000 0x04>;
32位时:address=0xff000000,映射到虚拟空间长度为4字节
ranges 属性 地址转换表,可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写
soc{
ranges = <0x0 0xe0000000 0x00100000>;
serial{
reg = <0x4600 0x100>;
};
};
soc中,指定1024KB(0x00100000)的地址范围,子地址空间的物理起始地址为 0x0,父地址空间的物理起始地址为 0xe0000000
serial是串口设备节点,起始地址为 0x4600,寄存器长度为 0x100
经过地址转换, serial 设备可以从 0xe0004600 开始进行读写操作,0xe0004600=0x4600+0xe0000000
device_type 属性 表示节点类型,用得比较少
device_type = "cpu";
4.特殊节点
接下来讲一下常用的几个特殊的设备树节点
aliases{
//取别名,方便内核访问,不是设备树
ethernet0 = &gem0;
};
chosen{
bootargs