RK3568驱动指南|第六篇-平台总线-第55章 初识设备树
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】824412014(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第六篇-平台总线_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
第55章 初识设备树
55.1 设备树的由来
设备树(Device Tree)是一种硬件描述机制,用于在嵌入式系统和操作系统中描述硬件设备的特性、连接关系和配置信息。它提供了一种与平台无关的方式来描述硬件,使得内核与硬件之间的耦合度降低,提高了系统的可移植性和可维护性。
在上一篇平台总线内容的学习中,我们使用platform_device结构体来对硬件设备进行描述,这是一种传统的平台总线设备描述方式。每个platform_device结构表示一个特定的硬件设备,并通过注册到平台总线上来使得内核能够与该设备进行通信和交互。该结构包含设备的名称、资源(如内存地址、中断号等)、设备驱动程序等信息。
然而,随着时间的推移,Linux内核中的ARM部分存在着大量的平台相关配置代码,这些代码通常是杂乱而重复的,导致了维护的困难和工作量的增加。在2011年3月17日,Linux的创始人Linus Torvalds在ARM Linux邮件列表中发表了一封帖子,他表达了对ARM架构配置方式的不满,并宣称"Gaah. Guys, this whole ARM thing is a f*cking pain in the ass"。这引起了广泛的讨论和反思。ARM社区中的开发者们开始认识到,传统的平台相关配置方式已经变得不可持续,需要一种更加先进和可扩展的方法来解决这个问题。
为了应对这一挑战,ARM社区开始探索新的硬件描述机制,并逐渐形成了设备树的概念。设备树提供了一种更加灵活和可移植的描述硬件的机制,将设备的描述信息转移到设备树中。设备树使用一种结构化的数据格式,通过描述设备节点、属性和连接关系等信息,使得硬件的描述与具体的平台无关,同时允许多个平台共享相同的设备树描述。
设备树的引入为ARM架构上的Linux内核带来了革命性的变化。它提供了一种统一的硬件描述方式,使得不同芯片和板级的支持更加简单和灵活。此外,设备树还提供了硬件配置的可视化和可读性,方便开发者理解和调试硬件。
随着时间的推移,设备树逐渐成为了嵌入式系统和Linux内核中描述硬件的标准方式。它不仅在ARM架构上得到了广泛应用,也被扩展到其他架构和平台上。
55.2 设备树基础知识
当描述设备树(Device Tree)时,通常会涉及到以下几个关键术语:DTS、DTSI、DTB和DTC。下面来对每个术语进行介绍。
DTS(Device Tree Source):DTS是设备树的源文件,采用一种类似于文本的语法来描述硬件设备的结构、属性和连接关系。DTS文件以.dts为扩展名,通常由开发人员编写。它是人类可读的形式,用于描述设备树的层次结构和属性信息。
DTSI(Device Tree Source Include):DTSI文件是设备树源文件的包含文件。它扩展了DTS文件的功能,用于定义可重用的设备树片段。DTSI文件以.dtsi为扩展名,可以在多个DTS文件中包含和共享。通过使用DTSI,可以提高设备树的可重用性和可维护性(和C语言中头文件的作用相同)。
DTB(Device Tree Blob):DTB是设备树的二进制表示形式。DTB文件是通过将DTS或DTSI文件编译而成的二进制文件,以.dtb为扩展名。DTB文件包含了设备树的结构、属性和连接信息,被操作系统加载和解析。在运行时,操作系统使用DTB文件来动态识别和管理硬件设备。
DTC(Device Tree Compiler):DTC是设备树的编译器。它是一个命令行工具,用于将DTS和DTSI文件编译成DTB文件。DTC将文本格式的设备树源代码转换为二进制的设备树表示形式,以便操作系统能够加载和解析。DTC是设备树开发中一个重要的工具。
DTS、DTSI、DTB和DTC之间的关系:
(1)开发人员使用文本编辑器编写DTS和DTSI文件,描述硬件设备的层次结构、属性和连接关系。
(2)DTSI文件可以在多个DTS文件中包含和共享,以提高设备树的可重用性和可维护性。
(3)使用DTC编译器,开发人员将DTS和DTSI文件编译成二进制的DTB文件,如下图(图55- 1)所示:
(4)操作系统在启动过程中加载和解析DTB文件,以识别和管理硬件设备。
设备树文件存放路径:
ARM体系结构:
ARM体系结构下的设备树源文件通常存放在arch/arm/boot/dts/目录中。该目录是设备树源文件的根目录。如下图(图55- 2)所示:
图55- 2
ARM64体系结构:
设备树源文件路径:ARM64体系结构下的设备树源文件通常存放在arch/arm64/boot/dts/目录及其子目录中。该目录也是设备树源文件的根目录,并包含了针对不同ARM64平台和设备的子目录,如下图(图55- 3)所示:
图55- 3
子目录结构:在ARM64的子目录中,同样会按照硬件平台、设备类型或制造商进行组织和分类。这些子目录的命名可能与特定芯片厂商(如Qualcomm、NVIDIA、Samsung)有关,由于我们本手册使用的soc是瑞芯微的rk3568,所以匹配的设备树目录为arch/arm64/boot/dts/rockchip。每个子目录中可能包含多个设备树文件,用于描述不同的硬件配置和设备类型,这里以rockchip目录内容如下图(图55- 4)所示:
图55- 4
55.3 设备树的编译
设备树的编译是将设备树源文件(如上述的.dts文件)转换为二进制的设备树表示形式(.dtb文件)的过程。编译器通常被称为DTC(Device Tree Compiler)。
在Linux内核源码中,DTC(Device Tree Compiler)的源代码和相关工具通常存放在scripts/dtc/目录中,如下图(图55- 5)所示:
图55- 5
在编译完源码之后dtc设备树编译器会默认生成,如果没有生成相应的dtc可执行文件,可以查看在内核默认配置文件中CONFIG_DTC是否使能。
设备树的编译:
在Linux环境中,可以使用以下命令将设备树源文件编译为二进制设备树文件:
dtc -I dts -O dtb -o output.dtb input.dts
其中,`input.dts`是输入的设备树源文件,`output.dtb`是编译后的二进制设备树文件。
编译器会验证设备树源文件的语法和语义,生成与硬件描述相对应的设备树表示形式。
设备树的反编译:
设备树的反编译是将二进制设备树文件转换回设备树源文件的过程,以便进行查看、编辑或修改。反编译器通常也是DTC。
在Linux环境中,可以使用以下命令将二进制设备树文件反编译为设备树源文件:
dtc -I dtb -O dts -o output.dts input.dtb
其中,input.dtb是输入的二进制设备树文件,output.dts是反编译后的设备树源文件。
反编译器会将二进制设备树文件解析并还原为文本形式的设备树源文件,使其可读性更好。
下面来进行一下实际的设备树编译和反编译的演示,首先创建一个名为test.dts的设备树文件,文件内容如下所示:
/dts-v1/;
/ {};
创建完成如下图(图55- 6)所示:
图55- 6
这个设备树很简单,只包含了根节点/,而根节点中没有任何子节点或属性。这个示例并没有描述任何具体的硬件设备或连接关系,它只是一个最基本的设备树框架,在本小节只是为了测试设备树的编译和反编译。
然后使用以下命令进行设备树的编译,编译完成如下图(图55- 7)所示:
/home/topeet/Linux/linux_sdk/kernel/scripts/dtc/dtc -I dts -O dtb -o test.dtb test.dts
图55- 7
可以看到test.dtb就生成了,然后继续使用以下命令对test.dtb进行反编译,反编译完成如下图(图55- 8)所示:
图55- 8
可以看到反编译出的1.dts跟之前的test.dts内容相同。
相关文章:

RK3568驱动指南|第六篇-平台总线-第55章 初识设备树
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…...

【ELK 使用指南 1】ELK + Filebeat 分布式日志管理平台部署
ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…...
Springboot高频应用注解
本文旨在记录开发中遇到的SpringBoot高频注解,并针对其具体应用记录。 一、LOMBOK相关注解 Slf4j 目的在于使用Log的日志功能,可以在JAVA中自动生成日志记录器!使用时在类上添加Slf4j注解后即可以在类中调用log方法如 可以 调用 log.info …...

面试总结分享:25道数据库测试题
1)什么是数据库测试? 数据库测试也称为后端测试。数据库测试分为四个不同的类别。数据完整性测试 数据有效性测试 数据库相关的性能 测试功能,程序和触发器 2)在数据库测试中,我们需要正常检查什么? 通常&a…...

