Linux设备树插件

什么是设备树插件

        Linux4.4 以后引入了动态设备树(Dynamic DeviceTree)。设备树插件(Device Tree Overlay) 是一种用于设备树(Device Tree)的扩展机制。设备树是一种用于描述硬件设备的数据结构, 广泛应用于嵌入式系统中,特别是基于 Linux 内核的系统中。

        设备树插件允许在运行时动态修改设备树的内容,以便添加、修改或删除设备节点和属性。 它提供了一种灵活的方式来配置和管理硬件设备,而无需重新编译整个设备树。通过使用设备树插件,开发人员可以在不重新启动系统的情况下对硬件进行配置更改。

        设备树插件通常以一种文本格式定义,称为设备树源文件(Device Tree Source,DTS)。DTS 文件描述了设备树的结构和属性,包括设备节点、寄存器地址、中断信息等。设备树插件可以通过加载和解析设备树文件,并将其合并到现有的设备树中,从而实现对设备树的动态修改。

设备树插件的应用场景

        使用设备树插件,可以实现一些常见的配置变化,比如添加外部设备,禁用不需要的设备, 修改设备属性等。这对于嵌入式系统的开发和调试非常有用,特别是面对多种硬件配置或需要频繁更改硬件配置的情况下。一下列出常用的应用场景:

        调试驱动无法预先在设备树里描述的设备动态修改设备树引脚复用

设备树插件语法

        设备树插件的语法格式基于设备树源文件的语法,但是有一些特定的语法和指令用于描述插件的行为。

1 首先添加插件头部声明,它指定了插件的名称和版本等信息,并指定了要修改的设备树的路径:

 /*表示设备树版本*/
/dts-v1/; 
 /*表示设备树插件*/
/plugin/;  

 2 插件节点名称用于定义要添加,修改或删除的设备节点及其属性。它使用与设备树源文件相 同的语法,但在节点名称前面使用特定的修饰符来指示插件的操作。例如给下图的 485 节点添加一个 overlay_node 子节点。

这是方法一,从根节点开始的绝对路径 。

/dts-v1/;
/plugin/;
/*从根节点开始的绝对路径 */
&{/vcc-camera-regulator}{
    overlay-node{
        status = "okay";
    };
};

相当于将设备树节点修改成这样。

vcc_camera: vcc-camera-regulator {
                compatible = "regulator-fixed";
                gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
                pinctrl-names = "default";
                pinctrl-0 = <&camera_pwr>;
                regulator-name = "vcc_camera";
                enable-active-high;
                regulator-always-on;
                regulator-boot-on;

                overlay-node{
                    status = "okay";
                    };
        };

这是方法二,使用节点的别名。

/dts-v1/;
/plugin/;
/*使用节点的别名 */
&vcc_camera{
    overlay-node{
        status = "okay";
    };
};

方法三, 固定写法,如果有多个节点,通过子节点 fragment@x 的序号区分,路径也是绝对路径。

/dts-v1/;
/plugin/;
/*其他写法 */
/{
    /*固定写法fragment@x */
    fragment@0{
        /*从根结点的开始的绝对路径 */
        target-path = "/vcc-camera-regulator";
        /*固定写法 */
        __voerlay__{
            voerlay-node{
                status = "okay";
            };
        };
    };
};

多个节点,通过子节点 fragment@x 的序号区分,路径也是使用节点绝对路径或者节点别名。

/dts-v1/;
/plugin/;
/*其他写法 */
/{
    /*固定写法fragment@x */
    fragment@0{
        /*从根结点的开始的绝对路径 */
        target-path = "/vcc-camera-regulator";
        /*固定写法 */
        __voerlay__{
            voerlay-node{
                status = "okay";
            };
        };
    };

    fragment@1{
        /*使用节点别名 */
        target = <&rk-485-ctl>;
        /*固定写法 */
        __voerlay__{
            voerlay-node{
                status = "okay";
            };
        };
    };
};

实际以上三种方法都是写法不同,方法一和方法二都会被编译成方法三的格式。

