Linux设备树详细学习笔记
参考文献
参考视频
开发板及程序 原子mini
设备树官方文档
设备树的基本概念
DT:Device Tree //设备树
FDT: Flattened Device Tree //开放设备树,起源于OpenFirmware (所以后续会见到很多OF开头函数)
dts: device tree source的缩写 //设备树源码
dtsi: device tree source include的缩写 //通用的设备树源码<5>dtb: device tree blob的缩写//编译设备树源码得到的文件
dtc: device tree compiler的缩写 //设备树编译器
设备树编译
dis和dtsi文件通过dtc编译器,生成dtb设备树二进制文件。
DTC编译器在内核源码:
alientek@ubuntu16:~/linux/linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7$ find -name dtc.c./drivers/scsi/dtc.c
./scripts/dtc/dtc.c
alientek@ubuntu16:~/linux/linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7$ cd ./scripts/dtc/dtc.c
bash: cd: ./scripts/dtc/dtc.c: Not a directory
alientek@ubuntu16:~/linux/linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7$ cd ./scripts/dtcalientek@ubuntu16:~/linux/linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7/scripts/dtc$ ls
checks.c dtc-parser.tab.h Makefile
checks.o dtc-parser.tab.h_shipped Makefile.dtc
data.c dtc-parser.tab.o modules.order
data.o dtc-parser.y srcpos.c
dtc fdtdump.c srcpos.h
dtc.c fdtget.c srcpos.o
dtc.h fdtput.c treesource.c
dtc-lexer.l flattree.c treesource.o
dtc-lexer.lex.c flattree.o update-dtc-source.sh
dtc-lexer.lex.c_shipped fstree.c util.c
dtc-lexer.lex.o fstree.o util.h
dtc.o libfdt util.o
dtc-parser.tab.c livetree.c version_gen.h
dtc-parser.tab.c_shipped livetree.o
编译内核时候,会同步编译dtc。
指令格式 dtc [-I input-format] [-O output-format][-o output-filename] [-V output_version] input_filename
编译设备树:dtc -I dts -O dtb -o xxx.dtb xxx.dts
反编译设备树:dtc -I dtb -O dts -o xxx.dts xxx.dtb
简单写一个dts
/dts-v1/;
/ {};
编译与反编译
在Linux根目录下,用make dtbs 可以编译所有设备树。
arch/arm/boot/dts/Makefile,通过比配置,控制编译那些设备树
dtb-$(CONFIG_SOC_IMX6UL) += \imx6ul-14x14-ddr3-arm2.dtb \imx6ul-14x14-ddr3-arm2-emmc.dtb \
.........imx6ul-9x9-evk-csi.dtb \imx6ul-9x9-evk-ldo.dtb
语法
头文件
和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为.dtsi,也可以引用 C 语言中的.h 文件,甚至也可以引用.dts 文件,例如
#include <dt-bindings/input/input.h>
#include "xxxxx.dtsi"
一般.dtsi 描述板级信息(也就是开发板上有哪些 IIC 设备、SPI 设备等,由芯片厂提供),.dts 描述 SOC 级信息(各个外设控制器信息、那个iic上挂哪个传感器等),这样写的好处是,将芯片平台与下游odm分开,通过dts拓展原始基础dtsi。
节点
根节点是设备树必须要包含的节点。根节点的名字是/。
子节点格式为
[label:]node-name[@unit-address]{[properties definitions][child nodes]
};
举例:
node1{//子节点,节点名称为node1node1_child{//子子节点,节点名称为node1_child};
};
同级节点下节点名称不能相同,不通级节点名称可以相同。
label 标签:引入 label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点。
node-name名称:必须要有。
unit-address:设备地址,这里的设备地址没有实际用处,只是为了代码可读性的要求。
特殊节点
- aliases
特殊节点aliases用来定义别名。定义别名的目的就是为了方便引用节点。当然,除了使用aliases来命名别用,也可以在对节点命名的适合添加标签来命名别名。
举例:
aliases(mmc0= &sdmmc0mmc1 = &sdmmc1:mmc2 = &sdhci:serial0="/simple@fe000000/serial@llc500”
}
- choosen
chosen节点用来uboot给内核传递参数。重点是bootargs参数。chosen节点必须是根节点的子节点。举例:
chosen{bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200"
}
属性
- compatible:“兼容性”属性,该属性的值是一个字符串列表,compatible属性用于将设备和驱动绑定起来属性的值格式:“manufacturer,model”
其中,manufacturer 表示厂商,model 一般是模块对应的驱动名字;如果该属性为字符串列表,则先使用第一个兼容值在 Linux
内核里面查找,没找到的话再使用第二个兼容值查找 | - model:描述设备模块信息,一般为名字,例如:model = “wm8960-audio”;
- status:字符串,设备的状态信息,包括:“okay”、“disabled”、“fail”、“fail-xxx”(各种错误信息)
- #addresscells 和#size-cells:无符号 32 位整型,用于描述子节点的地址信息#address-cells决定了子节点 reg
属性中地址信息所占用的字长,#size-cells决定了长度信息所占用的字长。 - reg:寄存器信息,
例如:父节点#address-cells值为1,#size-cells值为1,则子节点中reg的值就是一个首地址加一个地址长度为一个单元,子节点可以reg=<0x100000000 0x0100 0x200000000 0x0100>;父节点#address-cells值为1,#size-cells值为0,则子节点中reg的值就是一个首地址加一个地址长度为一个单元,子节点可以reg=<0x100000000 0x200000000>; - ranges 属性:是一个地址映射/转换表,它可以为空,即“ranges;”,为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。
不为空时,格式:child-bus-address,parent-bus-address,length;
child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。
length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。 - device_type:在某些设备树文件中,可以看到device_type属性,device_type属性的值是字符串,只用于cpu节点或者memory节点进行描述。
- 自定义:自由发挥
节点含义
如果包含gpio-controller,该节点就是gpio控制器;
如果包含interrupt-controller,该节点就是gpio控制器;
引用
interrunt-parent=<&gpio0>;
追加内容
向节点追加内容,相当于硬件上,在soc厂商的基础上,添加字节的硬件。比如,要在iic总线上挂载一个六轴设备,soc厂商可能给一个例程,也可能不给,就要自己修改和添加。
比如dtsi中:
i2c1: i2c@021a0000 {#address-cells = <1>;#size-cells = <0>;compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";reg = <0x021a0000 0x4000>;interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_I2C1>;status = "disabled";
};
可以直接在dtsi中加,但是代码复用性就降低了。在dts中追加:
&i2c1 {clock-frequency = <100000>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_i2c1>;status = "okay";mag3110@0e {compatible = "fsl,mag3110";reg = <0x0e>;position = <2>;};ap3216c@1e {compatible = "ap3216c";reg = <0x1e>;};
};
这里就追加了几个属性和两个子节点。
其中,status属性进行了改写,属性名形同时,追加的值会覆盖原有的值。
实例分析
中断
在中断控制器中,必须有一个属性#interrupt-cells,表示其他节点如果使用这个中断控制器需要几个cell来表示使用哪一个中断。
在中断控制器中,必须有一个属性interrupt-controller,表示他是中断控制器。
在设备树中使用中断,需要使用属性interrupt-parent=<&XXXX>表是中断信号链接的是哪个中断控制器。接着使用interrupts属性来表示中断引脚和触发方式。
注: interrupt里有几个cell,是由interrupt-parent对应的中断控制器里面的#interrupt-cells属性决定。
//原厂BSP工程师编写
gpio1: gpio@209c000{compatible = "fsl,imx6ul-gpio","fsl,imx35-gpio";reg = <0x0209c000 0x4000>;interrupts = <GIC_SPI 66 IROTYPE LEVEL HIGH>,<GIC SPI 67 IRO TYPE LEVEL HIGH>;gpio-controller;//该节点可以是gpio控制器#gpio-cells = <2>;interrupt-controller;//该节点也可以是中断控制器#interrupt-cells = <2>;//引用该节点的节点中,interrupt-controller属性中数据的个数
}//开发人员编写
edt-ft5x06g38{compatible = "edt,edt-ft5x06”,"edt,edt-ft5406","edtedt-ft5306";pinctrl-names = "default";pinctrl-0 = <&ts_int_pin,&ats_reset_pin>;reg = <0X38>;interrupt-parent = <&gpio1>;interrupts = <9 0>;reset-gpios = <&gpio5 9 GPIO ACTIVE_LOW>;//低电平触发irq-gpios = <&gpio1 9 GPIO ACTIVE LOW>;status = "disabled";
}
设备树信息读取(of函数)
设备树被内核解析以后,可以在/proc/device-tree/目录中查看。
设备树机制是源于IEEE 1275 Open Firmware standard规范,相关的代码都是继承下来的,因此内核中设备树相关的函数都是以of开头的。
位置:include/linux/of.h
Linux设备树常用的OF函数总结
相关文章:

