深入探讨Linux驱动开发:Linux设备树

文章目录

  • 一、设备树介绍
  • 二、设备树框架
    • 1.设备树框架
    • 2.节点基本格式
    • 3.节点部分属性简介
  • 总结


一、设备树介绍

设备树(Device Tree,简称 DT)是一种在嵌入式系统中描述硬件设备的一种数据结构和编程语言。它用于将硬件设备的配置信息以树形结构的方式进行描述,以便操作系统(如 Linux)可以根据这些信息正确地识别、配置和管理硬件设备。

设备树最初被引入到 Linux 内核中,用于解决硬件平台多样性带来的问题。传统上,Linux 内核在编译时需要包含大量的硬件配置信息,这对于支持多种硬件平台的嵌入式系统来说是不实际的。设备树的引入使得硬件配置信息可以从内核中分离出来,作为一种独立的描述性数据结构进行管理,从而实现了硬件配置的可移植性和灵活性。

设备树通常以 .dts(Device Tree Source)文件的形式存在,它是一种类似于 C 语言的语法,用于描述硬件设备的属性、寄存器地址、中断等信息。.dts 文件经过编译后会生成 .dtb(Device Tree Blob)文件,它是一种二进制格式的设备树表示形式,可以被 Linux 内核加载并解析。

在 Linux 内核启动时,设备树会被加载并传递给内核,供内核使用。内核通过解析设备树可以动态地配置硬件设备,加载对应的驱动程序,并建立设备之间的关联关系。

设备树的使用使得嵌入式系统在支持多种硬件平台时更加灵活和可扩展,同时也提供了一种标准化的描述硬件设备的方式,便于硬件厂商、开发者和社区之间的协作和交流。

在这里插入图片描述
设备树描述硬件资源时有两个特点:

①树的主干就是系统总线,在设备树里面称为“根节点”。IIC控制器、GPIO控制器、SPI控制器等都是接到系统主线上的分支,在设备树里称为“根节点的子节点”。

②设备树可以像头文件(.h文件)那样,一个设备树文件引用另外一个设备树文件, 这样可以实现“代码”的重用。例如多个硬件平台都使用i.MX6ULL作为主控芯片, 那么我们可以将i.MX6ULL芯片的硬件资源写到一个单独的设备树文件里面一般使用“.dtsi”后缀, 其他设备树文件直接使用“# includexxx”引用即可。

DTS、DTC和DTB它们是文档中常见的几个缩写。

  • DTS 是指.dts格式的文件,是一种ASII 文本格式的设备树描述,也是我们要编写的设备树源码,一般一个.dts文件对应一个硬件平台,位于Linux源码的“/arch/arm/boot/dts”目录下。
  • DTC 是指编译设备树源码的工具,一般情况下我们需要手动安装这个编译工具。
  • DTB 是设备树源码编译生成的文件,类似于我们C语言中“.C”文件编译生成“.bin”文件。

二、设备树框架

1.设备树框架

我们可以通过路径imx6ull/bsp/kernel/linux-imx/arch/arm/boot/dts/下可以查看igkboard.dts设备树文件如下:

/dts-v1/;

#include "imx6ull.dtsi"     /*头文件*/

/*设备树根节点*/
/ {
    model = "LingYun IoT System Studio IoT Gateway Board";		/*model属性,用于指定设备的制造商和型号*/
        compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";	/*compatible属性,系统用来决定绑定到设备驱动的关键,用来查找节点的方法之一*/

    	/*根节点的子节点*/
        chosen {
                stdout-path = &uart1;
        };
		
    	/*根节点的子节点*/
        memory@80000000 {
                device_type = "memory";
                reg = <0x80000000 0x20000000>;
        };

    	/*根节点的子节点*/
        reserved-memory {
                #address-cells = <1>;
                #size-cells = <1>;
                ranges;
                 linux,cma {
                        compatible = "shared-dma-pool";
                        reusable;
                        size = <0xa000000>;
                        linux,cma-default;
                };
        };
    
    	/*根节点的子节点*/
    	leds {
                compatible = "gpio-leds";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_gpio_leds>;
                status = "okay";

                sysled {
                        lable = "sysled";
                        gpios = <&gpio4 16 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "heartbeat";
                        default-state = "off";
                };
           };
      /*-------------以下内容省略-------------*/

};

/*设备树节点追加内容*/
/*+--------------+
  | Misc Modules |
  +--------------+*/
