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

设备树的理解与运用

设备树:
本质是一个文件,包含很多节点,每个节点里边是对设备属性的描述(包括GPIO,时钟,中断等等),其中节点(node)和属性(property)就是设备树最重要的两个概念。
路径一般在arch/arm/boot/dts、


工作流程:设备树dts文件被编译成dtb二进制文件,在boot loader运行时传递给操作系统。

为什么要整个设备树的概念?

传统的平台总线设备通过platform_device这一个结构体来描述,每个platform_device描述一个特定的外设,通过注册到平台总线上以保证内核和设备之间能通讯。然而,随着时间推移,外设越来越多,导致LinuxARM部分的设备配置代码杂乱重复,造成工作和维护难度加大。
于是设备树孕育而生,它提供了一种统一的硬件描述方式,相较之前的 platform_device更加灵活,轻便。
关键术语解读: DTSDTSIDTB 和 DTC

DTS:设备树源文件,可由我们直接编写,包含设备的结构,属性和连接关系。

DTSI:包含在DTS文件下,主要是用于定义一些可重用的部分,可以被多个DTS文件共享,提高可重用性。

DTB:DTS和DTSI文件编译得到的二进制文件。可被操作系统解析,在系统运行过程被灵活调用。

DTC:设备树的编译器,把DTS和DTSI文件编译成DTB文件的工具。

设备树编译

dtc -I dts -O dtb -o output.dtb input.dts
其中, `input.dts` 是输入的设备树源文件, `output.dtb` 是编译后的二进制设备树文件。

编译前确保在scripts/dtc/路径下有dtc编译器

如果没有生成相应的 dtc 可执行文件, 可以查看在内核默认配置文件中 CONFIG_DTC 是否使能

设备树反编译

dtc -I dtb -O dts -o output.dts input.dtb
input.dtb 是输入的二进制设备树文件, output.dts 是反编译后的设备树源文件。

设备树基本语法

1-根节点(Root Node)

整个设备的起点一般以/开始,后面加花括号

2-子节点

根字节的子项,用于表示具体设备,以下时子节点的数据格式。

1 )节点标签( Label)(可选):用于在设备树中引用该节点,其他节点也可引用。
2 )节点名称( Node Name ):字符串,通常是设备的名字,唯一!
3 )单元地址( Unit Address)(可选):是区分相同类型的设备的不同实例
4 )属性定义(Properties Definitions):是一组键值对,用于描述设备的配置和特性, 例如寄存器地址、中断号、时钟频率等
  (5)   子节点(Child Nodes):是当前节点的子项,进一步描述硬件设备的子组件或配置

3-reg属性

用于指定设备的寄存器地址和大小,提供设备树设备之间的寄存器映射关系。
(1 )单个值格式:
reg = <address size>;
适用于描述单个寄存器的情况,address 是设备的起始寄存器地址,可以是一个整数或十六进制值。size 表示寄存器的大小,即占用的字节数
2 )列表值格式如下所示:
reg = <address1 size1 address2 size2 ...>;
描述多个寄存器区域的地址和大小

4-address-cells 和 size-cells 属性

分别用于指定设备树中地址单元和大小单位的位数
#address-cells 属性它指定了设备树中地址单元的位数。地址单元是设备树中用于表示设备地址的单个单位。解释设备地址时应该使用多少位来表示 一个地址单元
默认情况下,#address-cells 的值为 2,例如,对于一个使用两个 32 位(4 字节)整数表示地址的设备,可以在设备树的根节点 中设置 #address-cells 属性为 <2>

#size-cells 属性指定了设备树中大小单元的位数
默认情况下, #size-cells 的值为 1,表示使用一个单元来表示一个设备的大小。
例如,对于一个使用一个 32 位( 4 字节)整数表示大小的设备,可以在设备树的根节点
中设置 #size-cells 属性为 <1>
示例:
node1 {
#address-cells = <1>;
#size-cells = <1>;
node1-child {
reg = <0x02200000 0x4000>;
// 其他属性和子节点的定义
};
};
#address-cells 的值为 <1> ,表示使用一个单元来表示地址,即2个字节。 #size-cells 的值也为 <1> ,表示 使用一个单元来表示大小。
该设备的地址是:0x02200000 地址的大小是:0x4000
node1 {
#address-cells = <2>;
#size-cells = <0>;
node1-child {
reg = <0x0000 0x0001>;
// 其他属性和子节点的定义
};
};

