设备树插件定义和作用
设备树插件(Device Tree Overlay) 是一种用于设备树(Device Tree)的扩展机制。
设备树插件允许在运行时动态修改设备树结构的内容,以便添加、修改或删除设备节点和属性。嵌入式驱动开发者将不用再重新启动系统的情况下对硬件进行配置修改。
在早期的时候,每个嵌入式驱动开发者都因为引入了设备树而感到兴奋和激动。因为这使得开发者不用再写两套代码,且代码移植性也变得非常灵活。
然而设备树还有个不太方便的地方,就是每次配置完设备树,还得重新编译后烧录到板卡,重启系统才能完成配置。这使得驱动开发者非常头疼,有可能因为更改个GPIO属性都得重新过一遍烧录过程。所以在linux4.4以后引入了动态设备树。设备树插件是实现的方式。
一、预备知识如果不想关注原理,只是简单使用。可以跳过本节。
设备树插件是基于configfs实现的。所以本节介绍configfs的相关知识。
1. 什么是configfs在kernel目录下的Documentation/filesystems/configfs有官方说明文档configfs.txt 。其中是这样说明的:
configfs是与sysfs功能相反的基于ram的文件系统。sysfs是基于文件系统查看内核对象,configfs是基于文件系统管理内核对象或配置项
对于sysfs,一个对象是在内核中创建和删除的。内核控制着sysfs表示的生命周期,和sysfs只是一个窗口而已。而configfs配置项表示的生命周期完全由用户空间驱动,内核模块支持这样项目的必须作出响应。
它可以被编译成模块或者编入内核
2. 如何编写认识相关结构体
结构体相关性
编写-创建一个子系统并创建group
通过编译为KO文件并加载到开发板上,可以在/sys/kernel/config下查看到一个名为myconfig的group
编写-在子系统group中创建group
通过编译为KO文件并加载到开发板上,可以在/sys/kernel/config/myconfig下查看到一个名为mygroup的group
编写-在group中创建item
通过编译为KO文件并加载到开发板上,可以在/sys/kernel/config/myconfig/mygroup下使用mkdir创建group,使用rmdir可以删除相关group
编写-实现读写属性
通过编译为KO文件并加载到开发板上,可以在/sys/kernel/config/myconfig/mygroup下使用mkdir创建group,在此group下将会有write和read两个属性。可以通过echo对write写相关参数,通过cat read查看参数值
二、内核配置若实现设备树插件,还需要对内核进行相关配置
以上操作后,编译烧录到开发板。将在/sys/kernel下看到config目录,说明自动挂载上了。
如果不能自动挂载,则使用
mount -t configfs none /sys/kernel/config
接着配置内核支持设备树插件
关于设备树插件的相关驱动,我是通过网上下载得到的,就直接编译移植了(可以通过insmod加载KO方式也可以直接编译进内核)
相关文件放入如下网盘:
链接: https://pan.baidu.com/s/1uuwqCwlZNkSLorEWTmkFrQ 提取码: 5dbv
移植过程为一般驱动编译加载一样,这里不赘述。移植完成后将在sys/kernel/config下查看到一个名为device-tree的文件夹
四、设备树插件语法 1. 插件头部声明
/dts-v1/; /plugin/;
有如下三种表示形式(以rk3568的485节点为例):
五、编译与使用 1. 编译
编译的方式和编译设备树是一样的
sdk/kernel/scripts/dtc/dtc -I dts -O dtb overlay.dts -o overlay.dtbo
反编译为
sdk/kernel/scripts/dtc/dtc -I dtb -O dts overlay.dtbo -o overlay.dts
通过第三节加载相关驱动后,进入设备树插件相关configfs中
cd /sys/kernel/config/device-tree/overlays
创建一个内核对象
mkdir test
使用命令将dtbo写入到内核对象
cat /overlay.dtbo > /test/dtbo
使能dtbo
echo 1>/test/status
通过以下方式将能看到加载的节点
ls /proc/device-tree/rk-485-ctl/overlay_node/