/*而是向原有节点追加内容*/
&uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1>;
        status = "okay";
};

&pwm1 { /* backlight */
        #pwm-cells = <2>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm1>;
        status = "okay";
};

&pwm2 {
        #pwm-cells = <2>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm2>;
        status = "okay";
};

我们可见设备文件分三个部分:

  • 头文件,设备树是可以像C语言那样使用“#include”引用“.h”后缀的头文件,也可以引用设备树“.dtsi”后缀的头文件。imx6ull.dtsi由NXP官方提供,是一个imx6ull平台“共用”的设备树文件。
  • 设备树节点,“/ {…};”表示“根节点”,每一个设备树只有一个根节点。不同文件的根节点最终会合并为一个。在根节点内部的“chosen{…}”、memory{…}”、“reserved-memory{…}”、“leds{…}”等字符,都是根节点的子节点。
  • 设备树节点追加内容,子节点比根节点下的子节点多了一个“&”, 这表示该节点在向已经存在的子节点追加数据。本代码中的“&pwm1{…}”、“&uart1{…}”等等追加的目标节点,就是定义在“imx6ul.dtsi”中。imx6ul.dtsi头文件在/arch/arm/boot/dts/imx6ull.dtsi路径下。

设备树由一个根节点和众多子节点组成,子节点也可以继续包含其他节点,也就是子节点的子节点。 设备树的组成很简单,下面我们一起来看看节点的基本格式和节点属性。

2.节点基本格式

设备树节点是一种以树形结构组织的硬件描述文件,描述了嵌入式系统中所有硬件设备的信息,包括设备的类型、地址、中断等信息。设备树节点的基本格式如下:

node-name@address {
  compatible = "compatible-string";
  reg = <address size>;
  interrupt-parent = <&parent-node>;
  interrupts = <irq1 flags1 irq2 flags2 ...>;
  // other properties
};

其中:

  • node-name 是节点的名称,通常与驱动程序中使用的设备名相同;
  • address 是设备的物理地址;
  • compatible-string 表示设备的兼容性信息,通常包含设备的厂商名和设备名;
  • reg 是设备地址的范围;
  • interrupt-parent 是中断控制器节点的引用,表示中断的父节点;
  • interrupts 是中断信息,其中 irqN 是中断号,flagsN 是中断标志,如上升沿触发等;还可以有其他的属性。
  • 节点标签,节点名的简写,当其它位置需要引用时可以使用节点标签来向该节点中追加内容。在imx6ul.dtsi头文件中,节点名“pwm”前面多了个“pwm1”,这个“pwm1”就是我们所说的节点标签。
  • 节点路径,通过指定从根节点到所需节点的完整路径,可以唯一地标识设备树中的节点,“不同层次的设备树节点名字可以相同,同层次的设备树节点要唯一”。类似于我们Windows上的文件,一个路径唯一标识一个文件或文件夹,不同目录下的文件文件名可以相同。
  • 节点属性:节点的“{}”中包含的内容是节点属性,通常情况下一个节点包含多个属性信息, 这些属性信息就是要传递到内核的“板级硬件描述信息”,驱动中会通过一些API函数获取这些信息。

设备树最主要的内容是编写节点的节点属性,通常情况下一个节点代表一个设备。

3.节点部分属性简介

1.compatible属性

compatible属性值由一个或多个字符串组成,有多个字符串时使用“,”分隔开。

设备树中的每一个设备的节点都要有一个compatible属性。系统通过compatible属性决定绑定哪一个设备的设备驱动,是用来查找节点的方法之一,也可以通过节点名或节点路径查找指定节点。

例如系统初始化时会初始化platform总线上的设备时,根据设备节点”compatible”属性和驱动中of_match_table对应的值加载对应的驱动。

2.model属性

model属性用于指定设备的制造商和型号。

3.status属性

状态属性用于指示设备的“操作状态”,通过status可以去禁止设备或者启用设备,默认情况下不设置status属性设备是使能的。

4.#address-cells 和 #size-cells

#size-cells和#address-cells决定了子节点的reg属性中哪些数据是“地址”,哪些数据是“长度”信息。

#address-cells,用于指定子节点reg属性“地址字段”所占的长度(单元格cells的个数)。

#size-cells,用于指定子节点reg属性“大小字段”所占的长度(单元格cells的个数)。

例如#address-cells=2,#address-cells=1,则reg内的数据含义为reg =

, 每个cells是一个32位宽的数字。

5.reg属性

