Linux设备树详细学习笔记

news2025/1/22 19:13:47

参考文献

参考视频
开发板及程序 原子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{//子节点,节点名称为node1
	node1_child{//子子节点,节点名称为node1_child
	}}

同级节点下节点名称不能相同,不通级节点名称可以相同。
label 标签:引入 label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点。
node-name名称:必须要有。
unit-address:设备地址,这里的设备地址没有实际用处,只是为了代码可读性的要求。

特殊节点

  • aliases
    特殊节点aliases用来定义别名。定义别名的目的就是为了方便引用节点。当然,除了使用aliases来命名别用,也可以在对节点命名的适合添加标签来命名别名。
举例:
aliases(
	mmc0= &sdmmc0
	mmc1 = &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函数总结

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

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

相关文章

Vuex核心 - 模块 module(进阶)创建拆分

文章目录 module分模块一、什么是 模块module二、module的好处三、模块创建-拆分 module分模块 一、什么是 模块module 在Vuex中&#xff0c;模块&#xff08;module&#xff09;是用来组织和管理状态&#xff08;state&#xff09;、行为&#xff08;actions&#xff09;、变…

CIO40--数字化转型之回报效益ROI(含表格)

一﹑对BOSS的好处 随时可以由系统中的资料掌握公司的营运状况。建立公司的管理体系及运作规范﹐由系统管理公司运作。建立公司营运的数据库﹐累积公司的管理经验知识﹐不会因人员异动而流失。由系统信息的整合﹐可以提升公司的反应速度﹐不需由人力统计﹐可减少错误﹐节省人力…

3D视觉测量:形位公差 GDT同轴度(附源码)

文章目录 0. 测试效果1. 基本内容2. 公共轴线法3. 实现代码(待添加)目标:通过3D视觉的方法测量圆柱的同轴度 0. 测试效果 1. 基本内容 "同轴度" 是一个工程学和制造业中常用的术语,用来描述一个对象、零件或装置的各个组成部分是否在一个共同的轴线上对齐…

自动驾驶之高精地图介绍

高精地图 文章目录 高精地图前言一、什么是高精地图 前言 一、什么是高精地图 高精地图(High Definitation Map,HD MAP)&#xff0c;和普通导航电子地图的主要区别是精度更高、信息更丰富。精度更高主要体现在高精地图的绝对坐标精度更高(指的是地图上某个目标和外部的真实世…

linux 网络接口的子接口的配置

参考&#xff1a; https://blog.csdn.net/baidu_38803985/article/details/104653205 在 Linux 中&#xff0c;网络接口通常以ethX的形式命名&#xff0c;其中X代表接口的编号&#xff0c;例如eth0代表第一个网络接口&#xff0c;eth1代表第二个&#xff0c;依此类推。虚拟子接…

嵌入式学习笔记(22)汇编实现时钟设置代码详解

4.6.1时钟设置的步骤分析 第1步&#xff1a;先选择不使用PLL。让外部24MHz原始时钟直接过去&#xff0c;绕过APLL那条路。 第2步&#xff1a;设置锁定时间&#xff08;PLL_LOCK&#xff09;。默认值是0x0FFF&#xff0c;保险起见我们设置0xFFFF 第3步&#xff1a;设置分频系…

Linux 服务器连接方式

这里服务器使用 Ubuntu 20.04.6 LTS aarch64&#xff0c;这篇文章就不说使用工具连接了&#xff0c;工具直接添加就好了&#xff0c;这里说下终端命令操作 SSH 命令使用密码连接 使用以下命令在终端进行密码连接 ssh usernamehostname如果是第一次连接 SSH 客户端会提示你是否…

盘点一个os.path.join()函数遇到的小问题(文末赠书)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 连峰去天不盈尺&#xff0c;枯松倒挂倚绝壁。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【小马哥】问了一个os路径拼接处理的问…

Kafka入门,这一篇就够了(安装,topic,生产者,消费者)

目录 Kafka的安装文件与配置目录binconfig 配置文件server.propertiesproducer.propertiesconsumer.properties 命令行简单使用kafka-topics.sh新增查看列表查看详情修改删除 kafka-console-producer.shkafka-console-consumer.sh 概念集群代理broker主题topic分区partition偏移…

用递归实现字符串逆序(不使用库函数)

文章目录 前言一、题目要求二、解题步骤1.大概框架2.如何反向排列&#xff1f;3.模拟实现strlen4.实现反向排列5.递归实现反向排列 总结 前言 嗨&#xff0c;亲爱的读者们&#xff01;我是艾老虎尤&#xff0c;今天&#xff0c;我们将探索一个题目&#xff0c;这个题目对新手非…

【计算机基础】揭露办公软件WPS、Offfice好用但又很少去做的便捷操作

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【memcpy函数的介绍与使用和模拟实现】

memcpy函数的介绍与使用和模拟实现 1.memcpy函数的介绍 资源来源于cplusplus网站 它的作用是&#xff1a; 将数字字节的值从源指向的位置直接复制到目标指向的内存块。 源指针和目标指针指向的对象的基础类型与此函数无关; 结果是数据的二进制副本。 该函数不检查源代码中是否…

uboot顶层Makefile前期所做工作说明四

一. uboot顶层 Makefile文件 uboot 顶层 Makefile&#xff0c;就是 uboot源码工程的根目录下的 Makefile文件。 本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习&#xff0c;如下&#xff1a; uboot顶层Makefile前期所做工作说明三_凌肖战的博…

信息系统项目管理师(第四版)教材精读思维导图-第十二章项目质量管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图源文件 ​ 12.1 管理基础 12.2 管理过程 12.3 规划质量管理 12.4 管理质量 12.5…

增强 CAD Exchanger SDK 中 B-rep 表示的渲染性能

增强 CAD Exchanger 中 B-rep 表示的渲染性能 在这篇博文中&#xff0c;我们将深入探讨增强 CAD Exchanger 产品中 B-rep 表示的渲染性能的主题&#xff0c;探讨此过程中面临的挑战&#xff0c;并讨论 CAD Exchanger 所采用的创新技术来优化它。 在 版本 3.20中&#xff0c;我…

第7篇 vue的模块化与label的转换

一 label的转换 1.1 label的转换 二 模块化 2.1 模块化 前端中&#xff0c;js文件调用js文件&#xff0c;js文件之间的调用&#xff0c;即就是模块化。 2.2 案例1 1.新建工程并初始化 2. 编写脚本 1.js // 定义成员&#xff1a; const sum function(a,b){return parseIn…

持安零信任加入PKS体系生态联盟,共创办公安全新生态

近日&#xff0c;PKS体系生态联盟公布最新一期会员单位名单&#xff0c;零信任办公安全领域的明星企业持安科技成为其网络安全领域新增会员&#xff0c;未来将与众多合作伙伴一同建设网络安全强国。 PKS体系生态联盟是在中国电子信息产业集团有限公司的倡议下&#xff0c;广泛联…

Redis数据库安装、使用、数据类型、常用命令(详解)

安装 Releases tporadowski/redis GitHub 直接去选择msi格式的&#xff0c;窗口式的安装&#xff0c;一步一步。 安装过程中有一个选项是问你需不需要配置到环境变量中&#xff0c;选上这个选项&#xff0c;不选的话&#xff0c;需要自己去配环境变量。 检查是否安装配置…

腾讯云CVM S5服务器性能如何?CPU计算性能测评

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽&#xff0c;15个月313.2元、2核4G配置748.2元15个月&#xff0c;CPU内存配置还可以选择4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3M、5M或10M&#xff0c;百…

如何修改jupyter notebook默认打开路径

1、用jupyter notebook在其他位置打开自己的ipython项目&#xff1a; jupyter notebook是一个很好用的工具&#xff0c;可以保存运行结果&#xff0c;还可以给项目添加很多可视化操作与介绍文字。安装anaconda后&#xff0c;jupyter notebook就会自动安装&#xff0c;点开它会…