Linux设备树插件

news2024/9/24 9:24:37

什么是设备树插件

        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 主线中,只能动态加载驱动模块,如果想要知道设备树插件的原理,可以阅读百度网盘里的驱动源码。有什么疑问和建议可以在评论区提出来嗷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eNSP笔记②

动态路由 RIP [适用于小型网络] 静态路由是加上非直连的网段&#xff0c;动态路由是加上直连的网段 动态路由就是要宣告它要去的网段&#xff0c;在图中可以看到&#xff0c;一台路由需要宣告两个网段&#xff0c;路由A分别宣告10.0.0.0与192.168.1.0&#xff0c;路由B宣告10.…

是不是所有的低代码产品都能解决真实问题

随着大数据、云计算、人工智能技术的逐渐普及&#xff0c;越来越多的企业开始尝试建立&#xff0c;或者已经在企业内部建立起数字化的产品矩阵&#xff0c;有很多企业成功使用数字化帮助提升效率、发展业务能力的案例&#xff0c;但是也有不少企业发现数字化的能力建设成本巨大…

OpenCV17-图像形态学操作

OpenCV17-图像形态学操作 1.形态学操作1.1腐蚀1.2膨胀 2.形态学应用2.1开运算2.2闭运算2.3形态学梯度2.4顶帽运算2.5黑帽运算2.6击中击不中变换2.7形态学应用示例 1.形态学操作 1.1腐蚀 图像腐蚀&#xff08;Image erosion&#xff09;可用于减小图像中物体的大小、填充孔洞或…

高压放大器有哪些实际应用场景

高压放大器是一种特殊类型的放大器&#xff0c;用于放大高电压信号。它在各种实际应用场景中发挥着重要作用。在本文中&#xff0c;安泰电子将介绍高压放大器的主要应用场景&#xff0c;让我们更好地了解这些关键技术的实际应用。 医疗设备领域&#xff1a; 高压放大器在医疗设…

2023最新短视频配音软件~

随着互联网的迅猛发展&#xff0c;网络平台上的影视剧配音逐渐成为一种热门赚钱方式。那么&#xff0c;想要参与影视剧配音赚钱&#xff0c;就需要拥有一款好用的配音软件。下面我就为大家介绍一款最新的影视剧配音神器&#xff01; 悦音配音 这是一款大家都在用的配音工具&am…

TSINGSEE烟火识别算法的技术原理是什么?如何应用在视频监控中?

AI烟火识别算法是基于深度学习技术的一种视觉识别算法&#xff0c;主要用于在视频监控场景中自动检测和识别烟雾、火焰的行为。该技术基于深度学习神经网络技术&#xff0c;可以动态识别烟雾和火焰从有到无、从小到大、从大到小、从小烟到浓烟的状态转换过程。 1、技术原理 1…

企业微信设置可信域名

可信域名的验证文件注意一定放在域名所在的根目录下。 以cloud studio为例&#xff0c;工作区新建终端的路径就是域名在的根目录&#xff0c;而不是服务器的根目录

[DRAFT] LLVM ThinLTO原理分析

我们在《论文阅读&#xff1a;ThinLTO: Scalable and Incremental LTO》中介绍了ThinLTO论文的主要思想&#xff0c;这里我们介绍下LLVM ThinLTO是如何实现的。本文主要分为如下几个部分&#xff1a; LLVM ThinLTO Object 含有哪些内容&#xff1f;LLVM ThinLTO 是如何做优化的…

Splashtop 与 Canopy 携手共同增强对物联网设备的远程管理

2023年10月17日 加利福尼亚州库比蒂诺 Splashtop 在安全远程访问解决方案领域处于领先地位&#xff0c;Canopy 则是用于复杂硬件部署的领先 RMM 平台&#xff0c;双方今天宣布达成战略合作伙伴关系&#xff0c;以进一步增强和简化对物联网设备的远程管理。通过此次合作&#x…

react实现一维表格、键值对数据表格key value表格

UI画的需求很抽象&#xff0c;直接把数据铺开&#xff0c;不能直接用antd组件了 上一行是name&#xff0c;下一行是value&#xff0c;总数不定&#xff0c;最后前端还要显示求和 class OneDimensionTable extends React.Component { render() {const { data } this.props;le…

C++基础系列(一) 对象指针

一. 函数指针和指针函数 1.1 函数指针 这两个是C语言里两个比较绕的概念&#xff0c;我们先说一下函数指针 函数指针本质是一个指针&#xff0c;该指针的地址指向了一个函数。 在程序中定义了一个函数&#xff0c;那么在编译时系统就会为这个函数代码分配一段存储空间&#xf…

金融机器学习方法:K-均值算法

目录 1.算法介绍 2.算法原理 3.python实现示例 1.算法介绍 K均值聚类算法是机器学习和数据分析中常用的无监督学习方法之一&#xff0c;主要用于数据的分类。它的目标是将数据划分为几个独特的、互不重叠的子集或“集群”&#xff0c;以使得同一集群内的数据点彼此相似&…

window.location对象实例详解

一、前言 Window.location 只读属性返回一个 Location 对象&#xff0c;其中包含当前标签页文档的网页地址信息。 Window.location 是一个只读 Location 对象&#xff0c;但是我们仍然可以去重新赋值更改对象值。 下面就让我们详细介绍一下location的常用属性和方法&#xf…

基于springboot实现滴答拍摄影项目【项目源码+论文说明】

摘要 拍摄能让人放开自我、因看到不同的美景都想留下美好的记忆&#xff0c;有些人喜欢拍摄静物来表现宁静的氛围&#xff0c;通过小品类的照片&#xff0c;传达内心的情绪。而我更喜欢另一种方式&#xff0c;就是用长时间曝光把波动的海水或湖水雾化&#xff0c;拍摄出来的作…

为什么产品经理都要考NPDP?

最近很多宝子问我&#xff0c;产品经理适合考什么证书&#xff1f;那必然是NPDP啊&#xff01;作为国际产品专业认证&#xff0c;NPDP证书是现如今最炙手可热且含金量相对较高的证书了&#xff0c;下面胖圆讲给大家详细介绍一下NPDP证书的具体信息。 1&#xff09;NPDP是什么&…

Win10下基于VS2015编译SQLite3源码

一、下载SQLite SQLite SQLite Download Page 下载红框部分的3个文件 提示&#xff1a;这里有个 sglite-autoconf-3420000.tar.gz 是免编译版&#xff0c;想省事就下载这个&#xff0c;但我自己用这个老是编译不过 所以我这里不推荐这个了 二、配置SQLite 打开vs 2015或者其他…

vscode中快速生成vue3模板

步骤&#xff1a;设置 -> 用户代码片段 -> vue.json&#xff08;没有vue.json,选vue也可&#xff09;-> 定义自己所需的代码段 代码段 如下&#xff0c; {"Print to console": {"prefix": "vue3", //键入该值&#xff0c;按tab…

自定义类型(结构体 , 枚举 , 联合)详解

文章目录 结构体结构体变量初始化结构体内存对齐结构体的对齐规则:为什么存在内存对齐 修改默认对齐数结构体实现位段(位段的填充&可移植性)什么是位段(位是二进制位)位段的内存分配位段的跨平台问题 实现offsetof&#xff08;计算结构体成员相较于起始位置的偏移量&#x…

Netty入门指南之基础介绍

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献介绍为什么…

报错:AttributeError: module ‘tensorflow‘ has no attribute ‘flags‘

改成如下&#xff1a; 报错原因&#xff1a;tensorflow1.x与2.x版本问题不兼容