ret属性的书写格式为reg = < cells cells cells cells cells cells…>

reg属性描述设备资源在其父总线定义的地址空间内的地址。通常情况下用于表示一块寄存器的起始地址(偏移地址)和长度, 在特定情况下也有不同的含义。

例如#address-cells = <1>,#address-cells = <1>,reg = <0x9000000 x4000>, 其中0x9000000表示的是地址,0x4000表示的是地址长度,这里的reg属性指定了起始地址为0x9000000,长度为0x4000的一块地址空间。

6.ranges

该属性提供了子节点地址空间和父地址空间的映射(转换)方法,常见格式是 <子地址、父地址、地址长度>。如果父地址空间和子地址空间相同则无需转换。

比如对于#address-cells和#size-cells都为1的话,以ranges=<0x0 0x10 0x20>为例,表示将子地址的从0x0~(0x0 + 0x20)的地址空间映射到父地址的0x10~(0x10 + 0x20)。

7.name和device_type

这两个属性很少用(已经被废弃),不推荐使用。name用于指定节点名,在旧的设备树中它用于确定节点名, 现在我们使用的设备树已经弃用。device_type属性也是一个很少用的属性,只用在CPU和内存的节点上。 如上例中所示,device_type用在了CPU节点。

我们在设备树中添加了一个“led”节点, 正常情况下我们可以从这个节点获取编写led驱动所用到的所有信息,例如led相关控制寄存器地址、 led时钟控制寄存器地址等等。

内核提供了一组函数用于从设备节点获取资源(设备节点中定义的属性)的函数,这些函数以of_开头,称为OF操作函数。


总结

本篇博客主要介绍了设备树(Device Tree)的基本概念和框架。首先,简单介绍了设备树的作用,即为系统中的硬件设备提供描述信息,帮助内核识别和驱动硬件设备。其次,详细介绍了设备树的基本框架,包括节点标签、节点路径和节点属性。其中,节点标签用于表示设备节点的类型和名称,节点路径用于表示设备节点在设备树中的位置,节点属性用于描述设备节点的各种属性信息。最后,针对节点属性,本篇博客简单介绍了一些常见的属性类型和属性值。

总体而言,本篇博客为读者提供了一个基础的设备树入门指南,使读者能够了解设备树的基本概念和框架。读者可在此基础上进一步深入学习设备树,并在实际开发中应用设备树技术。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot 中快速完成文件上传,整合多平台神器

哈喽&#xff0c;大家好~ 又是做好人好事的一天&#xff0c;有个小可爱私下问我有没有好用的springboot文件上传工具&#xff0c;这不巧了嘛&#xff0c;正好我私藏了一个好东西&#xff0c;顺便给小伙伴们也分享一下&#xff0c;demo地址放在文末了。 文件上传在平常不过的一…

最新,有8本SCIE期刊被剔除,4月SCIESSCI期刊目录更新(附最新目录下载)

2023年4月18日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次3月WOS期刊目录更新大变动之后&#xff0c;此次4月更新又有8本SCIE期刊发生变动&#xff0c;其中有4本期刊被剔出SCIE数据库&#xff0c;4本期刊更改了名称和ISSN号。更新后的最新SCIE期刊目录共有9505本…

Flask 与 Django 先学哪个呢

本文把 Flask 和 Django 做一个比对&#xff0c;因为我对这两个 Python Web 框架都有实际的开发经验。希望我可以帮助您选择学习哪个框架&#xff0c;因为学习一个框架可能会非常耗时 —— 当然也很有趣&#xff01; 相似之处 让我们从相似之处开始。 No. 1 Flask 和 Djang…

【ctfshow】命令执行->web29-web44

前言 半夜网抑云听歌听emo了 z 刷会儿题不然睡不着了呜呜呜 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博…

数据结构复习题(包含答案)

第一章 概论 一、选择题 1、研究数据结构就是研究&#xff08; D &#xff09;。 A. 数据的逻辑结构 B. 数据的存储结构 C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作 2、算法分析的两个主要方面是&#xff08; A …

【小技巧】word文档编辑技巧(一)

文章目录 一、显示显示导航显示所有字符 二、格式格式-三级目录格式-文本格式-图格式-表格式-公式格式-参考文献 三、小技巧交叉引用连续交叉引用表/图目录等自动更新分节符设置页眉/页码word转pdf带导航 一、显示 显示导航 开启导航&#xff1a;视图->显示框->导航窗格…

