【linux-imx6ull-设备树点灯】

目录

  • 1. 设备树简介
    • 1.1 编译-引用
    • 1.2 设备树文件结构
    • 1.3 设备树节点介绍
      • 1.3.1 特殊节点chosen
    • 1.4 节点内容追加
  • 2. 设备树常用OF操作函数
    • 2.1 节点寻找类
    • 2.2 属性提取类
    • 2.3 其它常用类
  • 4. 设备树下LED实验
    • 4.1 实验简介
    • 4.2 添加LED设备节点
    • 4.3 获取设备节点并提取属性
      • 4.3.1 获取设备节点
      • 4.3.2 提取设备节点属性
    • 4.4 节点属性使用-总结

1. 设备树简介

  设备树可以理解为一种硬件数据结构,只不过这种数据结构中描述了板子和外设的信息,例如CPU 数量、内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等;
  设备树将描述板级硬件信息的内容从 Linux 内核中分离开来,用一个专属的文件格式来描述,文件扩展名为.dts,设备树的主要功能是按照特定的结构来描述板子上的设备信息,它的出现是为了解决在没有设备树时,Linux 通过大量的arch/arm/mach-xxx 和 arch/arm/plat-xxx 文件夹来描述对应平台的板机信息,导致 Linux 内核虚胖的问题。

1.1 编译-引用

  设备树的编译流程,对于C语言我们使用GCC就能把mx.c -> mx.o,同理对于设备树而言我们使用的是DTC的编译工具把mx.dts -> mx.dtb,作为理解就行;
  语法简介,对于dtc而言有自己的一套语法,但是比较简单,对于.dts文件同样支持头文件的扩展,对于C语言而言我们添加头文件是<mx.h>后缀是h文件,对于设备树我们添加的是<mx.dtsi>后缀是dtsi文件;但是我们也可以来引用.h、.dtsi 和.dts 文件,只是,我们在编写设备树头文件的时候最好选择.dtsi 后缀。DTS 语法非常的人性化,是一种 ASCII文本文件,不管是阅读还是修改都很方便;

1.2 设备树文件结构

  对于一个设备树文件而言,其结构也是层级结构,其中根目录为/,如下:不过我们这里称为节点,也就是有父节点,父节点下面有子节点,子节点下面有子子节点等等;


1.3 设备树节点介绍

  我们已经知道对于设备树而言是由一个个节点组成,你把这个节点放在几级目录,那么这个节点就是几级节点,因此下面对一个节点进行一个简要的说明:要注意的就是#address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性 都是和地址有关的内容,整体结构就是这样,其它的节点中的属性就不再一一介绍;


1.3.1 特殊节点chosen

   uboot 中的 fdt_chosen 函数在设备树的 chosen 节点中加入了 bootargs属性,并且还设置了 bootargs 属性值,在设备树中就是chose的属性:图中框起来的部分就是函数do_bootm_linux函数的执行流程,也就是说do_bootm_linux函数会通过一系列复杂的调用,最终通过fdt_chosen 函数在chosen 节点中加入了 bootargs 属性,而我们通过 bootz 命令启动 Linux 内核的时候会运行do_bootm_linux 函数;


   Linux 内核在启动的时候会解析 DTB 文件,然后在/proc/device-tree 目录下生成相应的设备树节点文件,接下来我们简单分析一下 Linux 内核是如何解析 DTB 文件的,流程如图 所示:


1.4 节点内容追加

  产品开发过程中可能面临着频繁的需求更改,比如第一版硬件上有一个 IIC 接口的六轴芯片 MPU6050,第二版硬件又要把这个 MPU6050 更换为 MPU9250 等。一旦硬件修改了,我们就要同步的修改设备树文件,毕竟设备树是描述板子硬件信息的文件。因此这里例如向iic中追加两个设备节点:对于imx6ull.dtsi文件中iic的节点中的内容很少,如下:


  现在进行追加,追加符是&+标签/节点名字;如下在我们的设备书文件imx6ull-14x14-evk.dts中对iic进行追加,我们这个文件已经引入了imx6ull.dtsi头文件:


2. 设备树常用OF操作函数

  对于设备树而言已经介绍了其结构,节点,属性,但是我们如何把节点中的属性给提取出来呢?例如我们在reg属性中有:reg=<0x454145512 0x04 0x4597911651 0x04>,我们如何把reg中的属性给提取出来呢?我们可以使用OF操作函数,具体而言有下列比较重要的部分:具体的用法用多了就熟练了;

2.1 节点寻找类

 1. 寻找节点类的常用如下:(待补充)

  • static inline struct device_node *of_find_node_by_path(const char *path):
  • struct device_node *of_get_parent(const struct device_node *node):
  • struct device_node *of_get_next_child(const struct device_node *node,struct device_node *prev):

2.2 属性提取类

 2. 提取属性的的常用如下:(待补充)

  • static inline int of_property_read_string(struct device_node *np,const char *propname,const char **out_string):
  • static inline int of_property_read_u32_array(const struct device_node *np,const char *propname,u32 *out_values, size_t sz):
  • int of_property_read_u32(const struct device_node *np,const char *propname,u32 *out_value)
  • int of_n_addr_cells(struct device_node *np)
  • int of_n_size_cells(struct device_node *np)

2.3 其它常用类

 3. 其它的常用如下:(待补充)

  • int of_device_is_compatible(const struct device_node *device,const char *compat)
  • onst __be32 *of_get_address(struct device_node *dev,int index,u64 *size,unsigned int *flags):主要是reg或assigned-addresses属性;
  • u64 of_translate_address(struct device_node *dev,const __be32 *in_addr):
  • int of_address_to_resource(struct device_node *dev,int index,struct resource *r):
  • void __iomem *of_iomap(struct device_node *np,int index):限定reg属性

4. 设备树下LED实验

4.1 实验简介

  我们回顾一下我们几次点灯实验:

  1. 第一次点亮LED实验。我们通过裸机进行操控寄存器进行LED灯的点亮:在裸机下进行LED点灯本质上和单片机开发差不多,是在寄存器层面进行操控,相当于把IMX6ULL当成了一个性能更强的单片机;
  2. 第二次点亮LED实验。linux内核下不用设备树对LED进行点亮,而且我们使用的手动对设备号进行分配,并在Linux系统上手动对驱动节点进行挂载;到这里我们以及慢慢的离开了底层的裸机开发,我们用上了操作系统,也就是给IMX6ULL装上了系统,因此我们在这里引入了内核态和用户态的概念,我们在Linux系统上对LED操控本质归根到底还是要操控寄存器,但是我们在系统上不能直接操控寄存器,而是通过寄存器映射的方式把实际的物理地址映射成虚拟的地址,然后我们对虚拟的寄存器进行操控,以实现在系统层面对LED进行驱动点亮;
  3. 第三次点亮LED实验。我们在第二次点亮实验中已经在系统层面对LED进行了驱动实验,但是缺点还是有的,就是需要我们手动进行设备号的分配以及需要我我们手动对驱动节点的创建,也就是要用到mknod命令,这显然是对用户是不友好的,因此我们在第三次实验中重点是完善了LED的驱动框架,也就是对于LED的驱动,完成了自动对设备号的分配以及自动对设备节点的创建,其流程是常用的驱动框架,不过缺点也有,这种开发驱动的模式是linux系统没有引入设备树之前常用的开发模式,但是对于引入设备树后,这种驱动开发模式就逐渐被抛弃了;
  4. 第四次点亮LED实验 。第四次LED点亮实验是在第三次的基础上引入了设备树,也就是本次的设备树下LED驱动点亮实验:因此这次驱动实验目的就是如何在引入设备树下的情况对LED驱动进行开发:从这几次的点灯实验中我们也可以看到程序也是越来越复杂,但是这种复杂性是必要的,对于大型复杂的程序,这反而是一种更加高效的方式;
  5. 当然后续还会有引入pinctrl和gpio子系统进行点灯,以及通过软件定时器进行点灯