Linux设备树详细学习笔记
参考文献 参考视频 开发板及程序 原子mini 设备树官方文档 设备树的基本概念 DT:Device Tree //设备树 FDT: Flattened Device Tree //开放设备树,起源于OpenFirmware (所以后续会见到很多OF开头函数) dts: device tree source的缩写 //设备树源码 dtsi: device …...

【系统架构】系统架构设计基础知识
导读:本文整理关于系统架构设计基础知识来构建系统架构知识体系。完整和扎实的系统架构知识体系是作为架构设计的理论支撑,基于大量项目实践经验基础上,不断加深理论体系的理解,从而能够创造新解决系统相关问题。 目录 1、软件架…...

快递、外卖、网购自动定位及模糊检索收/发件地址功能实现
概述 目前快递、外卖、团购、网购等行业 :为了简化用户在收发件地址填写时的体验感,使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家;让大家理解辅助定位及模糊地址检索的功能实现过程,以及开发出自己理想的作品…...
Springboot后端导入导出excel表
一、依赖添加 操作手册:Hutool — 🍬A set of tools that keep Java sweet. <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</versio…...

通过stream流实现分页、模糊搜索、按列过滤功能
通过stream实现分页、模糊搜索、按列过滤功能 背景逻辑展示示例代码 背景 在有一些数据通过数据库查询出来后,需要经过一定的逻辑处理才进行前端展示,这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐…...
webpack:系统的了解webpack一些核心概念
文章目录 webpack 如何处理应用程序?何为webpack模块chunk?入口(entry)输出(output)loader开发loader 插件(plugin)简介流程插件开发:Tapable类监听(watching)compiler 钩子compilation 钩子compiler和compilation创建自定义 插件 loader和pl…...