#address-cells = <2>表示用两个单位表示地址,#size-cells = <0>表示不用单元表示大小

地址部分: 0x0000 0x0001 被解释为两个地址单元,其中第一个地址单元为 0x0000 ,第二
个地址单元为 0x0001

5- model 属性

描述设备的型号或者名称,通常用于标识和区分不同的设备
my_device {
compatible = "vendor,device";
model = "My Device XYZ";
// 其他属性和子节点的定义
};
设备的型号或名称为 "My Device XYZ"

6-status 属性

描述设备或节点的状态
"okay":表示设备或节点正常工作,可用。
"disabled":表示设备或节点被禁用,不可用。
"reserved":表示设备或节点已被保留,暂时不可用。
"fail":表示设备或节点初始化或操作失败,不可用。
设备树可以动态地控制设备的启用和禁用状态。这对于在系统启动 过程中选择性地启用或禁用设备

7-compatible 属性

描述设备的兼容性信息,用于识别设备节点与驱动程序之间的匹配关系。
1 )单个字符串值:例如 "vendor,device",指定设备节点与特定厂商的特定设备兼容
(2)字符串列表:例如 ["vendor,device1", "vendor,device2"],指定设备节点与多个厂商设备兼容
3 )通配符匹配:例如 "vendor,*" ,用于指定设备节点与特定厂商的所有设备兼容。
my_device {
compatible = "vendor,device";
// 其他属性和子节点的定义
};
my_device 节点具有 compatible 属性,其值为 "vendor,device" 。这个值用于标识设备节点与特定厂商的特定设备兼容。
当设备树被 操作系统或设备管理软件解析时,会根据设备节点的 compatible 属性值来选择适合的驱动程序 进行设备的初始化和配置。

8-aliases 节点

用于定义设备别名,该节点位于设备树的根部,并具有节点路径 /aliases。
aliases {
mmc0 = &sdmmc0;
mmc1 = &sdmmc1;
mmc2 = &sdhci;
serial0 = "/simple@fe000000/seria1@11c500";
};
1 mmc0 别名与设备树中的 sdmmc0 节点相关联。通过使用别名 mmc0 ,其他设备节点
或客户端程序可以更方便地引用 sdmmc0 节点,而不必直接使用其完整路径。
2 mmc1 别名与设备树中的 sdmmc1 节点相关联。通过使用别名 mmc1 ,其他设备节点
或客户端程序可以更方便地引用 sdmmc1 节点,而不必直接使用其完整路径。
        ......
4 serial0 别名与设备树中的路径 /simple@fe000000/seria1@11c500 相关联。通过使用
别名 serial0 ,其他设备节点或客户端程序可以更方便地引用该路径,而不必记住整个路径字符
串。
其中,& 符号用于引用设备树中的节点。
需要注意的是, aliases 节点中定义的别名只在设备树内部可见,不能在设备树之外引用。

9-chosen 节点

传递和存储系统引导和配置的相关信息。它位于设备树的根部,并具有路径/chosen
1 bootargs:用于存储引导内核时传递的命令行参数。在引导过程中,操作系统或引导加载程序可以读取该属性来获取启动参数。
2 stdout-path:用于指定用于标准输出的设备路径。在引导过程中,操作系统可以使用该属性来确定将控制台输出发送到哪个设备,例如串口或显示屏。
3 firmware-name :用于指定系统固件的名称。它可以用于标识所使用的引导加载程序或固件的类型和版本。
4 linux,initrd-start linux,initrd-end :这些属性用于指定 Linux 内核初始化 RAM 磁盘(initrd )的起始地址和结束地址。
5 )其他自定义属性: chosen 节点还可以包含其他自定义属性,用于存储特定于系统引
导和配置的信息。这些属性的具体含义和用法取决于设备树的使用和上下文。
chosen {
bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
};
chosen 节 点 具 有 一 个 属 性 bootargs , 其 值 为 "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200"。
通过这些命令行参数,操作系统或引导加载程序可以配置内核在引导过程中正确地加载 NFS 根文件系统,并将控制台输出发送到指定的串口设备。

10-device_type 节点

