RK3568驱动指南|第六篇-平台总线-第55章 初识设备树

news2024/12/25 2:31:51

瑞芯微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是设备树开发中一个重要的工具。

DTSDTSIDTBDTC之间的关系:

(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内容相同。


 

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

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

相关文章

封装一个滑块控制灯光组件

效果如下gif 只进行了基础的事件和布局,可优化的地方:luminance-box这个div加上后,由于和slider-run-way都是absolute定位,导致slider-run-way的点击事件无法设置值,只能通过滑块设置。暂时想不到咋处理,有…

淘宝代购系统需要电商API接口

在推广一篇淘宝代购系统时,了解电商API接口的重要性是很有必要的。电商API接口可以提供更高效、准确的数据传输和信息交流,从而实现更智能化的购物体验。下面我们将简单介绍电商API接口在推广淘宝代购系统中的应用。 一、数据交互与集成 电商API接口可…

视频SDK,高效视频解决方案

随着企业业务的不断扩展和多样化,视频已成为企业宣传、教育和娱乐等多个领域不可或缺的内容。为了满足企业对视频的需求,美摄视频SDK开发应运而生,为企业提供全面、高效、安全和便捷的视频解决方案。 美摄视频SDK开发公司拥有丰富的经验和卓…

C++14 新特性

C14 新特性 C14 新特性变量模板通用lambda表达式常量表达式二进制字面量数组大小自动推导make_uniqueexchangeinteger_sequenceconstexpr函数的扩展变长参数模板的扩展 C14 新特性 C14 is a minor but important upgrade over C11, and largely “completes C11.” 变量模板 …

找免费音效素材,就上这6个网站,无版权可商用

很多视频剪辑或从事自媒体工作的朋友都不知道去哪里找免费的音效素材,很多网站需要付费或会员才能下载,还不能商业用途。如何找到即免费还能商用的音效素材? 本期就把我收藏多年的6个免费可商用的音效素材网站分享给大家,以后就不…

快速了解服务器单CPU与双CPU

​  在当今快节奏的技术环境中,用户们对功能强大且高效的服务器配置需求不断增长。CPU作为构成任何计算基础设施的骨干,服务器的“大脑”,负责执行计算、控制数据流并协调各个组件之间的任务,是服务器选择硬件中的重要一环。因此…

CSS 之 display属性详解

一、总览 ​ CSS的 display 属性用于设置元素的显示类型,或设置其子元素的布局类型。 display属性值的适用性取决于元素的类型和上下文。某些属性值只适用于特定类型的元素,使用时需注意兼容性和语义化。 ​ 其属性值共计有18种,按照类别可…

CentOS7安装Redis集群

本章是基于CentOS7下的Redis集群 1.单机安装Redis2.Redis主从集群2.1.集群结构2.2.准备实例和配置2.3.启动2.4.开启主从关系2.5.测试 3.搭建哨兵集群3.1.集群结构3.2.准备实例和配置3.3.启动3.4.测试 4.搭建分片集群4.1.集群结构4.2.准备实例和配置4.3.启动4.4.创建集群4.5.测试…

听听Dreamforce ‘23中Salesforce高管们对产品、功能的见解!

True to the Core是Dreamforce的传统环节,这是向Salesforce高级管理人员提出问题的问答会议。True to the Core旨在将Trailblazer与产品团队联系起来,做出有关产品发展方向的决策。 Dreamforce 23 的True to the Core没有令人失望,提供了关…

代码覆盖率统计Super-jacoco在公司级容器化项目中的具体应用方案

目录 一、介绍 二、自己在本地搭建Super-jacoco服务 2.1 准备工作 2.2 部署super jacoco服务 1、下载super jacoco 项目 2、初始化数据库 3、配置application.properties 4、编译super jacoco项目 5、部署 super jacoco 服务 2.3 启动被测项目 2.4、代码覆盖率收集 2…

(3) OpenCV图像处理kNN近邻算法-识别摄像头数字

目录 一、代码简介 二、程序代码 三、使用的图片资源 1、图片digits.png

为什么价格监测要精确到款式

品牌在进行线上数据的监测时,首先需要对全网数据进行爬取,爬到的数据再做分析,最后再对有效的SKU数据进行监测,所以数据清洗很重要,采集到的基础数据更重要,只有数据采集全面了,才能进行全面的控…

python——loguru第三方日志管理模块

loguru第三方日志管理模块 loguru介绍日志等级日志保存日志过滤处理异常 loguru介绍 loguru是第三方库,拿来即用,不用太多的配置 安装:pip install loguru 日志等级 from loguru import loggerlogger.debug(这是一条调试消息!)…

E054-web安全应用-Brute force暴力破解进阶

课程名称: E054-web安全应用-Brute force暴力破解进阶 课程分类: web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请,对该公司旗下的网站进行安全检测,经过一番检查发现该网站可能存在弱口令漏洞…

【Java笔试强训】Day1(100449-组队竞赛 、OR63 删除公共字符)

100449-组队竞赛 链接:组队竞赛 题目: 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个…

修改ruoyi框架前端刷新页面时紫色的背景颜色

问题描述 最近在使用ruoyi的前后端分离框架,发现前端VUE页面刷新的时候,会出现加载的紫色页面,想要修改这个颜色,请看下面的教程。 修改教程 找到public/index.html,然后找到background为#7171C6这个颜色的代码&…

Redis 主从复制,哨兵,集群——(2)哨兵篇

目录 1. Redis 哨兵是什么? 2. Redis 哨兵有什么用? 2.1 主动监控 2.2 消息通知 2.3 故障转移 2.4 配置中心 3. Redis 哨兵数量配备要求 4. 哨兵配置文件详解 5. quorum 投票数详解 5.1 quorum 的含义 5.2 网络抖动导致主观下线 5.3 quorum …

Spring framework Day21:Spring AOP 注解结合配置类示例

前言 Spring AOP是一种强大的面向切面编程工具,它能够帮助我们更好地处理与核心业务逻辑无关的横切关注点。通过使用注解和配置类的方式,我们可以更加简洁和灵活地实现AOP。 本文将以一个示例来介绍如何结合注解和配置类来使用Spring AOP。通过这个示例…

解决Antd 二次封装表格的可编辑功能(editable table)不生效的问题

问题概述 使用了Antd Table组件&#xff0c;因为需要自定义的筛选功能&#xff0c;进行了二次封装。 之后加上了可编辑行功能&#xff0c;当点击编辑图标&#xff0c;发现表格并不会有任何变化。 代码&#xff1a; <Formcomponent{false}form{docInfoForm} ><CSTab…

正点原子嵌入式linux驱动开发——设备树下LED驱动

经过对设备树的学习以及驱动开发中常用的OF函数介绍&#xff0c;本篇笔记将之前的新字符设备驱动的LED&#xff0c;换成设备树形式。 设备树LED驱动原理 在之前的新字符设备驱动实验中&#xff0c;直接在驱动文件newchrled.c中定义有关寄存器物理地址&#xff0c;然后使用io_…