当前位置: 首页 > news >正文

Linux-笔记 设备树插件

目录

前言:

设备树插件的书写规范:

设备树插件的编译:

内核配置:

应用背景:

举例:


前言:

        设备树插件(Device Tree Blob Overlay,简称 DTBO)是Linux内核和嵌入式系统中用于动态修改或扩展系统运行时的设备树配置的一种机制。它是对传统设备(Device Tree Source,简称 DTS)的补充,允许在不重新编译整个内核的情况下,对硬件配置进行更改。本质也是个设备树文件。

设备树插件的书写规范:
/dts-v1/;        // dts 版本;
/plugin/;        //表示设备树插件/ {fragment@0 {     //固定的写法target-path = "xxx";   //要覆盖替换的节点路径,从根节点开始写__overlay__ {    //固定写法/*在此添加要插入的节点*/};};fragment@1 {target-path = "xxx";   //要覆盖替换的节点路径__overlay__ {/*在此添加要插入的节点*/};};};
设备树插件的编译:
<sdk>/out/t113/kernel/build/scripts/dtc/dtc -I dts -O dtb -o xxx.dtb xxx.dts
<sdk>/.../dtc :使用sdk下的dtc
-I dts:指定输入文件格式为dts
-O dtb:指定输出文件类型为dtb
-o xxx:指定输出文件名
xxx.dts:输入文件名称
内核配置:
Device Drivers -> Device Tree and Open Firmware support -> [*]Device Tree overlays
应用背景:

        比如一个开发平台能适配许多的屏幕,如果按以前的做法,每次更换一个屏幕都得重新编译一次,如果我们可以采用dtbo来实现的话,就会很方便,我们可以将每种屏幕都做一个对应的dtbo插件文件,我们用到哪个屏幕就用对应的设备树插件去覆盖相应的节点。

举例:

        这里参考了同事提供的举例思路,思路是新建一个设备树插件去覆盖掉现有的设备树节点。由于例证的平台用到了身边现有的全志T113平台,看了一圈发现can比较容易验证,所以就采用can来验证。

1、查看设备树节点,可以看到在根节点下有两个can,这与平台上有两个can接口一致。

2、创建设备树插件,用于后面覆盖,这里我们将status设置为“disabled”,如果后面能覆盖成功,那么这两个can节点是肯定不能使用了。

/dts-v1/;
/plugin/;/ {fragment@0 {target-path = "/can@0x0";__overlay__ {/*在此添加要插入的节点*/#address-cells = <1>;#size-cells = <0>;compatible = "allwinner,sun8i-can";device_type = "can0";id = <0>;status = "disabled";  //改为disabled};};fragment@1 {target-path = "/can@0x1";__overlay__ {/*在此添加要插入的节点*/#address-cells = <1>;#size-cells = <0>;compatible = "allwinner,sun8i-can";device_type = "can1";id = <1>;status = "disabled";  //改为disabled};};};

3、编译设备树插件,使用命令编译后就会生成设备树插件,生成dtb文件。

                             

4、编译得到dtb文件后,我们需要想办法去覆盖掉原来的节点,也就是让使用这个dtb文件,这里借助同事提供的方法采用手动操作内存里的文件去实现。先将这个编译出来的文件放到boot-resource分区去,以便我们操作。

操作之前先查看正常状态:

5、先设置工作设备树地址:
通过uboot启动信息,可以获取到内核设备树地址,0x44831e58就是内核设备树地址,0x44851e58是uboot设备树地址,我们需要内核设备树地址。

image.png

fdt addr 0x44831e58  //设置工作设备树

fdt命令参考文章:uboot 命令行使用 fdt 命令查看设备树信息,并得到完整的设备树的 dts 和 dtb 文件_uboot fdt命令-CSDN博客

6、加载设备树插件到内存中(每个平台不一样,根据实际操作)

fatload mmc 2:1 0x43000000 kernel-overlay-can.dtb  //从emmc的
boot-resource分区的 0x43000000地址加载kernel-overlay-can.dtb到内存
fdt resize 8192  //调整设备树的大小

7、设备树覆盖:将内存0x43000000处的设备树插件覆盖到工作设备树

fdt apply 0x43000000

8、进入系统

9、验证:可以看到已经找不到节点了

相关文章:

  • 3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化
  • GIGE 协议摘录 —— GVSP 协议(三)
  • Web前端ES6-ES13笔记合集(下)
  • 【ARFoundation自学05】人脸追踪(AR Face manager)实现
  • 力扣1146.快照数组
  • Stable Diffusion详解
  • 添加L1/L2损失函数,以及AttributeError: ‘NoneType‘ object has no attribute ‘data‘
  • 【C++】基础复习 运算符|算数、关系、逻辑、赋值、位运算符
  • MMSegmentation改进:增加Kappa系数评价指数
  • 学习机火拼大模型:科大讯飞、学而思、网易有道赌上半条身家性命
  • 【C++——引用】
  • semaphore | 使用web界面的ansible来批量运维 linux、windows主机
  • Python pickle反序列化
  • 281 基于matlab的路径规划GUI交互
  • json.load报错AttributeError: ‘str‘ object has no attribute ‘load‘
  • 【Leetcode】104. 二叉树的最大深度
  • 【mysql】环境安装、服务启动、密码设置
  • 30天自制操作系统-2
  • css选择器
  • Mocha测试初探
  • PermissionScope Swift4 兼容问题
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • underscore源码剖析之整体架构
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 基于HAProxy的高性能缓存服务器nuster
  • 技术胖1-4季视频复习— (看视频笔记)
  • 检测对象或数组
  • 日剧·日综资源集合(建议收藏)
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 学习HTTP相关知识笔记
  • 正则表达式小结
  • 仓管云——企业云erp功能有哪些?
  • #pragma once
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)无线电失控保护(二)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ZT)一个美国文科博士的YardLife
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net8.0与halcon编程环境构建
  • .NET单元测试
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • ::什么意思
  • @JsonSerialize注解的使用
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @PostConstruct 注解的方法用于资源的初始化
  • @RequestMapping用法详解
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [BZOJ1008][HNOI2008]越狱
  • [cb]UIGrid+UIStretch的自适应