Linux设备树初步

news2024/9/20 8:03:17

一.设备树的概念

设备树:是一种描述硬件资源的数据结构,不是将设备的每个细节都硬编码到操作系统中,而是可以在引导时传递给操作系统的数据结构中描述硬件的许多方面。

设备树是描述一个硬件平台的硬件资源。这个“设备树”可以被bootloader(uboot)传递到内核, 内核可以从设备树中获取硬件信息。在操作系统(OS)引导阶段进行设备初始化(DTB文件在linux内核启动的时候内核解析),解析之后设备树就被放到内存在上(逻辑结构:树状结构)。如果某个驱动需要使用设备信息,直接从设备树上获取对应的设备信息即可。
树的主干就是系统的总线,在设备树里称为“根节点”。比如I2C控制器,SPI控制器,CAN控制器等都是接到系统主线上的分支,在设备树上称为“根节点的子节点”
设备树可以像头文件(.h)那样,一个设备文件引用另一个设备文件,实现“代码”的重用(复用),例如GEC6818是一款基于ARM公版开发板的产品,它采用了S5P6818芯片作为处理器,如果多个硬件平台都是用S5P6818芯片作为主控芯片,那么我们可以把S5P6818芯片的硬件资源写到一个单独的设备树文件里面一般使用“.dtsi”后缀,其他设备树文件直接使用“#includexxxx”引用即可。
DTS、DTC和DTB它们是常见的几个缩写:
DTS 是指.dts格式的文件,是一种ASII 文本格式的设备树描述,也是我们要编写的设备树源码,一般一个.dts文件对应一个硬件平台,位于Linux源码的“/arch/arm/boot/dts”目录下。
DTC 是指编译设备树源码的工具,一般情况下我们需要手动安装这个编译工具。
DTB 是设备树源码编译生成的文件,类似于我们C语言中“.C”文件编译生成“.bin”文件。
dtb通过Bootloader引导程序加载到内核。

二.编译设备树

首先我们需要编译好内核(通常只需一次编译好内核,编译内核的时候会生成的dtc工具),内核编译的位置在 kernel目录中 ,内核中的dtc工具位置在 内核源码/scripts/dtc/dtc
使用方法:

/usr/src/linux-source-4.4.0/scripts/dtc/dtc -I dts -O dtb -o xxx.dtb xxx.dts

也可以反编译:

/usr/src/linux-source-4.4.0/scripts/dtc/dtc -I dtb -O dts -o xxx.dts xxx.dtb

红色为dtc工具的绝对路径,要加上。

三.设备树语法

头文件:

头文件:设备树是可以像C语言那样使用“#include”引用“.h”后缀的头文件,也可以引用设备树“.dtsi”后缀的头文件。imx6ull.dtsi由NXP官方提供,是一个imx6ull平台“共用”的设备树文件。

#include "skeleton.dtsi"

节点:

设备树节点:“/ {…};”表示“根节点”,每一个设备树只有一个根节点。不同文件的根节点最终会合并为一个。在根节点内部的“chosen{…}”、memory{…}”、“reserved-memory{…}”、“leds{…}”等字符,都是根节点的子节点。

命名:对节点命名的时候要体现设备的类型

格式:[标签]:<名称>[@<设备地址>] (这里的设备地址没有实际意义,只是让节点名称更人性化,方便阅读,一般设置为外设的物理地址(按照惯例,如果一个节点有 reg 属性,那么该节点的名字就必须包含设备地址,这个设备地址就是 reg属性里第一个地址值。)。另外,当同级设备节点名称相同时,可以通过设备地址进行区分且编译不报错!。)同级节点名称不能相同,不同级的可以相同。

标签,也叫别名,方便引用。比如通过&CPU1就可以访问“cpu@1”这个节点

属性:

reg属性:
可编址设备使用以下属性将地址信息编码进设备树:

reg
#address-cells
#size-cells

每个可编址设备都有一个reg,它是一个元组表,形式为:

reg =<地址1 长度1[地址 2长度 2][地址3 长度3]...>。

每个元组都表示该设备使用的一个地址范围。每个地址值是一个或多个 32 位整型数列表,称为 cell。同样,长度值也可以是一个 cell 列表或者为空。由于地址和长度字段都是可变大小的变量,那么父节点的 #address-cells 和#size-cells 属性就用来声明各个字段的 cell 的数量。换话说,正确解释一个 reg 属性需要用到父节点的#address-cells 和#size-cells 的值。

model属性:
它的值是一个字符串,用于描述一些信息,比如设备的名字等。

model="This is my device"