4.2 添加LED设备节点

  由于本次点灯实验是在第三次的基础上引入了设备树,因此这节内容主要是记录设备树的引入相关的细节,对于框架搭建和第三次驱动的实验参考我的下面两个连接:
  1.简单驱动框架搭建:连接
  2.完善的驱动框架(未引入设备树):连接
  前面对设备树进行了结构,节点,属性进行简要分析,同时也介绍了一些常用的OF函数,我们要想在驱动中引入设备树,第一件事就是想dts设备树文件中添加我们的LED设备,添加如下:


  添加完毕后.进行make dtbs编译,编译完毕后挂载到板子上,然后在/proc/device-tree/目录中查看是否有“alphaled”这个节点;

4.3 获取设备节点并提取属性

4.3.1 获取设备节点

  当我们成功的在设备树中添加了设备节点,我们就可以在驱动文件中对我们添加的节点进行获取,获取的方式就是利用我们上面所说的OF常用的函数,如下:


4.3.2 提取设备节点属性

  当获取设备节点后就是对节点中的属性进行提取;


4.4 节点属性使用-总结

  我们可以这样认为,我们本质上就是操控寄存器进行LED的控制,只不过我们要操控寄存器就要获取寄存器的地址,当我们不引入设备树时我们直接可以进行地址映射然后进行操控虚拟寄存器,但是当我们引入设备树后,我们就无法直接获取寄存器的地址,因为寄存器的地址被我们写在了设备树中,因此我们想进行虚拟地址的映射我们就必须先获取设备树中LED节点的寄存器节点信息,如果我直接宏定义的话,设备树的引入就没有意义了,当然对于点灯的实验而言是多此一举,但是对以后的学习是必要的;

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

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

相关文章

深度学习-05-反向传播理论知识

深度学习-05-反向传播理论知识 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xf…

关系数据库设计规范化

文章目录 基础知识规范化1NF&#xff08;第一范式&#xff09;2NF&#xff08;第二范式&#xff09;3NF&#xff08;第三范式&#xff09;BCNF&#xff08;Boyce Codd Normal Form&#xff0c;巴克斯范式&#xff09;4NF&#xff08;第四范式&#xff09; 模式分解总结 基础知识…

java面试题及答案2024,java2024最新面试题及答案(之一)

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ 本套Java面试题大全&#xff0c;全的不能再全&#xff0c;哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Ja…

03_03_初识SpringAOP和应用

一、SpringAOP的初识与原理 1、概述 AOP&#xff1a;面向切面编程OOP&#xff1a;面向对象编程面相切面编程&#xff1a;是基于OOP基础之上的新编程思想&#xff0c;OOP面向的主要是对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;它在处理日志、安全管理、事务管…

D365 Project Operations

目录 D365包含哪些模块&#xff1f; D365 Project Operations是什么&#xff1f; D365 Project Operations优势 D365 Project Operations部署方案 总结 D365包含哪些模块&#xff1f; 微软的D365是一套功能强大的企业管理解决方案&#xff0c;其中包含了多种模块&#xff…

结账和反结账

结账与反结账功能在财务软件和会计系统中扮演着重要的角色&#xff0c;以下是关于这两个功能的详细解释&#xff1a; 一、结账功能 结账功能是计算和结转各个会计科目本期发生额和期末余额的过程&#xff0c;同时标志着一定时期内财务活动的结束和财务数据的固化。结账功能的…

深入React Hoooks:从基础到自定义 Hooks

使用 useContext useContext 是另一个常用的 Hook&#xff0c;它可让我们在函数组件中轻松访问 React 的 context。如果你的应用程序依赖于一些全局状态&#xff0c;或者你希望避免将 props 一层一层地传递到子组件&#xff0c;context 很有用。你可以在父组件设置一个值&…

C语言 链表经典OJ题

