【Linux驱动】添加设备树节点

00. 目录

01. Linux设备树概述

Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。 在早些的linux内核,这些“硬件平台的板级细节”保存在linux内核目录“/arch”, 以ARM平台为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/arm/mach-xxx”目录下。 随着处理器数量的增多用于描述“硬件平台板级细节”的文件越来越多导致Linux内核非常臃肿, Linux之父发现这个问题之后决定使用设备树解决这个问题。设备树简单、易用、可重用性强, linux3.x之后大多采用设备树编写驱动。

关于设备树的详细请参考:https://www.devicetree.org/

设备树的作用就是描述一个硬件平台的硬件资源。这个“设备树”可以被bootloader(uboot)传递到内核, 内核可以从设备树中获取硬件信息。

在这里插入图片描述

设备树描述硬件资源时有两个特点。

  • 第一,以“树状”结构描述硬件资源。例如本地总线为树的“主干”在设备树里面称为“根节点”, 挂载到本地总线的IIC总线、SPI总线、UART总线为树的“枝干”在设备树里称为“根节点的子节点”, IIC 总线下的IIC设备不止一个,这些“枝干”又可以再分。
  • 第二,设备树可以像头文件(.h文件)那样,一个设备树文件引用另外一个设备树文件, 这样可以实现“代码”的重用。例如多个硬件平台都使用i.MX6ULL作为主控芯片, 那么我们可以将i.MX6ULL芯片的硬件资源写到一个单独的设备树文件里面一般使用“.dtsi”后缀, 其他设备树文件直接使用“# includexxx”引用即可。

DTS、DTC和DTB它们是文档中常见的几个缩写。

  • DTS 是指.dts格式的文件,是一种ASII 文本格式的设备树描述,也是我们要编写的设备树源码,一般一个.dts文件对应一个硬件平台,位于Linux源码的“/arch/arm/boot/dts”目录下。
  • DTC 是指编译设备树源码的工具,一般情况下我们需要手动安装这个编译工具。
  • DTB 是设备树源码编译生成的文件,类似于我们C语言中“.C”文件编译生成“.bin”文件。

02. 设备树节点查看方法

我们以 3399 开发板为例,打开内核源码 arch/arm64/boot/dts/rockchip/目录,如下所示:

deng@local:~/a72/x3399/kernel/arch/arm64/boot/dts/rockchip$ pwd
/home/deng/a72/x3399/kernel/arch/arm64/boot/dts/rockchip
deng@local:~/a72/x3399/kernel/arch/arm64/boot/dts/rockchip$ 

输入命令编辑设备树文件

deng@local:~/a72/x3399/kernel/arch/arm64/boot/dts/rockchip$ vim x3399-linux.dts 

打开文件后,我们首先找到根节点,如下图所示:

在这里插入图片描述

我们在根节点的末尾准备添加设备节点,那么我们怎么来验证自己添加设备节点成功了呢?设备树可以在 linux 系统里面以文件或者是目录的形式表示出来,这里有两种方法。

方法一,我们进入到开发板的/proc/device-tree/目录下,如下图所示

[root@rk3399:/]# cd /proc/device-tree/
[root@rk3399:/sys/firmware/devicetree/base]# ls
'#address-cells'		 power-management@ff310000
'#size-cells'			 psci
 __symbols__			 pwm@ff420000
 adc-keys			 pwm@ff420010
 aliases			 pwm@ff420020
 amba				 pwm@ff420030
 backlight			 qos@ffa58000
 chosen				 qos@ffa5c000
 cif_isp@ff910000		 qos@ffa60080
 cif_isp@ff920000		 qos@ffa60100
 clock-controller@ff760000	 qos@ffa60180
 compatible			 qos@ffa70000
 cpuinfo			 qos@ffa70080
 cpus				 qos@ffa74000
 ddr_timing			 qos@ffa76000
 dfi@ff630000			 qos@ffa90000

比如说,我们想要查看根节点下的“model”“compatible”, 输入以下命令

[root@rk3399:/sys/firmware/devicetree/base]# cat model 
Rockchip RK3399 9tripod Board (Linux Opensource)[root@rk3399:/sys/firmware/devicetree/base]# 
[root@rk3399:/sys/firmware/devicetree/base]# cat compatible 
rockchip,rk3399-9tripod-linuxrockchip,rk3399[root@rk3399:/sys/firmware/devicetree/base]# 
[root@rk3399:/sys/firmware/devicetree/base]# 

接下来我们可以用这种方法来验证在设备树文件里面我们是否成功添加了自己的节点。

