Linux学习第14天:Linux设备树(一):枝繁叶茂见晴天

news2024/12/23 11:53:30

        本节笔记主要学习了Linux设备树相关知识点,由于内容较多,打算分两天进行总结。今天着重学习Linux设备树,主要包括前三节内容,分别是概念、格式和语法。

        本节思维导图内容如下:

c3f29209f2674e23a7ff70e912e5de3d.png

一、什么是设备树

        设备树可以用一个图来进行表示,如下:

        树的主干就是系统总线, IIC 控制器、 GPIO 控制器、 SPI 控制器等都是接
到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种,其中 IIC1 上接了 FT5206 和 AT24C02
这两个 IIC 设备, IIC2 上只接了 MPU6050 这个设备。 DTS 文件的主要功能就是按照图 43.1.1
所示的结构来描述板子上的设备信息。
        

        将这些描述板级硬件信息的内容都从 Linux 内中分离开来,用一个专属的文件格式来描述,这个专属的文
件就叫做设备树,文件扩展名为.dts。

        这个通用文件就是.dtsi 文件,类似于 C 语言中的头文件。

        一般.dts 描述板级信息(也就是开发板上有哪些 IIC 设备、 SPI 设备等), .dtsi 描述 SOC 级信息(也就是 SOC 有
几个 CPU、主频是多少、各个外设控制器信息等)。


二、DTS、DTB和DTC

        DTS 是设备树源码文件, DTB 是将DTS 编译以后得到的二进制文件。

        将.c 文件编译为.o 需要用到 gcc 编译器;将.dts 编译为.dtb需要用到 DTC工具。

        如果要编译DTS文件,只需要在Linux源码根目录下,输入指令make all或 make dtbs.

        当选中 I.MX6ULL 这个 SOC 以后(CONFIG_SOC_IMX6ULL=y),所有使用到I.MX6ULL 这个 SOC 的板子对应的.dts 文件都会被编译为.dtb。


三、DTS语法

1.dtsi头文件

        设备树的头文件扩展名为.dtsi。在 imx6ull-alientekemmc.dts 中有如下所示内容:

12 #include <dt-bindings/input/input.h>
13 #include "imx6ull.dtsi"

        在.dts 设备树文件中,可以通过“ #include”来引用.h、 .dtsi 和.dts 文件。我们在编写设备树头文件的时候最好选择.dtsi 后
缀。
        一般.dtsi 文件用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范围,比如 UART、 IIC 等等。比如 imx6ull.dtsi 就是描述 I.MX6ULL 这颗 SOC 内部外设情况信息的,内容如下:

2.设备节点

        设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。以下是从imx6ull.dtsi 文件中缩减出来的设备树文件内容:

1 / {
2 aliases {
3 can0 = &flexcan1;
4 };
5
6 cpus {
7 #address-cells = <1>;
8 #size-cells = <0>;
9
10 cpu0: cpu@0 {
11 compatible = "arm,cortex-a7";
12 device_type = "cpu";
13 reg = <0>;
14 };
15 };
16
17 intc: interrupt-controller@00a01000 {
18 compatible = "arm,cortex-a7-gic";
19 #interrupt-cells = <3>;
20 interrupt-controller;
21 reg = <0x00a01000 0x1000>,
22 <0x00a02000 0x100>;
23 };
24 }

        在设备树中节点命名格式如下:

node-name@unit-address

“ node-name”是节点名字。

“ unit-address”一般表示设备的地址或寄存器首地址,如果某个节点没有地址或者寄存器的话“ unit-address”可以不要,
        另外一种格式如下:

label: node-name@unit-address

        可以直接通过&label 来访问这个节点。

        每个节点都有不同属性,不同的属性又有不同的内容,属性都是键值对,值可以为空或任意的字节流。设备树源码中常用的几种数据形式有字符串、32位无符号数、字符串列表【字符串和字符串之间采用“ ,”隔开】。

3.标准属性

1)、compatible属性

        compatible 属性也叫做“兼容性”属性,字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:
       "manufacturer,model"

其中,manufacturer是厂家,model是模块对应的驱动名字。

       设备首先使用第一个兼容值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查。

        一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动。


2)、model属性

        model 属性描述设备模块信息。