链表经典OJ题 移除链表元素链表的中间节点反转链表合并两个有序链表分割链表 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head […

mysql5.7血泪史

因为工作需要&#xff0c;需要将mysql8.0.33版本切换为mysql5.7系列。 在这个过程当中&#xff0c;首先我将mysql8卸载干净。 mysql彻底卸载干净的5个步骤&#xff0c;超多图超详细保姆级教程最新教程新手小白轻松上手_卸载mysql-CSDN博客 然后发现mysql5.7在官网上下载很…

python小练习03

1.绘制奥运五环旗 #奥运五环的绘制 import turtle as t t.pensize(3) t.speed(0) def draw_circles():i0while i <4:args [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个…

lua vm 二: 查看字节码、看懂字节码

本文讲一讲如何查看 lua 的字节码&#xff08;bytecode&#xff09;&#xff0c;以及如何看懂字节码。 以下分析基于 lua-5.4.6&#xff0c;下载地址&#xff1a;https://lua.org/ftp/ 。 1. 查看字节码 1.1 方法一&#xff1a;使用 luac luac 是 lua 自带的编译程序&#x…

CF Round 368 (Div. 2) C. Pythagorean Triples【数学 构造】

Codeforces Round 368 (Div. 2) C. Pythagorean Triples 题意&#xff1a; 给你一个整数n&#xff0c;让你构造另两个整数满足三角形的勾股定理。 思路&#xff1a; 首先&#xff0c;n < 2无解 由题意得&#xff1a;a^2 b^2 c^2&#xff1b;不妨设n a&#xff0c;则…

【AIGC半月报】AIGC大模型启元:2024.06(上)

AIGC大模型启元&#xff1a;2024.06&#xff08;上&#xff09; (1) ChatTTS&#xff08;语音合成项目&#xff09; (1) ChatTTS&#xff08;语音合成项目&#xff09; 2024.06.01 ChatTTS 文本转语音项目爆火出圈&#xff0c;引来大家极大的关注。短短三天时间&#xff0c;在…

MySQL(三) - 基础操作

一、索引 由于我们在使用数据库的时候&#xff0c;大部分操作的都是查询操作&#xff0c;但是我们每一次进行查询都需要遍历一遍表中所有数据&#xff0c;这会花费O(n)的时间&#xff0c;因此数据引入了“索引” 也就是在底层使用了数据结构来进行优化查询的操作&#xff0c;但…

【TB作品】MSP430F149单片机,广告牌,滚动显示

LCD1602滚动显示切换播放暂停字符串 显示Public Places 显示No Smoking 播放 暂停 部分代码 char zifu1[] "Public Places "; char zifu2[] "Class Now "; char zifu3[] "No admittance "; char *zifu[] { zifu1, zifu2, zifu3 }…

优思学院|客户质量工程师CQE岗位的未来发展,你怎么看?

在现代工业的发展背景下&#xff0c;客户质量工程师&#xff08;CQE&#xff09;正逐渐成为企业质量管理体系中的关键角色。随着全球化和数字化的不断推进&#xff0c;CQE的职责不仅限于传统的质量控制&#xff0c;更包括了质量管理体系的设计和优化、客户关系的管理、以及在整…

Flutter 中的 ToggleButtonsTheme 小部件:全面指南

Flutter 中的 ToggleButtonsTheme 小部件&#xff1a;全面指南 Flutter&#xff0c;作为由 Google 开发的跨平台 UI 框架&#xff0c;为开发者提供了丰富的组件来构建现代化的应用程序。ToggleButtons 是 Material Design 组件库中的一个组件&#xff0c;它允许用户从一组选项…

AI的绘画工具有哪些?

AI绘画工具利用人工智能技术帮助用户生成艺术作品或进行图像编辑&#xff0c;以下是一些AI绘画工具的列表&#xff1a; 1. 腾讯智影AI绘画&#xff1a;提供在线智能绘画工具&#xff0c;用户可以通过输入关键词和选择不同的效果预设来生成艺术作品。 2. Stylar&#xff1a;一…

【UML用户指南】-06-面向对象建模-关系(relationship)

目录 1、面向对象建模常见的关系 2、关系的组成元素 3、依赖关系 4、泛化关系 5、关联关系 关联的四种修饰 1.名称 2.角色 3.多重性 4.聚合 6、常用建模技术 6.1、对简单依赖建模 6.2、对单继承建模 6.3、对结构关系建模 1、面向对象建模常见的关系 依赖 &#x…

遍历数组1

package demo; import java.util.ArrayList; public class Arrilist { public static void main(String[] args) { ArrayList<String>listnew ArrayList<>(); list.add("汤神"); list.add("yyx"); list.add("hong go…