方法二,我们也可以进入开发板的/sys/firmware/devicetree/base/目录下,如下图所示:

[root@rk3399:/sys/firmware/devicetree/base]# cd /sys/firmware/devicetree/base/
[root@rk3399:/sys/firmware/devicetree/base]# ls
'#address-cells'		 power-management@ff310000
'#size-cells'			 psci
 __symbols__			 pwm@ff420000
 adc-keys			 pwm@ff420010
 aliases			 pwm@ff420020
 amba				 pwm@ff420030
 backlight			 qos@ffa58000
 chosen				 qos@ffa5c000
 cif_isp@ff910000		 qos@ffa60080
 cif_isp@ff920000		 qos@ffa60100
 clock-controller@ff760000	 qos@ffa60180
 compatible			 qos@ffa70000
 cpuinfo			 qos@ffa70080
 cpus				 qos@ffa74000
 ddr_timing			 qos@ffa76000
 dfi@ff630000			 qos@ffa90000
 display-subsystem		 qos@ffa98000
 dmc				 qos@ffaa0000
 dp-sound			 qos@ffaa0080
 dp@fec00000			 qos@ffaa8000
 dsi@ff960000			 qos@ffaa8080
 dsi@ff968000			 qos@ffab0000
 dummy-codec			 qos@ffab0080
 dummy_cpll			 qos@ffab8000
 dummy_vpll			 qos@ffac0000
 dw-hdmi-audio			 qos@ffac0080
 dwmmc@fe310000			 qos@ffac8000
 dwmmc@fe320000			 qos@ffac8080
 edp@ff970000			 qos@ffad0000
 efuse@ff690000			 qos@ffad8080
 energy-costs			 qos@ffae0000
 es8323-sound			 ramoops

03. 设备树中添加自定义节点

在设备树文件x3399-linux.dts文件中根节点添加自定义的节点,如下图所示,添加完保存退出。

    //自定义设备节点
    test1:test1{
        compatible = "test1";
        #address-cells = <1>;
        #size-cells = <1>;
        reg = <4 0xff790000 4 0xff790004>;
    };  

在这里插入图片描述

注意,添加自定义节点前要注释掉冲突使用的设备。添加完保存文件并退出,接下来编译设备树文件。

04. 设备树运行测试

重新编译设备树,将编译生成的设备树文件烧写到开发板上面,开发板启动后进入/proc/device-tree 目录下,如下图所示:

[root@rk3399:/sys/firmware/devicetree/base]# pwd
/proc/device-tree
[root@rk3399:/sys/firmware/devicetree/base]# ls -al | grep "test"
drwxr-xr-x   2 root root  0 May 16 02:30 test
drwxr-xr-x   2 root root  0 May 16 02:30 test-power
drwxr-xr-x   2 root root  0 May 16 02:30 test1
[root@rk3399:/sys/firmware/devicetree/base]# 

输入以下命令查看 test 节点信息,如下图所示:

[root@rk3399:/sys/firmware/devicetree/base]# cd test1
[root@rk3399:/sys/firmware/devicetree/base/test1]# ls
'#address-cells'  '#size-cells'   compatible   name   phandle   reg
[root@rk3399:/sys/firmware/devicetree/base/test1]# cat compatible 
test1[root@rk3399:/sys/firmware/devicetree/base/test1]# 

05. 设备树扩展思考

我们修改设备树文件x3399-linux.dts为下图所示,验证两个结论

1 通过节点的引用来修改原来节点里面的内容
2 通过节点的引用往原来的节点里面添加内容

我们添加了节点引用“status = “okay”,并且重新赋值给 compatible 为“test1234”。

//测试节点
&test1 {
        compatible = "test123456";
        status = "okay";
};

在这里插入图片描述

重新编译设备树,下载至开发板。

修改完设备树文件,然后编译烧写到开发板上面进入/proc/device-tree 目录下,如下图所示:

[root@rk3399:/]# cd /proc/device-tree/
[root@rk3399:/sys/firmware/devicetree/base]# cd test1
[root@rk3399:/sys/firmware/devicetree/base/test1]# cat compatible 
[root@rk3399:/sys/firmware/devicetree/base/test1]# cat status 
okay[root@rk3399:/sys/firmware/devicetree/base/test1]# 

由上图可知,我们验证的两个结论完全正确,已经可以查看到覆盖掉的 compatible 属性显示“test123456”,

可以查到 status 属性的状态为“okay”。

06. 附录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧海一笑-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值