status属性,该属性和设备状态有关,值是字符串,有几个状态可选:
okay: 设备是可用状态
disable: 设备是不可用状态
fail: 设备是不可用状态并且检测到了错误
fail-sss: 设备是不可用状态并且检测到了错误,sss是错误内容
compatible 属性:
这是一个非常重要的属性,他是用来和驱动进行匹配的。匹配成功以后,会执行驱动中的probe函数。
举例:

compatible = "arm,p1330","arm,primecell";

匹配的时候会先使用第一个值进行匹配,没有就使用第二个值进行匹配。
range属性:
该属性提供了子节点地址空间和父地址空间的映射(转换)方法,常见格式是 <子地址、父地址、地址长度>。如果父地址空间和子地址空间相同则无需转换。
比如对于#address-cells和#size-cells都为1的话,以ranges=<0x0 0x10 0x20>为例,表示将子地址的从0x0~(0x0 + 0x20)的地址空间映射到父地址的0x10~(0x10 + 0x20)。
device_type属性:
device_type属性也是一个很少用的属性,只用在CPU和内存的节点上,值是字符串,用于描述这些节点。
chosen节点:(必须写在根节点下面)
chosen 节点并不代表一个真正的设备,只是一个为固件和操作系统传递数据的地方,如引导参数。chosen 节点里的数据也不代表硬件。如在 arch/arm/boot/dts/exynos4412-origen.dts 文件中的 chosen 节点定义如下:

chosen {
    bootargs = "console=ttySAC2,115200";
};

设备树特殊节点:

aliases 节点用于指定节点的别名。因为引用一个节点要使用全路径,当子节点离根节点较远时,节点名就会显得比较冗长,定义一个别名则比较方便。下面把 spi 0这个节点定义了一个别名“spi0”。

