没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
71页
描述硬件得文本文件,因为语法结构像树所以叫设备树 > DT:device tree:设备树(arm下表示) > FDT: flattened device tree:开放设备树、扁平设备树(powerpc使用的设备树,起源的设备又称openFirmware)因为源于openFirmware所以设备树很多函数带有of字词 > dts:device tree source : 设备树源码 > dtsi: device tree source include:通用设备树源码 > dtb:device tree blob:编译设备树源码得到得文件,镜像文件 > dtc:device tree compiler:设备树编译器 该文档的对应文章链接https://blog.csdn.net/qq_43581670/article/details/131969871
资源推荐
资源详情
资源评论
❤
作者主页:凉开水白菜
❤
作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步!
❤
点赞
👍
收藏
⭐
再看,养成习惯
订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑!
@TOC
一、什么是设备树,为什么叫设备树?
描述硬件得文本文件,因为语法结构像树所以叫设备树
DT:device tree:设备树(arm下表示) FDT: flattened device tree:开放设备树、扁平设备树
(powerpc使用的设备树,起源的设备又称openFirmware)因为源于openFirmware所以设备树很多函
数带有of字词 dts:device tree source : 设备树源码 dtsi: device tree source include:通用设备树源
码 dtb:device tree blob:编译设备树源码得到得文件,镜像文件 dtc:device tree compiler:设备
树编译器
通过DTC编译dts、dtsi文件编译出dtb文件 所有的设备树文件都存在与下面的路径
// arm32位架构设备树源码位置
板子kernel/arch/arm/boot/dts
// arm64位架构设备树源码位置
板子kernel/arch/arm64/boot/dts/品牌/
二、如何编译设备树?
DTC编译器的源码路径,dtc文件夹下面的dtc执行文件就是我们的设备树编译器(要保证源码已经编译过一
次) 如果编译完成还是没有可能是内核版本太低没有引进设备树,或者是配置选项未勾选,可以在.confg文件
中查看该选项
板子kernel/scripts/dtc
最简单的设备树源码
/dts-v1/;
/ {
};
编译器编译指令
编译设备树:dtc -I dts -0 dtb -o xxx.dtb xxx.dts
反编译设备树: dtc -I dtb -0 dts -o xxx.dts xxx.dtb
/home/book/licheepi/kernel/scripts/dtc/dtc需要根据我们内核实际路径来找
编译
/home/book/licheepi/kernel/scripts/dtc/dtc -I dts -O dtb -o test.dtb test.dts
反编译
/home/book/licheepi/kernel/scripts/dtc/dtc -I dtb -O dts -o test.dts test.dtb
遇到错误:
Error: test.dts:1.1-2 syntax error
FATAL ERROR: Unable to parse input tree
语法错误如果把/dts-v1/;设备树版本写错或者不写就会出现该问题
编译设备树第二种方法是在内核路径下执行ARCH是指定arm位数,CROSS_COMPILE指定交叉编译器
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
此时编译的是“板子kernel/arch/arm/boot/dts”该路径下的设备树文件,在该路径编译可能会出现错误,因
为他编译的是所有的设备树文件
三、设备树基本语法
3.1 根节点
设备树的组成是一棵树,而根节点是树干,是必须存在树的组成还有子节点和子子节点组成
/dts-v1/;
/ {
};
3.2 子节点
以上为根节点为固定格式,下面是子节点格式
[lable:]node-name[@unit-address]{
[properties definitions]
[child nodes]
};
// 需要注意在统一级节点名称节点名称不能相同不同级节点名称可以相同
// 子节点不能与子节点名称重复,但子子节点可以和子节点相同
// 例如子节点为node1 子子节点也可以有node1但子节点不能再有一个node1
举例
/dts-v1/;
/ {
node1{//子节点,子节点名称为node1
node1_child{//子节点的子节点,节点名称为node1_child
};
};
node2{
node1_child{
};
};
};
3.3 节点名称规则
对于节点名称,在对节点进行命名的时候一般要体现设备的类型,比如网口一般命名为ethernet,串口一般命
名为uart,对于名称一般要遵循下面的命令格式。
[标签]:<名称>[@<设备地址>]
其中,[标签]和[@<设备地址>]是可选项,<名称>是必选项。另外,这里的<设备地址>没有实际意义,只是
让节点名称更加人性化,更方便阅读使用
例如
uart: serial@02288000
其中uart就是这个节点标签也叫别名,serial@2288000就是节点名称
这里如果子节点内容为空编译会产生警告,这个reg属性后面会讲到
test.dtb:警告(unit_address_vs_reg):节点/gpio@02288000有单元名称,但没有reg属性
test.dtb:警告(unit_address_format):节点/gpio@02288000单元名称不应以0开头
在设备树中命名使用字符或数字需要根据以下表格约束,如同C语言中的变量命名规则不能使用某某符号不能
数字开头
四、设备树基本语法与属性
4.1 reg属性
reg属性可以用来描述地址信息,比如寄存器地址,我们的内核驱动也是通过这些属性来获取信息的,reg属性
的格式如下:
reg = <address1 length1 address2 length 2 address 3 length3....>
例如
reg = <0x2200000 0x4000>
// 寄存器的起始地址0x2200000 寄存器的长度为0x4000
reg = <0x02200000 0x4000
0x2205000 0x4000
>
4.2 #address-cells和#size-cells属性
#address-cells和#size-cells用来描述子节点中的reg信息中的地址和长度信息,他们决定了用多少个 32 位的
数来表示 address 和 size,需要注意如果是在根节点中插入此属性需要位于子节点之前
例如
node1{
#address-cells=<1>; //地址信息只能有一个u32记录
#size-cells=<0>; // 长度信息为0也就是没有长度
node1-child{
reg=<0>; // 地址为0无长度
};
};
node1{
#address-cells=<1>; //地址信息只能有一个u32记录
#size-cells=<1>; // 长度信息一个
node1-child{
reg=<0x02200000 0x4000>; //存储一个地址和一个长度信息
};
};
node1{
#address-cells=<2>; //地址信息两个u32
#size-cells=<0>; // 长度信息无
node1-child{
reg=<0x02200000 0x02205000>; //存储两个地址
};
};
剩余70页未读,继续阅读
资源评论
- qq_391439922023-11-26资源内容详细全面,与描述一致,对我很有用,有一定的使用价值。
- m0_749343932024-02-05资源内容总结的很到位,内容详实,很受用,学到了~
凉开水白菜
- 粉丝: 1w+
- 资源: 21
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功