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

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 //开放设备树&#xff0c;起源于OpenFirmware (所以后续会见到很多OF开头函数) dts: device tree source的缩写 //设备树源码 dtsi: device …...

【系统架构】系统架构设计基础知识

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

快递、外卖、网购自动定位及模糊检索收/发件地址功能实现

概述 目前快递、外卖、团购、网购等行业 &#xff1a;为了简化用户在收发件地址填写时的体验感&#xff0c;使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家&#xff1b;让大家理解辅助定位及模糊地址检索的功能实现过程&#xff0c;以及开发出自己理想的作品…...

Springboot后端导入导出excel表

一、依赖添加 操作手册&#xff1a;Hutool — &#x1f36c;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实现分页、模糊搜索、按列过滤功能 背景逻辑展示示例代码 背景 在有一些数据通过数据库查询出来后&#xff0c;需要经过一定的逻辑处理才进行前端展示&#xff0c;这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐…...

webpack:系统的了解webpack一些核心概念

文章目录 webpack 如何处理应用程序&#xff1f;何为webpack模块chunk&#xff1f;入口(entry)输出(output)loader开发loader 插件(plugin)简介流程插件开发&#xff1a;Tapable类监听(watching)compiler 钩子compilation 钩子compiler和compilation创建自定义 插件 loader和pl…...

Unreal Engine Loop 流程

引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中&#xff0c;做了一个图。记录一下&#xff01;&#xff01; ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录&#xff0c;以备后用…...

FLASK中的鉴权的插件Flask-HTTPAuth

在 Web 应用中&#xff0c;我们经常需要保护我们的 api&#xff0c;以避免非法访问。比如&#xff0c;只允许登录成功的用户发表评论等。Flask-HTTPAuth 扩展可以很好地对 HTTP 的请求进行认证&#xff0c;不依赖于 Cookie 和 Session。本文主要介绍两种认证的方式&#xff1a;…...

linux万字图文学习进程信号

1. 信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…...

DataX实现Mysql与ElasticSearch(ES)数据同步

文章目录 一、Linux环境要求二、准备工作2.1 Linux安装jdk2.2 linux安装python2.3 下载DataX&#xff1a; 三、DataX压缩包导入&#xff0c;解压缩四、编写同步Job五、执行Job六、定时更新6.1 创建定时任务6.2 提交定时任务6.3 查看定时任务 七、增量更新思路 一、Linux环境要求…...

第二章 进程与线程 十、调度算法1(先来先服务、短作业优先、最高响应比优先)

目录 一、先来先服务算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺点 优点&#xff1a; 缺点&#xff1a; 6、是否会导致饥饿 7、例子 二、短作业优先算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺…...

windows平台 git bash使用

打开所在需要git管理的目录,鼠标右键open Git BASH here 这样就直接进来,不需要windows dos窗口下麻烦的切路径&#xff0c;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 四、部署…...

计算机组成原理——基础入门总结(一)

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

批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量

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

从一到无穷大 #17 Db2 Event Store,A Purpose-Built IoT Database Engine

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言Architectural overviewData format and meta-dataEnsuring fast ingestionMulti…...

9月16日,每日信息差

今天是2023年09月16日&#xff0c;以下是为您准备的15条信息差 第一、天猫超市首单“茅小凌”已由菜鸟送达&#xff0c;首单已由菜鸟供应链完成履约&#xff0c;18分钟送达消费者手中 第二、软银考虑对OpenAI进行投资。此外&#xff0c;软银还初步拟收购英国人工智能芯片制造…...

准备篇(二)Python 教程

Part 1 Python 基础语法区分输入与输出注释文本列表if 语句for 语句range() 函数走向编程的第一个例子Part 2 函数 和 数据结构函数数据结构del 语句列表详解元组集合字典循环的技巧Part 3 输入与输出读写文件打开文件 open()读文件写文件...

HTML+CSS画一个卡通中秋月饼

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

echarts的折线图,在点击图例后,提示出现变化,不报错。tooltip的formatter怎么写

在点击图例的年后&#xff0c;提示框会相应的变化&#xff0c;多选和单选都会响应变化。tooptip的重度在formatter tooltip:{show:true,trigger:"axis",alwaysShowContent:true,triggerOn:"mousemove",textStyle:{color:"#fff"},backgroundColor…...

C++中的auto是一个关键字,用于在编译时自动推导变量的类型

C中的auto是一个关键字&#xff0c;用于在编译时自动推导变量的类型。通过使用auto关键字&#xff0c;编译器可以根据变量的初始化表达式来确定其类型&#xff0c;从而省略了显式地指定类型的步骤。 使用auto关键字声明的变量必须在定义时进行初始化&#xff0c;以便编译器可以…...

VUE build:gulp打包:测试、正式环境