描述设备类型的节点,有助于操作系统或其他软件识别和处理设备
常见的设备类型包括但不限于:
1 cpu :表示中央处理器。
2 memory :表示内存设备。
3 display :表示显示设备,如液晶显示屏。
4 serial :表示串行通信设备,如串口。
5 ethernet :表示以太网设备。
6 usb :表示通用串行总线设备。
7 i2c :表示使用 I2C (Inter-Integrated Circuit) 总线通信的设备。
8 spi :表示使用 SPI (Serial Peripheral Interface) 总线通信的设备。
9 gpio :表示通用输入 / 输出设备。
10 pwm :表示脉宽调制设备。

相关文章:

设备树的理解与运用

设备树&#xff1a; 本质是一个文件&#xff0c;包含很多节点&#xff0c;每个节点里边是对设备属性的描述&#xff08;包括GPIO&#xff0c;时钟&#xff0c;中断等等&#xff09;,其中节点&#xff08;node&#xff09;和属性&#xff08;property&#xff09;就是设备树最重…...

【AIGC】提示词 Prompt 分享

提示词工程是什么&#xff1f; Prompt engineering&#xff08;提示词工程&#xff09;是指在使用语言模型进行生成性任务时&#xff0c;设计和调整输入提示&#xff08;prompts&#xff09;以改善模型生成结果的过程。它是一种优化技术&#xff0c;旨在引导模型产生更加准确、…...

【Axure视频教程】取整函数

今天教大家在Axure里如何使用三种不同的取整函数&#xff0c;包括向上取整、向下取整和四舍五入取整。具体效果可以参考下方视频。该教程从0开始制作&#xff0c;手把手教学&#xff0c;无论是新手小白还是有一定基础的同学&#xff0c;都可以学习的哦。 【视频教程——试看版…...

MySQL清空表

当我们需要清空一个表中的所有行时&#xff0c;除了使用 DELETE * FROM table 还可以使用 TRUNCATE TABLE 语句。 如果想要清空一个表&#xff0c; TRUNCATE TABLE 语句比 DELETE语句更加有效。 TRUNCATE TABLE 语法 TRUNCATE TABLE 的语法很简单&#xff0c;如下&#xff1a…...

使用IDEA创建Vue3通过Vite实现工程化

1、创建Vite项目的分步说明 IntelliJ IDEA与Vite构建工具集成&#xff0c;改善了前端开发体验。Vite 由一个开发服务器和一个构建命令组成。构建服务器通过本机 ES 模块提供源文件。生成命令将代码与汇总捆绑在一起&#xff0c;汇总预配置为输出高度优化的静态资产以供生产。In…...

GitLab使用的最简便方式

GitLab介绍 GitLab是一个基于Git版本控制系统的开源平台&#xff0c;用于代码托管&#xff0c;持续集成&#xff0c;以及协作开发。它提供了一套完整的工具&#xff0c;以帮助开发团队协同工作、管理和部署代码。 往往在企业内部使用gitlab管理代码&#xff0c;记录一下将本地代…...

MySQL数据库20G数据迁移至其他服务器的MySQL库或者云MySQL库

背景&#xff1a;20G的MySQL数据迁移至火山云MySQL库&#xff0c;使用navicat的数据传输工具迁移速度耗费时间过长。 方案一&#xff1a;使用火山云提供的MySQL数据迁移服务&#xff08;其他大厂应该提供的也有&#xff09; 方案二&#xff1a;使用数据迁移工具kettle&#x…...

build.gradle配置文件详解

Andorid Studio高版本和低版本的build.gradle配置逻辑有些差异 安卓项目中相关编译文件的介绍 gradle-wrapper.properites&#xff1a;配置Gradle Wrapper gradle.properties&#xff1a;配置Gradle的编译参数。具体配置见Gradle官方文档:com.android.build.gradle | Andro…...

2024拼多多校招面试真题汇总及其解答(二)

6. 【算法题】归并排序 归并排序(Merge Sort)是一种分治算法,它将待排序的序列递归地分成两个子序列,然后将两个有序的子序列合并成一个有序的序列。 归并排序的算法流程如下: 递归地将待排序的序列分成两个子序列,直到每个子序列只有一个元素。将两个有序的子序列合并…...

自动化运维工具Ansible教程(一)【入门篇】

文章目录 前言Ansible 入门到精通入门篇进阶篇精通篇入门篇1. Ansible 简介2. 安装 Ansible1. 通过包管理器安装&#xff1a;2. 通过源码安装&#xff1a; 3. Ansible 的基本概念和核心组件4. 编写和运行第一个 Ansible Playbook5. 主机清单和组织结构主机清单组织结构 6. Ansi…...