和硕首次参加展OCP 峰会,将发布多项AI合作项目产品 | 百能云芯
电子代工大厂和硕联合科技宣布,将参与今年的 OCP 全球峰会 (OCP Global Summit),展示与英伟达 (NVIDIA) 合作成果,包含使用英伟达 GH200 Grace Hopper 超级芯片的 MGX AI 服务器,以及搭载 A100、L40 等服务器产品。 OCP 峰会于 10…...

FPGA基于1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持
目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC1G/2.5G Ethernet PCS/PMA or SGMIIQT上位机和源…...

小程序setData动态传递key
有些时候可能需要根据key是个变量 比如 let keyName "name" this.setData({keyName :"张三" })本来想将keyName替换为name的,但是小程序只会在data中定义一个key为keyName ,value为“张三”的一条数据。 正确写法为: let keyNam…...
boost Geometry
boost::Geometry boost作为C中最常用的第三方库,Geometry库里面拥有大量的开源算法。 函数作用get获取几何图形(通常为点)的坐标值get (with index)获取框或段的坐标值set设置几何图形(通常为点)的坐标值set (with i…...

凉鞋的 Unity 笔记 201. 第三轮循环:引入变量
201. 第三轮循环:引入变量 在这一篇,我们进行第三轮 编辑-测试 循环。 在之前我们编写了 输出 Hello Unity 的脚本,如下: using System.Collections; using System.Collections.Generic; using UnityEngine;public class FirstGameObject …...

小魔推短视频裂变工具,如何帮助实体行业降本增效?
在如今的互联网时代,大多数的实体老板都在寻找不同的宣传方法来吸引客户,现在短视频平台已经成为重中之重的获客渠道之一,而如何在这个日活用户超7亿的平台获取客户,让更多人知道自己的门店、自己的品牌,泽成为了不少老…...

VBA技术资料MF71:查找所有空格并替换为固定字符
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...

c++小知识
内联函数 inline 用来替换宏函数 不能分文件编辑 在c语言中#define NULL 0在c中使用nullptr表示空指针class内存的大小计算规则使用的是内存对齐 没有成员,但是还有1个字节,我们使用这个来标记他是个类 类成员函数不存在于类中 为什么每个对象使用的…...

C#上位机序列9: 批量读写+事件广播
1. 读取配置文件及创建变量信息(点位名称,地址,数据类型(bool/short/int/float/long/double)) 2. 读任务&写任务,数据有变化时事件广播通知 using HslCommunication; using HslCommunication.Core; usi…...

ARM +FPGA GPIB IP核实现
目前在数据发生其技术上居领先的是美国的 Tektronix 公司和 Agilent 公司。 Agilent 公司的台式脉冲 / 数据发生器家族的最高时钟频率达 3GHz (定 时发生器),数据发生器 E81200 在通道数为 8CH 时数据速率为 660Mb/s, 即可以产…...

有消息称苹果Vision Pro会有廉价版
据外媒爆料,苹果公司苹果正在研发的头显产品Vision Pro,将会有廉价版。据透露,这款产品预计售价在1500美元至2500美元之间,虽然仍不算低,但较现有的Vision Pro 3499美元的起售价,还是有明显降低。 透露廉价…...

jenkins整合gerrit
背景 公司项目之前使用jenkins整合了gitlab,后面代码迁移到gerrit,所以需要修改jenkins配置。下面就简单的介绍一下jenkins如何整合gerrit。 环境 服务器:linux 环境:docker、jenkins 代码仓库:gerrit 前提 docke…...

PMP考完后应该考什么?
PMP(项目管理专业)认证是全球范围内最受认可和尊重的项目管理资格证书之一。通过PMP考试的人已经展示了他们在项目管理领域的知识和技能。然而,项目管理是一个不断发展和变化的领域,持续学习和进一步提升自己的能力是非常重要的。…...

科技资讯|苹果Vision Pro可通过手势ID检测不同用户
近日,美国专利局公布了苹果公司的一项专利申请,该专利申请涉及基于手部特征验证用户身份的技术。苹果指出,可能是多个家庭成员都想使用 Apple Vision Pro,系统必须识别不同的手势以控制 visionOS。在另一个示例中,苹果…...
CUDA编程模型- 层次结构
层次结构的划分 在GPU上,为了满足其大规模并行处理的特性,执行模型采用了大量并行化的轻量级线程。当我们谈到CUDA编程模型时,我们首先要考虑的是其线程执行层次结构。这种层次结构起始于一个被称为kernel的函数,当它在GPU上执行…...
国际站阿里云服务器无法安装程序怎么办?
阿里云服务器是阿里云推出的一种云核算产品,它能够帮助企业和个人快速建立、扩展和管理网络服务。可是,有时候在运用阿里云服务器时,或许会遇到无法装置程序的问题。本文将具体介绍如何处理这个问题。 阿里云服务器无法装置程序或许是由多种原…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...