设备树的理解与运用

news2024/11/14 16:40:33

设备树:
本质是一个文件,包含很多节点,每个节点里边是对设备属性的描述(包括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 :表示脉宽调制设备。

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

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

相关文章

mysql数据库数据如何迁移目录

目录 1.关闭正在运行mysql2.找到本机my.ini 文件3.观察目录结构4.复制注意是复制Data文件夹到目的地5.找到my.ini初始位置修改数据路径并保存6.启动mysql7.关注my.ini 常用配置 1.关闭正在运行mysql 2.找到本机my.ini 文件 默认位置 C:\ProgramData\MySQL\MySQL Server 8.0 …

如果你是独立开发者,你是先写前端还是先写后端?

当我们站在独立开发的路口时&#xff0c;一个重要的抉择就摆在了我们面前&#xff1a;是先着手前端开发还是后端开发&#xff1f;这看似简单的问题&#xff0c;却蕴含着许多深刻的考虑和决策。无论你是准备构建一个复杂的分布式系统还是一个引人入胜的用户界面&#xff0c;接下…

LeetCode每日一题:1462. 课程表 IV(2023.9.12 C++)

目录 1462. 课程表 IV 题目描述&#xff1a; 实现代码与解析&#xff1a; 拓扑排序 原理思路&#xff1a; 1462. 课程表 IV 题目描述&#xff1a; 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff…

分布式文件系统对比与选型参考

目录 一、分布式文件系统 1、 数据的存储方式&#xff1a; 2、 数据的读取速率 3、 数据的安全机制 二、主流分布式文件系统介绍 1. GFS&#xff08;Google File System&#xff09; 2. HDFS&#xff08;Hadoop Distributed File System&#xff09; 3. Ceph …

java在mysql中查询内容无法塞入实体类中,报错 all elements are null

目录 一、问题描述二、解决方案 一、问题描述 java项目中整体配置了mysql的驼峰式字段匹配规则。 mybatis.configuration.map-underscore-to-camel-casetrue由于项目需求&#xff0c;需要返回字段为file_id&#xff0c;file_url&#xff0c;并且放入实体类中&#xff0c;实体…

对话大模型中的情感支持及商业化落地

在1982年经典科幻电影《银翼杀手》中&#xff0c;仿生人瑞秋因为被植入记忆而以为自己是真人&#xff0c;当被告知自己是仿生人时&#xff0c;她拒绝相信&#xff0c;流下了眼泪。如今&#xff0c;随着AI领域对话大模型技术的发展&#xff0c;“比人更像真人”的人工智能正从梦…

vue实现左右伸缩(el-drawer自定义位置展开收缩)

内容左右收缩展开 实现需求实现效果自定义抽屉(el-drawer)展开位置实现原理 js方法&#xff0c;点击的时候抽屉伸缩展开&#xff0c;并且给左侧右侧内容对应的宽度第二种方法 实现需求 页面内容是左右布局&#xff0c;需求想让左侧内容可收缩&#xff0c;然后展示完全右侧内容。…

模拟经营类游戏是怎么开发的?

模拟经营类游戏开发是一个充满挑战但也充满乐趣的领域。下面是一些步骤和关键考虑因素&#xff0c;可以帮助您开始开发自己的模拟经营游戏&#xff1a; 明确游戏概念&#xff1a; 确定游戏开发的主题和类型&#xff0c;例如城市建设、农场经营、餐厅经营等。 制定一个引人入胜…

《论文阅读》通过动态融入常识知识来提高同理心对话的生成

《论文阅读》通过动态融入常识知识来提高同理心对话的生成 前言简介模型架构Contextual ProbingContextual Unification Workspace代码实现Knowledge-Aware Decoder实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到…

文件路径中的/,\的区别和文件路径的常见用法

/是Unix和类Unix系统上的路径分隔符.现代Windows通常可以同时使用\和/交换文件路径,但微软\几十年来一直主张使用路径分隔符. 关于文件路径的常用方法再学习一下&#xff1a; "./"&#xff1a;代表目前所在的目录 "../"&#xff1a;代表上一层目录 以&q…

如何在Blender中压缩/减小GLTF模型的大小

GLTF 如何在Blender中压缩/减小GLTF模型的大小 Blender是一款功能强大的开源软件&#xff0c;旨在创建3D图形&#xff0c;动画和视觉效果。它支持多种文件格式的导入和导出&#xff0c;包括GLB&#xff0c;GLTF&#xff0c;DAE&#xff0c;OBJ&#xff0c;ABC&#xff0c;USD…

CAD批量转换低版本怎么转?教你一看就会的转换方法

CAD文件需要转换版本是因为不同版本的CAD软件可能不兼容。这意味着&#xff0c;如果在一个版本的CAD软件中创建了一个文件&#xff0c;可能无法在另一个版本的CAD软件中打开它。这可能会导致数据丢失或格式错误。 为了避免这种情况&#xff0c;需要将CAD文件转换为适当的版本以…

短视频seo矩阵系统源码开发与部署全解析

在这个数字化快速发展的时代&#xff0c;短视频已经成为人们获取娱乐&#xff0c;学习&#xff0c;商业信息的主要途径之一。对于企业来说&#xff0c;利用短视频矩阵进行高效且精准的营销推广&#xff0c;无疑是一个重要的战略方向。本文将详细介绍如何进行短视频矩阵源码的开…

【开源】无忧企业文档文库管理界面介绍

无忧企业文档是软开企服研发的一款集知识库、网盘、在线协同为一体的企业级办公软件&#xff0c;有完全免费的开源版&#xff0c;也有功能丰富的商业版。开源版在社区开放了全量源码&#xff0c;商业版支持提供源码&#xff0c;支持二次开发&#xff0c;适合中小企业使用。 文…

企业如何简化线上营销服务流程,让服务更通畅?

在线客服是现代企业服务的重要组成部分&#xff0c;在线客服的质量在很大程度上决定客户的满意度和忠诚度。企业如何简化线上营销服务流程&#xff0c;让服务更通畅&#xff1f;本文将就此探讨。 一、建立流程管理体系 在线上营销服务中&#xff0c;建立流程管理体系可以帮助企…

期权期货品种的交易时间规定与限制

期权和期货品种是在交易所进行交易的&#xff0c;期货交易所有固定的工作时间&#xff0c;并不是24小时都可以交易的&#xff0c;一般国内的期货交易所有日盘和夜盘&#xff0c;不同交易所对交易时间的规定有所不同&#xff0c;交易的期货品种不同&#xff0c;交易时间也是有所…

真实的产品开发中,后端的设计规约可以写哪些

真实的产品开发中&#xff0c;后端的设计规约可以写哪些 产品开发的后端设计规约通常包括以下内容&#xff1a; 数据模型设计&#xff1a;详细描述数据库的结构&#xff0c;包括数据表的设计、字段的定义和关系的设置等。 业务逻辑设计&#xff1a;详细描述后端的业务逻辑&a…

官宣!不藏了~AnyCase 4.0 真“箱”

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 重磅好消息&#xff01;&#xff01;&#xff01; 2023年9月15日&#xff0c;我们正式官宣啦~ 经过持续地升级迭代和精心打磨 箱讯科技AnyCase4.0成功上线&#xff01; 梦想为引&#xff0c;创新为帆&…

STM32F103VET6基于ENC28J60移植LWIP1.4.1(标准库,FreeRTOS)

目录 准备模板LWIP文件夹新建组魔术棒修改lwipopts.h修改sys_arch.h修改sys_arch.c修改LWIP初始化函数中断文件主文件测试源码 在进行移植之前&#xff0c;大家需要学会FreeRTOS的基本使用与无OS移植LWIP的经验&#xff0c;因为基于FreeRTOS移植LWIP需要准备一个FreeRTOS模板项…