计算机毕业设计 微信小程序 uniapp+vue大学生兼职平台

任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;本系统前台采用微信开发者结合后台Java语言设计并实现了…...

JavaScript框架:构建交互性、现代化Web应用的利器

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 JavaScript框架已…...

数据结构——二分查找法

二分查找法&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;通常用于在已排序的数组或列表中查找特定的目标值。这个算法的基本思想是不断将查找范围缩小为原来的一半&#xff0c;直到找到目标值或确定目标值不存在。 二分查找是一种在每次比较之后将查…...

服务端渲染(SSR):提升Web应用性能和用户体验的关键技术

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 服务端渲染&#…...

如何工作和生活相平衡?

之前待过一家外企&#xff0c;他们的口号是 Balancing work and life&#xff0c;工作和生活相平衡。辗转几家公司之后&#xff0c;发现这个越来越难了&#xff0c;越来越少的时间投入家庭和自己的生活。 人生的意义 &#xff08;AI&#xff09; 人生的意义是一个深奥而复杂的…...

semaphere部署,配置ldap

在处理 Ansible 相关项目时&#xff0c;我们经常面临繁琐的命令行操作&#xff0c;这对于不熟悉命令行的用户来说可能是一个挑战。此外&#xff0c;当项目规模扩大时&#xff0c;跟踪和管理多个 playbook 变得困难&#xff0c;同时缺乏对失败的及时通知和访问控制。这些问题催生…...

Java 泛型 T,E,K,V,?

泛型带来的好处 在没有泛型的情况的下&#xff0c;通过对类型 Object 的引用来实现参数的“任意化”&#xff0c;“任意化”带来的缺点是要做显式的强制类型转换&#xff0c;而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况&#xf…...

软件测试技术之地图导航的测试用例

外观测试 屏幕显示不能有花屏、黑点和闪屏&#xff0c;清晰度、亮度、颜色要正常。 检测所有按键都能起到相应作用&#xff0c;是否手感不良。 UI显示状态、颜色、清晰度、效果。 控制&#xff1a;放大&#xff0c;缩小&#xff0c;音量调节功能测试。 交叉路口查询测试&am…...

【C++】常用集合算法

0.前言 1.set_intersection #include <iostream> using namespace std;// 常用集合算法 交集set_intersection #include<vector> #include<algorithm>void myPrint(int val) {cout << val << " "; }void test01() {vector<int>v…...

css flex:1;详解,配合demo效果解答

前言 给设置了display&#xff1a;flex的子组件设置了flex&#xff1a;1&#xff1b;就能让他填满整个容器&#xff0c;如果有多个就平均 flex&#xff1a;1&#xff1b;是另外三个样式属性的简写&#xff0c;等同 flex-grow: 0; flex-shrink: 1; flex-basis: auto;我们就针…...

discuzQ安装

我们开始配置php,安装两个扩展。 在宝塔面板中&#xff0c;单击软件商城->已安装&#xff0c;查找已安装的 PHP 软件。 然后在 php 管理中&#xff0c;单击禁用函数&#xff0c;进入设置页面。 在列表中单击删除函数 putenv、readlink、symlink、shell_exec &#xff0c;…...

深入解析NLP情感分析技术:从篇章到属性

目录 1. 情感分析概述1.1 什么是情感分析&#xff1f;- 情感分析的定义- 情感分析的应用领域 1.2 为什么情感分析如此重要&#xff1f;- 企业和研究的应用- 社交媒体和公共意见的影响 2. 篇章级情感分析2.1 技术概览- 文本分类的基本概念- 机器学习与深度学习方法- 词嵌入的力量…...

JVM的双亲委派模型

定义与本质&#xff1a; 类加载器用来把类文件加载到JVM内存中。从JDK1.2开始&#xff0c;类加载过程采用双亲委派模型&#xff0c;保证Java平台安全。 父类委托的定义&#xff1a; 一个类加载器在接到加载类请求的时候&#xff0c;首先不会去加载这个类&#xff0c;而是把这个…...

js中如何判断一个变量是否为数字类型?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐使用Number.isNaN()方法⭐使用正则表达式⭐使用isNaN()函数⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…...

使用阿里PAI DSW部署Stable Diffusion WebUI

