阳泉市网站建设_网站建设公司_HTTPS_seo优化
2025/12/21 22:56:27 网站建设 项目流程

Linux设备树基础

笔记学习整理基于野火鲁班猫教程并且添加自己学习后理解的内容然后还有ai的一些总结。如果有说的不好或者不对的地方希望大家指正!!!

这是设备树的简略图,设备树的根节点扩张了许多子节点。

有关设备树,DTS、DTC和DTB它们是文档中常见的几个缩写。

DTS 是指.dts格式的文件,是一种ASII 文本格式的设备树描述,也是我们要编写的设备树源码,一般一个.dts文件对应一个硬件平台,对应arm64架构,源文件位于Linux源码的“/arch/arm64/boot/dts”目录下。

DTC 是指编译设备树源码的工具,一般情况下我们需要手动安装这个编译工具。

DTB 是设备树源码编译生成的文件,类似于我们C语言中“.C”文件编译生成“.bin”文件。

设备树基本框架:

1、上面是示例代码,设备树是由许多根节点和子节点构成的。“/ {…};”表示“根节点”,每一个设备树只有一个根节点。 如果打开“rk3568.dtsi”文件可以发现它也有一个根节点,虽然“rk3568-lubancat2.dts”引用了“rk3568.dtsi”文件, 但这并不代表“rk3568-lubancat2.dts”设备树有两个根节点,因为不同文件的根节点最终会合并为一个。根节点内到&的是追加节点,这表示该节点在向已经存在的子节点追加数据。这些“已经存在的节点”可能定义在“rk3568-lubancat2.dts”文件, 也可能定义在“rk3568.dtsi”文件所包含的设备树文件里。 rk3568-lubancat2.dts代码中的“&cpu0 {…}”、“&dmc {…}”、“&i2c0 {…}”等等追加的目标节点,就是定义在“rk3568.dtsi”中。同时设备树可以include .h文件,dts文件,dtsi文件。

2、aliases子节点的作用就是为其他节点起一个别名。和节点标签很像,例如:

soc {

// 标签uart2:开发者写设备树时,用&uart2就能引用这个节点

uart2: serial@12340000 {

compatible = "xxx,uart";

status = "disabled";

};

};

// 2. 定义aliases(给内核用)

aliases {

// 别名uart0:内核代码中,用uart0就能找到这个节点

uart0 = &uart2;

// 甚至可以给同一个节点加多个系统级别名

console = &uart2;

};

你会发现节点别名是给节点标签用的,& 符号在设备树中只能跟节点标签,简化开发。

举个例子:设备树中一个 CSI2 DPHY 节点的实际路径可能是/soc/csi2-dphy@12340000,标签是csi2_dphy0。

如果没有aliases:内核要找到这个节点,需要遍历/soc/目录,匹配节点名或compatible属性,效率低;

如果有aliases:内核可以直接读取aliases节点中的csi2dphy0键,直接定位到&csi2_dphy0对应的节点,效率高。

3、chosen子节点:chosen子节点不代表实际硬件,它主要用于给内核传递参数。 此外这个节点还用作uboot向linux内核传递配置参数的“通道”, 我们在Uboot中设置的参数就是通过这个节点传递到内核的, 这部分内容是uboot和内核自动完成的,作为初学者我们不必深究。

节点的基本格式:

  1. nodename用于描述节点名字,且应用字母开头,命名规则与C语言函数或者变量名类似。
  2. @unit-address其中的符号“@”可以理解为是一个分割符,“unit-address”用于指定“单元地址”, 它的值要和节点“reg”属性的第一个地址一致。如果节点没有“reg”属性值,可以直接省略“@unit-address”, 不过要注意这时要求同级别的设备树下(相同级别的子节点)节点名唯一,从这个侧面也可以了解到, 同级别的子节点的节点名可以相同,但是要求“单元地址”不同,node-name@unit-address 的整体要求同级唯一。
  3. Label是child-nodel(节点名)的节点标签,通常节点标签是节点名的简写,所以它的作用是当其它位置需要引用时可以使用节点标签来向该节点中追加内容。
  4. 节点路径:如childnode1是node1name节点的子节点,所以对于childnode1它的节点路径是/node1-name/child-node1。
  5. 节点属性:节点属性分为标准属性和自定义属性。在节点的“{}”中包含的内容是节点属性,通常情况下一个节点包含多个属性信息, 这些属性信息就是要传递到内核的“板级硬件描述信息”,驱动中会通过一些API函数获取这些信息。例如根节点“/”就有属性compatible = “rockchip,rk3568”。我们可以通过该属性了解到硬件设备相关的名字叫“rk3568”,设备所使用的的是“rk3568”这颗 SOC。
  6. compatible属性值由一个或多个字符串组成,有多个字符串时使用“,”分隔开。设备树中的每一个代表了一个设备的节点都要有一个compatible属性。 compatible是系统用来决定绑定到设备的设备驱动的关键。 compatible属性是用来查找节点的方法之一,另外还可以通过节点名或节点路径查找指定节点。之前讲设备模型讲过总线会有个绑定的match函数,里面最常用的就是提供设备树compatible和of_match_table来匹配设备和驱动。
  7. 通常情况一个节点代表一个设备

针对之前的代码示例图讲述其他的节点属性:

1、compatible属性:用于匹配设备和驱动(上面讲了)

2、model属性:model属性用于指定设备的制造商和型号,推荐使用“制造商, 型号”的格式,当然也可以自定义。

3、status属性: 状态属性用于指示设备的“操作状态”, 通过status可以去禁止设备或者启用设备, 默认情况下不设置status属性设备是使能的。下图是常用的状态。

4、#address-cells 和 #size-cells和reg:

#address-cells和 #size-cells属性同时存在,在设备树中,#address-cells和#size-cells是父节点的属性,用于规定子节点reg属性的格式—— 这两个属性仅对当前节点的直接子节点生效。reg属性用于描述硬件资源的地址范围(如寄存器、内存、外设的物理地址),格式为<基地址 地址长度>(或多组地址范围)。#address-cells规定子节点reg属性中,“基地址” 部分占用的单元格数量。#size-cells规定子节点reg属性中,“地址长度” 部分占用的单元格数量。例:父节点soc的#address-cells = <1> → 子节点ocrams的reg中,基地址0x900000用 1 个单元格表示。父节点soc的#size-cells = <1> → 子节点ocrams的reg中,地址长度0x4000用 1 个单元格表示。第二个图是其余示例你会看到child后面没跟@,这里没有重名风险,但是依旧推荐添加@address。

5、name和device_type这两个属性很少用(已经被废弃),不推荐使用。name用于指定节点名,在旧的设备树中它用于确定节点名, 现在我们使用的设备树已经弃用。device_type属性也是一个很少用的属性,只用在CPU和内存的节点上。 如上例中所示,device_type用在了CPU节点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询