【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…

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;它在处理日志、安全管理、事务管…

结账和反结账

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

C语言 链表经典OJ题

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

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…

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;更包括了质量管理体系的设计和优化、客户关系的管理、以及在整…

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

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

pyqt绘制各种直线

pyqt绘制各种直线 介绍效果代码 介绍 使用pyqt绘制各种直线 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QPen, QPainterPath, QColor, QBrush from PyQt5.QtCore import Qt, QPoint, QLineF, QPointFclass…

JVM 指针压缩

运用java内存对齐填充&#xff0c;对java内存进行8字节划分&#xff0c;java对象指针映射到每个划分区域上&#xff0c;使得4个字节&#xff08;32位&#xff09;表示2^32个地址&#xff0c;从而使4个字节指针映射32G内存空间。 1.为什么进行指针压缩&#xff1a; jvm从32位变…

【全开源】Java代驾小程序APP代驾跑腿源码微信小程序代驾源码

&#x1f697;代驾小程序&#xff1a;便捷、安全的出行新选择 一、引言&#xff1a;出行新风尚 在如今繁忙的都市生活中&#xff0c;出行问题一直是人们关注的焦点。代驾小程序的出现&#xff0c;为我们提供了一种便捷、安全的出行新选择。无论是酒后不能驾车&#xff0c;还是…

牛客网刷题 | BC116 [NOIP2013]记数问题

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 试计算在区间1 到n…

LeetCode:环形链表II

文章收录于LeetCode专栏 LeetCode地址 环形链表II 题目 给定一个链表&#xff0c;返回链表开始入环的第一个节点。如果链表无环&#xff0c;则返回null。   为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0开始&#…

安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案

未成年人被誉为祖国的花朵&#xff0c;是我们国家的未来。然而&#xff0c;最近频繁曝出的未成年霸凌事件却引发了社会的广泛关注。这些事件手段残忍&#xff0c;事态恶劣&#xff0c;引发了全社会对如何保护未成年身心健康、规避霸凌事件发生的深刻思考。 为了更好地保障学生的…

使用软件分享--剪映(不需要会员版)剪映 Jianying_pro_3_2_0_8778_beta9_jianyingpro_beta(Windows)

专栏介绍&#xff1a;本专栏主要分享一些实用的软件&#xff08;Po Jie版&#xff09;&#xff1b; 声明1&#xff1a;软件不保证时效性&#xff1b;只能保证在写本文时&#xff0c;该软件是可用的&#xff1b;不保证后续时间该软件能一直正常运行&#xff1b;不保证没有bug&am…

深度学习-06-手动进行反向传播

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

【网关】工业智能网关-02

一 公司简介 保定飞凌嵌入式技术有限公司始于2006年&#xff0c;是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业&#xff0c;是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累&#xff0c;公司拥有业内一流的软硬件研发团队&#xff0c;在北京…