进入到网址https://pai.console.aliyun.com/里边。 点击创建实例。 把实例名称填写好&#xff0c;选择GPU规格&#xff0c;然后选择实例名称是ecs.gn6v-c8g1.2xlarge。 选择stable-diffusion-webui-env:pytorch1.13-gpu-py310-cu117-ubuntu22.04&#xff0c;然后点击下一步。…...

redisson使用过程常见问题汇总

文章目录 常见报错1. 配置方式使用错误2. 版本差异报错3. 配置文件中配置了密码或者配置错误4. 字符集和序列化方式配置问题5. Redisson的序列化问题6. 连接池问题&#xff1a;7. Redisson的高可用性问题&#xff1a;8. Redisson的并发问题9. Redisson的性能问题 2. 参考文档 常…...

代码随想录训练营 DP序列

代码随想录训练营 DP序列 718. 最长重复子数组&#x1f338;code 674. 最长连续递增序列&#x1f338;code 300.最长递增子序列&#x1f338;code 最后一题很巧妙&#xff0c;不能单纯的去把DP当作板子题&#xff0c;得思考才能得到最佳方式 718. 最长重复子数组&#x1f338; …...

Datastage部署与使用

Datastage部署与使用 - 码农教程 https://www.cnblogs.com/lanston/category/739553.html Streamsets定时拉取接口数据同步到HBase集群_streamsets api_webmote的博客-CSDN博客 【SDC】StreamSets实战之路-28-实战篇- 使用StreamSets实时采集指定数据目录文件并写入库Kudu_菜…...

【实用工具】Centos 安装ARL灯塔

文章目录 docker 安装安装docker-compose配置镜像加速器ARL安装和启动 docker 安装 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm yum install docker-ce (若出现无法找到包可能是镜像源问题) 更…...

IP地址定位基础数据采集

在互联网时代&#xff0c;IP地址定位技术已经成为了广泛应用的一项重要技术。无论是用于网络安全、广告投放、市场调研还是用户体验优化&#xff0c;IP地址定位技术都发挥着关键作用。 什么是IP地址定位&#xff1f; IP地址定位是一种技术&#xff0c;它通过IP地址来确定设备…...

wordpress网站搭建/百度域名注册查询

1详细二进制 &#xff08;主要是用于基本i/o流&#xff09; #二进制&#xff1a; 1、计算机内部都是2进制 2、数组和ArrayList的区别&#xff1a;ArrayLlsit里面有算法&#xff08;通用算法&#xff0c;只有当通用算法不行的时候&#xff0c;可以自己写专门算法&#xff09…...

长沙做网站建设公司哪家好/美国搜索引擎

依赖关系&#xff0c;可以理解成“USE-A”关系即使用关系。 依赖关系是一种使用关系&#xff0c;如果A类中的某个方法使用了B类对象&#xff0c;那么就可以说A类依赖B类。 class A{ public void f(B b){} } class B{} A类方法的形式参数是B类类型。也就是说A类对象如果要使用方…...

老外做中文网站/软件开发

绘制普通直线,先看效果图: 实现代码如下: <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title><script>function drawGraph(id){var canvasdocument.getElementById(id);var contextc…...

服装鞋帽 网站建设/霸屏seo服务

公司有一款产品是基于SNMP进行管理的。所以自己也就摸索着&#xff0c;学习点有关这方面的知识。 有关SnmpTrap的理论知识我就不做介绍了。你可以去百度中找到很多很多有关这方面的介绍。说一下自我对这方面的理解&#xff1a;snmp trap162其实就相当于服务器端&#xff0c;主要…...

钱网站制作/怎么开发一款app软件

前言 恍然间&#xff0c;发现自己在这个行业里已经摸爬滚打了十年了&#xff0c;思绪良多&#xff0c;感慨万千&#xff0c;我的事就不多说了 直接开门见山吧&#xff01;今天这篇文章主要是给程序员的几个忠告。很多刚刚入行的程序员一入职就开始埋头写程序&#xff0c;敲代…...

太原做网站直通车/淘宝关键词搜索排行榜

正文&#xff1a; 刚体能让你的游戏对象被物理引擎所控制&#xff0c;它能通过受到推力和扭力来实现真实的物理表现效果。所有游戏对象必须包含刚体组件来实现重力、通过脚本施加力、或者与其他对象进行交互&#xff0c;这一切都通过NVIDIA的PhysX物理引擎来实现。 属性 Mas…...