Unreal Engine Loop 流程
引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中,做了一个图。记录一下!! 
linux万字图文学习进程信号
1. 信号概念 信号是进程之间事件异步通知的一种方式,属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…...

DataX实现Mysql与ElasticSearch(ES)数据同步
文章目录 一、Linux环境要求二、准备工作2.1 Linux安装jdk2.2 linux安装python2.3 下载DataX: 三、DataX压缩包导入,解压缩四、编写同步Job五、执行Job六、定时更新6.1 创建定时任务6.2 提交定时任务6.3 查看定时任务 七、增量更新思路 一、Linux环境要求…...

第二章 进程与线程 十、调度算法1(先来先服务、短作业优先、最高响应比优先)
目录 一、先来先服务算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺点 优点: 缺点: 6、是否会导致饥饿 7、例子 二、短作业优先算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺…...

windows平台 git bash使用
打开所在需要git管理的目录,鼠标右键open Git BASH here 这样就直接进来,不需要windows dos窗口下麻烦的切路径,windows和linux 路径方向不一致 (\ /) 然后git init 建立本地仓库,接下来就是git相关的操作了. 图形化界面查看 打开所在需要git管理的目录,鼠标右键…...

Linux系统之安装uptime-kuma服务器监控面板
Linux系统之安装uptime-kuma服务器监控面板 一、uptime-kuma介绍1.1 uptime-kuma简介1.2 uptime-kuma特点 二、本次实践环境介绍2.1 环境规划2.2 本次实践介绍2.3 环境要求 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装Node.js 四、部署…...

计算机组成原理——基础入门总结(一)
本帖更新一些关于计算机组成原理的重点内容。由于博主考研时并不会考这门课,但是考虑到操作系统中又很多重要晦涩的概念涉及很多诸如内存、存储器、磁盘、cpu乃至各种寄存器的知识,此处挑选一些核心的内容总结复盘一遍——实现声明:本帖的内容…...

批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量
📚目录 ⚙️简介✨分析获取步骤⛳获取文章列表☘️前期准备✨ 接口解析⚡️ 获取文章的接口 ☄️文章质量分接口⭐接口分析 ⌛代码实现:⚓核心代码:⛵测试用例:⛴ 运行效果:☘️增加Excel导出 ✍️结束 ⚙️简介 有时候我们写文章是为了记录当下遇到的bu…...

从一到无穷大 #17 Db2 Event Store,A Purpose-Built IoT Database Engine
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言Architectural overviewData format and meta-dataEnsuring fast ingestionMulti…...
9月16日,每日信息差
今天是2023年09月16日,以下是为您准备的15条信息差 第一、天猫超市首单“茅小凌”已由菜鸟送达,首单已由菜鸟供应链完成履约,18分钟送达消费者手中 第二、软银考虑对OpenAI进行投资。此外,软银还初步拟收购英国人工智能芯片制造…...
准备篇(二)Python 教程
Part 1 Python 基础语法区分输入与输出注释文本列表if 语句for 语句range() 函数走向编程的第一个例子Part 2 函数 和 数据结构函数数据结构del 语句列表详解元组集合字典循环的技巧Part 3 输入与输出读写文件打开文件 open()读文件写文件...

HTML+CSS画一个卡通中秋月饼
HTMLCSS画一个卡通中秋月饼🥮🥮🥮 中秋活动水个文章 整个divcss实现个月饼,给前端初学者一个练手的demo 效果图 思路 HTMl 先来个轮廓画脸上的东西:眼睛、眉毛、腮红、嘴巴眼睛丰富下瞳孔画20个花瓣 CSS 轮廓是要外…...

echarts的折线图,在点击图例后,提示出现变化,不报错。tooltip的formatter怎么写
在点击图例的年后,提示框会相应的变化,多选和单选都会响应变化。tooptip的重度在formatter tooltip:{show:true,trigger:"axis",alwaysShowContent:true,triggerOn:"mousemove",textStyle:{color:"#fff"},backgroundColor…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...