设备树插件文件编译

 选择方法一的写法创建 overlay.dts 文件,然后进行编译,和设备树文件 dts 是一样的,也是用 dtc 编译器编译。dtc 编译器路径选择自己的实际路径。

/home/topeet/Linux/rk356x_linux/kernel/scripts/dtc/dtc -I dts -O dtb overlay.dts -o overlay.dtbo

将 overlay.dts 文件编译成 overlay.dtbo,这里 dtbo 后缀名是为了和普通设备树文件区分,也可以写成dtb。

反编译设备树:将 dtbo 文件反编译成 dts 文件。

/home/topeet/Linux/rk356x_linux/kernel/scripts/dtc/dtc -I dtb -O dts overlay.dtbo -o test.dt

 可以从下图看到,方法一被编译成了方法三。

设备树插件的使用

  1.  首先将设备树插件驱动文件(dtbocfg.ko)加载到系统中。

设备树插件驱动和源码链接:https://pan.baidu.com/s/1AV7AMNEItxTGwfxselW5zQ?pwd=nw5q 
提取码:nw5q

输入命令 cat /proc/filesystems 检查 configfs 是否挂载成功。 

        2. 将编译好的 overlay.dtbo 文件拷贝到开发板上,然后进到系统 /sys/kernel/config/device-tree/overlays/(这个目录需要加载设备树插件才会生成)目录下。在这个目录下使用创建一个目录来表示内核对象。

        3. 进入创建的 test 目录,里面会自动生成两个文件 dtbo 和 status,然后将 overlay.dtbo 文件内容写入到 dtbo 里,并使能 dtbo。

        4. 通过上面的操作,就已经成功修改了设备树,可以在 /proc/device-tree/vcc-camera-regulator/ 节点下看到 overlay_node 子节点,这就是我们之前给 vcc-camera-regulator 节点添加的子节点,里面有 status 属性设置为了 okay

        5. 如果我们想删掉使用 dtbo 修改的节点,在 /sys/kernel/config/device-tree/overlays 下删除创建的 test 目录就行了,/proc/device-tree/vcc-camera-regulator/ 节点下就看不到 overlay_node 子节点了。

        6. 如果修改了多次设备树,那每次修改都重新创建一个目录来表示内核对象。例如我们重新写一个设备树插件文件 verlay1.dtbo,内容就是将 status 设置为 disabled。

  • /sys/kernel/config/device-tree/overlays/ 下创建 test 和 test1 目录,进入创建的 test 目录,将 overlay.dtbo 文件内容写入到 dtbo 里,并使能 dtbo。可以查看 /proc/device-tree/vcc-camera-regulator/overlay_node 节点下 status 属性为 okay。

  • 进入创建的 test1 目录,将 overlay1.dtbo 文件内容写入到 dtbo 里,并使能 dtbo。可以查看 /proc/device-tree/vcc-camera-regulator/overlay_node 节点下 status 属性为 disabled。

  • 如果我们删除 test1 目录,那么 status 的属性值就会变回 okay。

好了,以上就是设备树插件的使用,现在设备树插件还没合并到 Linux 主线中,只能动态加载驱动模块,如果想要知道设备树插件的原理,可以阅读百度网盘里的驱动源码。有什么疑问和建议可以在评论区提出来嗷。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设备树(Device Tree)是一种描述嵌入式系统硬件设备的文件格式,用于在Linux内核中动态配置和管理硬件。设备树采用树形结构,描述了开发板上的各种设备信息,比如CPU数量、内存基地址、接口上连接的设备等。设备树文件的扩展名为.dts,编译后得到.dtb文件。在引导Linux内核时,Bootloader会将.dtb文件的地址传递给内核,内核会根据设备树文件中描述的信息创建和注册相关设备。通过设备树开发者可以在不修改内核源代码的情况下配置和管理硬件设备。在编译Linux源码时,可以使用"make dtbs"命令来单独编译设备树文件,而不是编译整个源码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 设备树](https://blog.csdn.net/m0_69211839/article/details/130601344)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [linux设备树](https://blog.csdn.net/qq_27094347/article/details/121012569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值