1、在使用intel SOC过程中,驱动的DTS需要在内核启动以后把FPGA core load以后加载PL侧设备的DTS,此时使用的是Linux的dts的overlay机制,该机制本质是使用Linux的configfs 机制,在此分析。
2、 Linux内核驱动中使用的设备树作为驱动match的方法,在内核初始化时候会对dts解析,然后生成一个个的device node,根据node 中的compatile 与driver中的相应的属性对比,如果一致就会执行driver 中的probe函数。一般来说dts 构造出的东西是不需要改变的,在kernel 初始化之前就已经确定完成了,但是有些SOC集成了FPGA模块,如果FPGA的firmware有修改,或者说该SOC的FPGA的fireware必须得在Linux kernal setup 完成以后加载,而我们的驱动中的好多模块都是基于FPGA的,这样内核中的dts就得需要做相应的修改,这样就出现了overlay机制。 该机制就是在kernel 启动以后系统加载时候修改或者增加部分dtsi,最终把整个系统需要的设备驱动全部加载进去。(忘记从谁的博客抄的了)
3、 Linux内核中对configfs的介绍和实例都在 documentation/filesystems/configfs/configfs.txt。网上对configfs的介绍基本都是对该文件的翻译,比较详细的refer:https://blog.csdn.net/u014135607/article/details/79949571
4、这款soc手册中给出的加载实例:
mkdir /sys/kernel/config/device-tree/overlays/0
# echo socfpga_stratix10_ovl1.dtb >/sys/kernel/config/device-tree/overlays/0/path
Refer :https://www.intel.com/content/www/us/en/programmable/documentation/kqx1502122862454.html
5、configfs是什么?
configfs - Userspace-driven kernel object configuration.直接翻译过来就是用户空间配置内核对象,在configfs.txt中可以看到其中的描述:configfs是一个基于ram的文件系统,通过对该文件系统的操作实现对内核对象的配置。
6、数据结构分析
根据configfs.txt的说明我们可以抽象的理解configfs的文件主要分成三层:1、configfs_subsystem (子系统) 2、configfs_grounp(组层) 3、config_item. 我们在使用时候一般会创建一个config_subsystem,再在这个子系统下边创建config_group,在config_group创建config_item,然后具体的操作都是config_item相关的,config_item中的接口的具体实现就是文件的具体操作,我们在不去了解具体实现的情况下猜测的操作可能有:创建(mkdir)、删除(rm )、读(read)、写(write)等操作。具体的实际例子可以看configfs.txt。
7、 根据这个分析可以确定我们在设备树重新加载时候肯定是调用了mkdir 接口创建了overlay 和patch ,也调用了write 把.dtbo文件写进去。
8 、code分析(drivers/of/configfs.c)
static int __init of_cfs_init(void)
{
int ret;
pr_info("%s\n", __func__);
//新创建一个子系统
config_group_init(&of_cfs_subsys.su_group);
//新建一个目录 目录名字是overlays 对应的操作是overlays_type
config_group_init_type_name(&of_cfs_overlay_group, "overlays",
&overlays_type);
//将目录 放到这