3)、status属性

        status 属性看名字就知道是和设备状态有关的,如下:

值 描述
“ okay” 表明设备是可操作的。
“disabled”   表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具 体含义还要看设备的绑定文档。
“ fail”   表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
“ fail-sss” 含义和“ fail”相同,后面的 sss 部分是检测到的错误内容。

                    

4)、#address_cells和#size_cells属性

        用于描述子节点的地址信息。一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度,reg 属性的格式一为:
reg = <address1 length1 address2 length2 address3 length3……>
        每个“ address length”组合表示一个地址范围,其中 address 是起始地址, length 是地址长度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用的字长。

5)、reg属性    

        reg 属性的值一般是(address, length)对。 reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。


6)、range属性

        ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:
child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。
length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。
如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。

        对于I.MX6ULL 来说,子地址空间和父地址空间完全相同,因此会在 imx6ull.dtsi中找到大量的值为空的 ranges 属性,如下所示:

137 soc {
138 #address-cells = <1>;
139 #size-cells = <1>;
140 compatible = "simple-bus";
141 interrupt-parent = <&gpc>;
142 ranges;
......
1177 }

        不为空的实例代码为:

1 soc {
2 compatible = "simple-bus";
3 #address-cells = <1>;
4 #size-cells = <1>;
5 ranges = <0x0 0xe0000000 0x00100000>;
6
7 serial {
8 device_type = "serial";
9 compatible = "ns16550";
10 reg = <0x4600 0x100>;
11 clock-frequency = <0>;
12 interrupts = <0xA 0x8>;
13 interrupt-parent = <&ipic>;
14 };
15 };

        第 5 行,节点 soc 定义的 ranges 属性,值为<0x0 0xe0000000 0x00100000>,此属性值指定了一个 1024KB(0x00100000)的地址范围,子地址空间的物理起始地址为 0x0,父地址空间的物
理起始地址为 0xe0000000。

        第 10 行, serial 是串口设备节点, reg 属性定义了 serial 设备寄存器的起始地址为0x4600,寄存器长度为 0x100。经过地址转换, serial 设备可以从 0xe0004600 开始进行读写操作,0xe0004600=0x4600+0xe0000000。

7)、name属性

        已经弃用。

8)、device_type属性

        用于描述设备的 FCode,也已经弃用。

4.根节点compatible属性

        imx6ull-alientek-emmc.dts 文件中根节点的 compatible 属性内容如下所示:

14 / {
15 model = "Freescale i.MX6 ULL 14x14 EVK Board";
16 compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
......
148 }

        通过根节点的 compatible 属性可以知道我们所使用的设备,一般第一个值描述了所使用的硬件设备名字,比如这里使用的是“ imx6ull-14x14-evk”这个设备,第二个值描述了设备所使用的SOC,比如这里使用的是“ imx6ull”这颗 SOC。 Linux 内核会通过根节点的 compoatible 属性查看是否支持此设备,如果支持的话设备就会启动 Linux 内核。

1)、使用设备树之前设备匹配方法

        machine id进行比对匹配。


2)、使用设备树之后设备匹配方法

        用下图可以清晰的标识Linux内核通过根节点compatible属性找到对应设备的函数调用过程。

5.向节点追加或修改内容

        开发板使用的设备树文件为 imx6ull-alientek-emmc.dts,因此我们需要在imx6ull-alientek-emmc.dts 文件中完成数据追加的内容,方式如下:

1 &i2c1 {
2 /* 要追加或修改的内容 */
3 };

        打开 imx6ull-alientek-emmc.dts,找到如下所示内容:

224 &i2c1 {
225 clock-frequency = <100000>;
226 pinctrl-names = "default";
227 pinctrl-0 = <&pinctrl_i2c1>;
228 status = "okay";
229
230 mag3110@0e {
231 compatible = "fsl,mag3110";
232 reg = <0x0e>;
233 position = <2>;
234 };
235
236 fxls8471@1e {
237 compatible = "fsl,fxls8471";
238 reg = <0x1e>;
239 position = <0>;
240 interrupt-parent = <&gpio5>;
241 interrupts = <0 8>;
242 };

        向节点追加或修改内容,重点就是通过&label 来访问节点,然后直接在里面编写要追加或者修改的内容。

四、总结

        本笔记主要学习了Linux设备树最基本的概念,主要学习了设备树的概念,DTS、DTB和DTC的区别以及设备树相关的语法知识。


Linux版本号4.1.15   芯片I.MX6ULL

本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

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

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

相关文章

HJ61 放苹果

题目&#xff1a; HJ61 放苹果 题解&#xff1a;递归 f(m,n)表示将m个苹果放在n个盘子中所有的放法。 当n > m时&#xff0c;一定有盘子空着&#xff0c;等效于将m个苹果放到m个盘子中&#xff0c;即f(m,n) f(m,m)当 n < m时&#xff0c; 没有空盘子&#xff0c;那么…

LinkedList 源码分析

LinkedList 是一个基于双向链表实现的集合类。 LinkedList 插入和删除元素的时间复杂度 头部插入/删除&#xff1a;只需要修改头结点的指针即可完成插入/删除操作&#xff0c;因此时间复杂度为 O(1)。尾部插入/删除&#xff1a;只需要修改尾结点的指针即可完成插入/删除操作…

【玩玩Vue】通过vue-store实现枚举管理,用于下拉选项和中英文翻译等

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、store基础用法1.在src下新建store文件夹&#xff0c;在store下新建module文件夹2.在module下新建enums.js文件3.在store下新建getters.js…

Mybatis学习笔记3 在Web中应用Mybatis

Mybatis学习笔记2 增删改查及核心配置文件详解_biubiubiu0706的博客-CSDN博客 技术栈:HTMLServletMybatis 学习目标: 掌握mybatis在web应用中如何使用 Mybatis三大对对象的作用域和生命周期 关于Mybatis中三大对象的作用域和生命周期、 官网说明 ThreadLocal原理及使用 巩…

【古诗文网登录】

文章目录 古诗文网简介python登录 古诗文网简介 古诗文网登录界面 模拟登录两大难点 __VIEWSTATE、__VIEWSTATEGENERATOR两个动态参数验证码 python登录 1、解析登录界面&#xff0c;获取__VIEWSTATE、__VIEWSTATEGENERATOR参数2、获取登陆界面验证码图片&#xff0c;输入…

爬虫 — 自动化爬虫 Selenium

目录 一、介绍二、对比三、安装四、简单使用五、定位元素1、By.ID2、By.CLASS_NAME3、By.NAME4、By.TAG_NAM5、By.XPATH 六、操作元素1、在输入框输入内容并搜索2、打开网站搜索音乐并播放 七、Cookie 操作1、获取所有的 Cookie2、根据 Cookie 的 name 获取 Cookie3、删除某个 …

《低代码指南》——低代码+AI,驱动企业数字资产保值增值

各位嘉宾,大家上午好!非常荣幸能借助钛媒体数字价值峰会这个平台跟大家交流。 了解奥哲的朋友知道,奥哲是国内第一家官宣聚焦低代码领域,并且以低代码定位获得融资的数字化企业。 过去两三年,低代码得到了飞速发展,我在此想跟各位分享下我们在过去实践过程中的一些发现,…

Java“牵手”速卖通商品列表页数据采集+速卖通商品价格数据排序,速卖通API接口申请指南

速卖通是阿里巴巴旗下的面向国际市场打造的跨境电商平台&#xff0c;被称为国际版淘宝&#xff0c;速卖通面向海外买家客户&#xff0c;通过支付宝国际账户进行担保交易&#xff0c;并使用国际物流渠道运输发货&#xff0c;是全球第三大英文在线购物网站。 速卖通商品列表数据…

【资源监视器】设备占用,强制弹出移动硬盘

设备占用&#xff0c;强制弹出移动硬盘 任务管理器中找到资源监视器 资源监视器&#xff1a;找到CPU 输入磁盘&#xff1a;如H: , 点击旁边的刷新 结束句柄 右键

CorelDRAW 2023怎么把图片转化为手绘素描风 简单几步轻松搞定

CorelDRAW 2023是一款非常好用的设计类软件&#xff0c;软件拥有非常多强大又好用的功能&#xff0c;可以帮助设计师快速创造出想要的效果&#xff0c;今天我们就来给大家介绍一下CDR的“素描”艺术笔触。它可以帮助用户快速将普通的图片快速转换成类似素描的风格&#xff0c;在…

AMD GPU 内核驱动分析(二)-gpu_sched

AMDGPU驱动模块的依赖关系如下图,gpu_sched.ko位于GPU驱动架构的中间层&#xff0c;主要负责对应用发送下来的渲染和计算等命令进行调度&#xff1a; 编译gpu_sched.ko 模块源码位于linux-x.x.xx/drivers/gpu/drm/scheduler下&#xff0c;通过CONFIG_DRM_SCHED项配置编译。从M…

更新至2021年,互联网相关指标数据

更新至2021年&#xff0c;互联网相关指标数据 1、来源&#xff1a;国家统计J和各省NJ 2、指标&#xff1a;域名数、网站数、网页数、互联网宽带接入端口、互联网宽带接入用户、城市宽带接入用户、移动互联网用户、移动互联网接入流量、联网上网人数 3、范围&#xff1a;31省…

四、日志编写 —— TinyWebServer

日志编写 —— TinyWebServer 一、 前言 上期已经写完lock类的编写。这期是日志的编写。 对于日志需要弄懂几个基本概念才可以更好的理解和编写日志。 什么是日志&#xff1f;常用的日志级别有哪些&#xff1f;日志的基本格式是什么&#xff1f;异步日志类刷新缓冲区的作用同…

虚幻4学习笔记(12)操控导入的角色、动画蓝图、播放蒙太奇和打包、角色重定向

虚幻4学习笔记 操控导入的角色设置鼠标旋转关掉动态模糊 动画蓝图、播放蒙太奇和打包角色走路奔跑动画shift 奔跑F 跳舞移动打断 跳舞 打包角色重定向姿势调整解决跑步 腿分太开隐藏剑 B站UP谌嘉诚课程&#xff1a;https://www.bilibili.com/video/BV164411Y732 操控导入的角色…

FreeSWITCH 1.10.10 简单图形化界面10 - 鼎兴FXO网关SIP注册公网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面10 - 鼎兴FXO网关SIP注册公网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关呼叫路由&#xff08;呼入及…

Eclipse搭建struts2框架

新建动态web项目&#xff1b; 输入项目名称&#xff1b; New Runtime后选择如下&#xff0c; 选择tomcat的安装目录&#xff1b; 然后如下&#xff0c;完成&#xff1b; 当前的目录结构如下&#xff1b;之前要配置好java环境&#xff1b; 如果创建项目时没有选中生成web.xml&am…

人工智能学习1

文章目录 人工智能人工智能的诞生人工智能的发展历程人工智能与机器学习的关系 机器学习机器学习的发展历程讨论机器学习的必要性机器学习的定义机器学习的三要素机器学习的基本概念作业 人工智能 人工智能的诞生 人工智能诞生于一群科学家想使用机器模拟人类思维或者人类智能…

黑马JVM总结(十二)

&#xff08;1&#xff09;五种引用_强软弱 实线箭头表示强引用&#xff0c;虚心线表示软弱虚终结器引用 在平时我们用的引用&#xff0c;基本都为强引用 &#xff0c;比如说创建一个对象通过运算符赋值给了一个变量&#xff0c;那么这个变量呢就强引用了刚刚的对象 强引用的…

Linux 磁盘挂载 磁盘卸载

挂载&#xff1a; 虚拟机中本来是没有光盘&#xff0c;但是有复刻的镜像文件&#xff0c;不影响我们挂载&#xff0c;当我们将镜像设备挂载到固定的目录下后&#xff0c;我们就可以通过访问目录&#xff0c;来查看镜像文件中的内容。 1. 创建挂载点&#xff1a; 一般虚拟设备上…

Java进化史:从Java 8到Java 17的语言特性全解析

文章目录 Java 8&#xff1a;引入Lambda表达式和Stream APILambda表达式Stream API Java 9&#xff1a;模块化系统模块Jigsaw项目 Java 10&#xff1a;局部变量类型推断Java 11&#xff1a;引入HTTP客户端HTTP客户端 Java 12&#xff1a;引入Switch表达式Switch表达式 Java 13到…