Linux中的设备树详解


前言

设备树是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= 0xff0000000x0 为高 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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值