【Python从入门到进阶】16、文件的打开和关闭

接上篇《15、函数的定义和使用》 上一篇我们学习了Python中函数的定义和使用&#xff0c;包括函数的参数、返回值、局部变量和全景变量等操作。从本篇开始我们来开始学习Python对文件的一些操作&#xff0c;本篇我们主要讲解如何使用Python打开和关闭文件。 一、打开/创建文件…

【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

【设计模式】Java 的三种代理模式

文章目录 一、前言二、正文1、静态代理2、动态代理3、Cglib代理Spring中AOP使用代理 三、总结 一、前言 代理(Proxy)模式是一种结构型设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。 这样做的好处是&#xff1a;可以在目标对…

activeMQ持久化报错的问题

activeMQ持久化&#xff0c;启动activeMQ报错&#xff0c; INFO | Using Persistence Adapter: JDBCPersistenceAdapter(org.apache.commons.dbcp2.BasicDataSource5148e82a) jvm 1 | WARN | Could not get JDBC connection: Cannot create PoolableConnectionFactory (Commun…

前端学习:HTML头部、布局

目录 HTML头部 一、HTML 元素 二、head标签和header标签的不同 三、HTML 元素 四、HTML 元素 五、HTML 元素 六、 HTML 七、HTML元素 为搜索引擎定义关键词&#xff1a; 为网页定义描述内容&#xff1a; 每60秒刷新当前页面&#xff1a; 八、HTML 九、HTML头部元素…

【故障检测】基于 KPCA 的故障检测【T2 和 Q 统计指数的可视化】(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

AI语音生成器是下一大安全威胁吗?

ChatGPT一经上市&#xff0c;有关监管人工智能的讨论就开始升温。任何试图遏制这种技术的做法都可能需要国际合作&#xff0c;需要我们在过去几十年来从未见过的合作程度&#xff0c;因此不太可能遏制人工智能。 人工智能是一项功能强大的技术&#xff0c;有望彻底改变我们生活…

Domino自带的JSON校验工具

大家好&#xff0c;才是真的好。 JSON数据在Notes/Domino已经变得非常重要。从Domino 10开始&#xff0c;在LotusScript语言中就加入了对JSON数据处理功能。在管理中&#xff0c;我们知道&#xff0c;从Domino 12版本开始就支持Domino自动化配置&#xff0c;也是使用JSON数据作…

C++ 简介

C 完全支持面向对象的程序设计&#xff0c;包括面向对象开发的四大特性&#xff1a; 封装&#xff08;Encapsulation&#xff09;&#xff1a;封装是将数据和方法组合在一起&#xff0c;对外部隐藏实现细节&#xff0c;只公开对外提供的接口。这样可以提高安全性、可靠性和灵活…

第一个机器学习应用:鸢尾花分类

目录 1. 特征数据与标签数据 2. 训练数据与测试数据 3. 构建模型机器学习模型 4. 预测与评估 4.1 预测 4.2 评估 5. 学习小结 准备&#xff1a;采用Scikit- learn中鸢尾花数据集&#xff0c;完成一个简单的机器学习应用&#xff0c;构建第一个机器学习模型。 已知&…

leetcode 879. Profitable Schemes(有利润的计划)

有几个工程&#xff0c;每个工程需要group[ i ]个人去做&#xff0c;做完了可以得到profit[ i ]的利润。 现有2个限制条件&#xff1a; 人数上限是n, 且参加了一个工程的人不能再参加其他工程。 利润下限minProfit, 至少要获得minProfit的利润。 问有多少种工程的选法&#xff…

XHR 和 AJAX 的结合 - API 测试

大家好&#xff0c;之前一期介绍了怎样通过工具类进行对API 接口测试&#xff0c;这一期将演示如何手写一个 Ajax的请求。 什么是 XHR ? 全称为 XMLHttpRequest &#xff0c;它是浏览器内置的对象&#xff0c;使得 JavaScript 可以发送 HTTP 请求。 什么是Ajax ? Ajax是一种用…

monocle3轨迹分析

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> monocle3与PAGA有点类似&#xff0c;在UMAP图上显示轨迹图&#xff0c;没有了树状的结构。 原理、图的理解&#xff0c;可以参考Reference中的链接 安装 ubuntu sudo apt install libudunits2-dev libgdal-dev R spee…

Python 基础(十):元组

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、声明元组二、访问元组三、修改元组变量四、遍历元组五、切片六、常用函数和方法6.…