设备树学习

1、什么是设备树

设备树采用树形结构描述板级设备,即开发板上的设备信息,描述设备树的文件叫做DTS(Device Tree Source)。
在这里插入图片描述
DTS是设备树的源码文件,DTB是将DTS编译以后得到的二进制文件。编译DTS文件需要用到DTC工具。DTC 工具源码在 Linux 内核的 scripts/dtc 目录下。

2、 .dtsi文件

在设备树中,头文件扩展名为.dtsi。在.dts设备树文件中,可以通过#include来引用.h、.dtsi、.dts文件。一般.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范
围,比如 UART、 IIC 等等。

3、 设备节点

设备树是采用树形结构来描述板子上的设备信息,每个设备都是一个节点,这个节点叫做设备节点。每个节点都通过一些属性来描述节点信息,属性就是键值对。在设备树中,节点的命名格式为:

node-name@unit-address

node-name是节点的名字,为ASCII字符串,节点名应该能够清晰的描述出节点的功能,unit-address一般表示设备的地址或者寄存器的首地址,如果某个节点没有地址或者寄存器,则unit-address可以不要。
有时节点使用以下格式:

label: node-name@unit-address

引入 label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点。
每个节点都有不同的属性,不同的属性有不同的内容,属性都是键值对,值可以为空或任意的字节流。设备树源码中常用的几种数据形式如下:

  1. 字符串流:
compatible = "arm,cortex-a7";
  1. 32位无符号整数:
reg = <0>;
或
reg = <0 0x123456 100>;
  1. 字符串列表:
    属性值也可以为字符串列表,字符串和字符串之间采用“,”隔开
compatible = "fsl,imx6ull-gpmi-nand", "fsl, imx6ul-gpmi-nand";

4、标准属性

除了用户自定义的属性,有很多是标准属性,Linux下很多外设驱动都会使用这些标准属性。

  1. compatible属性:
    compatible 属性也叫做“兼容性”属性,compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:
"manufacturer,model"

manufacturer 表示厂商, model 一般是模块对应的驱动名字。一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动。

  1. model 属性:
    model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的, 比如:
model = "wm8960-audio";
  1. status 属性:
    status 属性和设备状态有关的, status 属性值也是字符串,字符串是设备的状态信息,可选的状态如下:
    在这里插入图片描述
  2. #address-cells 和#size-cells 属性:
    这两个属性的值都是无符号 32 位整形,#address-cells#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位) , #size-cells 属性值决定了子节点 reg字长(32 位)。 #address-cells#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, reg 属性的格式一为:
reg = <address1 length1 address2 length2 address3 length3……>

每个“address length”组合表示一个地址范围,其中 address 是起始地址,length 是地址长度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用的字长。
5. reg 属性:
reg 属性的值一般是(address, length)对。 reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。
6. ranges 属性:
ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字
矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:
child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址
所占用的字长。
parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物
理地址所占用的字长。
length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。
如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值