aliases {
    spi0 = &spi0;
...

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

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

相关文章

综合能源充电站有序充电策略

随着电动汽车的发展&#xff0c;充电用户越来越多&#xff0c;同时也出现了一系列问题&#xff0c;尤其是无序充电带来的充电成本高、充电排队时间长和电网负荷安全影响等问题&#xff0c;制约着电动汽车和充电设施的发展。为解决此类问题&#xff0c;文章研究和设计有序充电策…

Kevin‘s notes about Qt---Episode 4 多次点击按钮反复执行机械臂动作

原先版本 SDK 1.2.1 - 2020-04-02 HMI 界面 4.0.6.135135 控制器 1.7.5 升级程序 0.6.4 伺服版本 不详(似乎也并不重要) 前言 在之前的工作中,这个问题并没有得到有效解决,情况如下: 在之前版本的程序中,每次动作执行完后需要关闭Qt界面,下一次想要运行机械臂程序时,…

数据链路层(Mac帧,报头字段,局域网通信原理),MTU,MSS,ip报文的分包与组装(ip报头字段介绍,组装过程,判断是否被分片/收到全部分片)

目录 数据链路层 介绍 MTU 介绍 在哪一层分片 IP报文的分包与组装 16位标识 3位标志 13位片偏移 示例 组装过程 确定是否被分片 确定是否收到全部分片 注意点 数据链路层与网络层的关系 Mac帧 Mac地址 报头格式 目的/源地址 类型 局域网通信原理 图解 碰撞…

TCP并发服务端的实现

思想&#xff1a;创建多个套接字&#xff0c;由"我"来管理这些套接字 方法&#xff1a; 1.多进程 2.多线程 3.IO多路复用 tcp服务器端创建流程&#xff1a; socket() bind() listen() connfd accept IO多路复用&#xff1a; 多个文件I复用同一个进程 IO…

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…

【香橙派系列教程】(十八) 视觉垃圾桶-网络线程

【十八】视觉垃圾桶-网络线程 文章目录 【十八】视觉垃圾桶-网络线程一、增加网络控制功能1.实现需求&#xff1a;2.TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。三、C语言实现TCP KeepAlive功能1.函数原型2.返回…

Python+tkinter实现俄罗斯方块游戏

游戏界面&#xff1a; 一个方块区域&#xff08;游戏板&#xff09;&#xff0c;显示当前分数和最高分的标签&#xff0c;以及控制按钮&#xff08;重启、暂停、显示排行榜&#xff09;。玩家可以通过点击“Restart”按钮重启游戏&#xff0c;点击“Pause”按钮暂停游戏&#…

Windows隐藏起你的秘密文件以及文件夹工具

我们都知道&#xff0c;在 Windows 中可以右键文件夹&#xff0c;选择”属性“&#xff0c;勾选”隐藏“来实现隐藏某个文件夹。 我们还知道&#xff0c;在 Windows 中可以选择勾选 ”显示隐藏的项目和文件夹“&#xff0c;来使上述方法变得形同虚设。 本工具就是用于解决以上…

Spring框架:开发者的得力伙伴,魅力何在?

目录 一. Spring介绍 二. Spring搭建 三. Spring Bean管理 ▐ 管理方式 ▐ 依赖注入 四. Spring数据访问层管理 五. Spring集成MyBatis 海漫浩浩,我亦苦作舟!大家一起学习,一起进步! 一. Spring介绍 Spring是什么? Spring 是一个轻量级的, IOC 和 AOP 的一站式 J…

刷机维修进阶教程-----小米系列机型手机端 直接修改参数步骤解析

在前面分享的修改机型参数的博文中都是开启端口。然后使用电脑端工具类 进行修改参数。今天来给大家解析下小米系列机型如何直接在手机端上面进行修改。在这里要切记。操作前需要备份原机的各项基带参数 分区以及基带qcn。避免操作失误无信号无基带故障出现。 通过博文可以初…

产业园的运营到底有多重要?

在当今经济高速发展的时代&#xff0c;产业园如雨后春笋般涌现&#xff0c;成为推动产业升级和区域经济发展的重要力量&#xff0c;然而&#xff0c;一个成功的产业园并非仅仅依靠开发建设就能实现其价值&#xff0c;更需要精心的运营管理。为什么这么说&#xff1f;今天我们就…

RSA加密解密算法认识及signln_resolve

RSA初步了解 一、首先认识rsa是一种非对称加密算法。 对称加密&#xff1a;加密解密使用同一个密钥&#xff0c;加密者接受信息采用密钥加密&#xff0c;而到破译者手中还是使用这份密钥。这种方式的优点是加密效率高、加解密速度快&#xff0c;但是缺点是密钥需要共享&#x…

如何评价快手可灵的图生视频能力,和市场同类产品相比孰优孰劣?

利用AI工具批量生成影视短剧推广https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为可灵AI官方认证为数不多的几十名超级创作者之一&#xff0c;同时也是AI视频生成多种应用的深度使用者&#xff0c;我来回答下这个问题。 我认为快手可灵是目前市场上无可争议&#xff0c;顶级的图…

python方法介绍

python基础语法 前言导读:Python的创始⼈人为吉多范罗苏姆(Guido van Rossum)。 1989年年的圣诞节期间,吉多范罗苏姆为了了在阿姆斯特丹打发时间,决⼼开发一个新的脚本解释程序,作为ABC语言的一种继承。其诞生于1990年; 1. 基础常识 1.1 python的发展 1989年,Guido (…

Python青少年简明教程:流程控制语句

Python青少年简明教程&#xff1a;流程控制语句 流程控制是编程语言中用于控制程序执行顺序的机制。它决定了代码块的执行路径&#xff0c;包括哪些语句会被执行、哪些不会被执行以及在什么条件下执行。 本节介绍Python的流程控制语句。 if语句 if语句简单的语法格式如下&…

通过观测云 eBPF Tracing 实现无埋点的全链路追踪

前言 随着微服务架构的普及和系统复杂度的增加&#xff0c;对应用程序的可观测性要求也越来越高。传统的监控方法通常需要在应用程序中添加代码来记录和追踪重要信息&#xff0c;这种方法可能会增加系统的负担&#xff0c;并且在复杂系统中维护难度较大。 eBPF&#xff08;Ex…

翻译_Clock Domain Crossing Design

翻译_Clock Domain Crossing Design 原文标题及连接:Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog. 作者:Clifford E. Cummings Sunburst Design, Inc. cliffc@sunburst-design.com 摘要 在多时钟设计中,需要在时钟域交叉(…

SpringBoot——请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

(经验)SVN降版本,保留版本信息和用户信息。

背景&#xff1a;由于开始公司人数规模小&#xff0c;没有关心SVN最新版本免费对于用户数量限制要求不敏感&#xff0c;随着人数越来越多&#xff0c;公司来了新员工已经添加不了SVN需要注册码了&#xff0c;不利于SVN文件管理的在公司内部的推广。看了好多资料&#xff0c;都没…

Java:jdk8之后新增的时间API

文章目录 为什么要使用新增的API新增了哪些&#xff1f;Local常用方法代码一样的用法 黑马学习笔记 使用新增的 为什么要使用新增的API 新增了哪些&#xff1f; Local 常用方法 代码 package NewTime;import java.time.LocalDate;/*** Author: ggdpzhk* CreateTime: 2024-08-…