目录 项目结构 Gulp VUE使用Gulp Vue安装Gulp Vue定义Gulp.js package.json build文件夹 config文件夹 static-config文件夹 项目结构 Gulp Gulp是一个自动化构建工具&#xff0c;可以帮助前端开发者通过自动化任务来管理工作流程。Gulp使用Node.js的代码编写&#xff…...

1.使用turtle换一个五环2.设计这样一个程序:输入一个数字 判断它是不是一个质数

1.使用turtle换一个五环 import turtle turtle.pensize(15) turtle.penup() turtle.color(blue) turtle.goto(-150,-35) turtle.pendown() turtle.circle(60) turtle.penup() turtle.color(black) turtle.goto(0,-35) turtle.pendown() turtle.circle(60) turtle.penup() turtl…...

C语言希尔排序

希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种&#xff0c;也称缩小增量排序&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序的基本思想是&#xff1a;先将整个待排序的记录序列分割成为若干子序列&#xff08;由…...

KubeSphere 在互联网医疗行业的应用实践

作者&#xff1a;宇轩辞白&#xff0c;运维研发工程师&#xff0c;目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。 前言 2020 年我国互联网医疗企业迎来了“爆发元年”&#xff0c;越来越多居民在家隔离期间不方便去医院看诊&#xff0c;只好采取在线诊疗的手…...

物联网:用python调入机器学习分析物联网数据入侵检测模块

要使用Python调用机器学习分析物联网数据入侵检测模块&#xff0c;您需要以下步骤&#xff1a; 安装Python和相关的机器学习库&#xff0c;如scikit-learn、pandas、numpy等。您可以使用pip命令来安装这些库。 准备输入数据。这些数据可以是来自物联网设备的原始数据&#xff…...

使用scss简化媒体查询

在进行媒体查询的编写的时候&#xff0c;我们可以利用scss与与编译器&#xff0c;通过include混入的方式对代码进行简化&#xff0c;从而大大提高了代码的可维护性&#xff0c;也减少了代码的编写量&#xff0c;废话不多说&#xff0c;直接上代码&#xff1a; // 断点列表 相当…...

win部署CRM

win部署crm&#xff09; 1.phpstudy2.composer3.代码4.其他配置 周末锴哥让我帮他部署了一个CRM&#xff0c;写个教程&#xff0c;方便之后他用。锴哥用的是 NxCrm&#xff0c;先把代码下下来。 1.phpstudy 1.首先是下载小皮面板&#xff0c;配置php的环境。这里面下载了php8…...

Linux命令200例:dip用于用户与远程主机建立通信连接

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…...

【每日一题】981. 基于时间的键值存储

981. 基于时间的键值存储 - 力扣&#xff08;LeetCode&#xff09; 设计一个基于时间的键值数据结构&#xff0c;该结构可以在不同时间戳存储对应同一个键的多个值&#xff0c;并针对特定时间戳检索键对应的值。 实现 TimeMap 类&#xff1a; TimeMap() 初始化数据结构对象void…...

wordpress采集前端发文/bing搜索引擎入口官网

奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4861 Accepted Submission(s): 2770 Problem Description一个 n 阶方阵的元素是1,2,...,n^2,它的每行&#xff0c;每列和2条对角线上元素的和相等&am…...

做软件贵还是做网站贵/国内seo服务商

目录 用户管理用户管理 主要为了控制权限&#xff0c;让不同开发者&#xff0c;仅能操作属于自己的业务范围内的数据 创建mysql账户 账户中涉及的三个数据 账户名、密码、ip地址 ip是用于限制某个账户只能在哪个机器上登录------------------------第一种方式-----------------…...

怎样自创网站/哪个搜索引擎最好用

innerText&#xff0c;outerText&#xff0c;innerHTML&#xff0c;outerHTML 这次我们要使用另一些对象属性对来实现动态改变文本&#xff0c;它们就是&#xff1a;innerText&#xff0c;outerText&#xff0c;innerHTML&#xff0c;outerHTML&#xff0c;千万要注意它们的大…...

深圳做营销网站设计/如何网络推广

一、基础知识1、一个主机的端口号为所有进程所共享&#xff0c;但普通用户进程绑定bind不了一些特殊端口号如20、80等。多个进程不能同时监听listen同一个端口&#xff0c;会失败。当然父进程可以先listen然后fork多个子进程&#xff0c;多个子进程都可以accept这个sock&#x…...

为什么会有人攻击我用织梦做的网站/网站友链交换平台

<script>document.write("<script typetext/javascript src//site.com/js.js?v" Date.now() "><\/script>");</script> 使用了网友的上述方法之后&#xff0c;导致了 layui的 折叠面板 异常无法点击 layui-collapse 排查了3…...

运城网站建设公司有多少/搜索引擎营销案例分析题

Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&#xff0c;第一个公开发行版发行于1991年。Python的特点&#xff1a;优雅、明确、简单。Python适合的领域&#xff1a;Web网站和各种网络服务、系统工具和脚本、作为“胶水”…...