[Linux_IMX6ULL驱动开发]-设备树简述

目录

设备树的引入

设备树具体框架

设备树的属性

label

address-cells和size-cells

compatible

model

status

reg

设备树的编译

内核对设备树的处理

plateform_device如何对应plateform_driver


设备树的引入

之前已经学习了解过了总线驱动模型的概念,也就是驱动的分层思想。上层驱动负责应用层调用的实现,下层驱动则包括两个文件,一个是设备资源文件,另一个则是驱动文件。一个驱动文件可能会存在对应多种设备资源文件的情况,而设备资源文件又存在很多,这造成了Linux内核十分的臃肿,对此,引入设备树来解决这个问题。

可以把所有需要用到的外设定义到设备树文件(dts)上面,当boot启动的时候,会把设备树上面的信息解析到内核当中。依靠这个文件,可以十分有效的避免了因为板子引脚资源不同,导致的产生的多余资源文件冗余的问题。


设备树具体框架

设备树是一种类似于树状的结构,最底层是根节点(/),然后根节点下又延伸出许多的分支,分支之下可以再次延伸出不同的分支。

设备树的语法如下

每个节点以 { 开始,以 }; 结束,/表示根节点,所有的节点都是在根节点之上

/{

        子节点1{

                子节点1的子节点{

                

                };

        };

        子节点2{

        

        };

};


设备树的属性

label

设备树的label属性相当于给这个节点取了另外一个名字,方便引用以及修改。

如下所示,给这个串口取了一个label属性,为uart0,此时uart0就可以表示是这个节点了,我们可以很方便的引用这个标签,来表示这个节点。


address-cells和size-cells

address-cells的意思是:用多少个32位的数据来表示一个地址

size-cells的意思是:用多少个32位的数据来表示大小


compatible

compatible属性的意思是兼容,在设备树中定义一般的意思是为了区分此设备兼容的驱动程序。该属性使用字符串来表示,可以有多个字符串,当使用的时候,会根据字符串的顺序优先级来匹配对应的驱动。

一般来说会按照  “ 厂家名,模块名 ” ,这样来使用该属性


model

model属性是一个字符串,它准确的定义出本身的硬件设备到底是什么。也就是说,model属性表明的就是自身到底是什么板子


status

status主要用来表示此节点是否可用。这个属性有一点重要的作用是,假如我这里有两块板子,板子A以及板子B,同时使用了一个公板的设备树节点XXX.dtsi(dtsi表示可以被设备树使用#include包含),此时我的板子A不需要使用到公板的uart节点,那么我们直接在板子A的设备树中,使用&uart来引用此节点,再把状态设置为disable即可


reg

reg的意思是register,意思就是寄存器的地址,在设备树中是成对存在的,reg属性的值,由address-cells和size-cells属性来决定。reg属性表示的是一段空间,如下的意思是,其实地址为0x80000000,大小为0x20000000的地址大小。


设备树的编译

设备树在内核中,一般在 /arc/arm/boot/dts 目录下,如果是64位,那么在/arc/arm64/boot/dts 这个目录下

设备树的编译,我们只需要在内核源码的目录下,输入如下命令 make dtbs ,即可进行编译。在编译前,我们需要先设置好环境变量。使用 make dtbs V=1 ,编译设备树,同时V=1 查看如何编译

编译完成后,拷贝新的设备树文件到板子的 /boot/ 目录下,重启板子,即可替换新的设备树


内核对设备树的处理

当我们把设备树编译为dtb文件并加载到内核后,当启动开发板,boot会解析设备树,传递给内核,内核会解析这些设备树节点,每一个节点都会转化为device_node结构体,而有些device_node结构体会被转化为plateform_device结构体

但是并不是每一个节点都可以被转化为plateform_device结构体,想要转化为plateform_device结构体需要如下要求:

        一、根节点下的子节点存在compatible属性,这点很好理解,因为有了compatible属性才可以兼容驱动,如果连compatible属性都没有的话,那么就是没有兼容的驱动,那么也没必要转化为plateform_device了

        二、假如某个子节点的父节点的compatible属性存在如下的特殊情况“simple-bus”、“simple-mfd”、“isa”、“arm,amba-bus”,那么它的子节点(子节点也需要存在compatible属性)也可以转化为plateform_device结构体

        三、总线I2C、SPI节点下的子节点不会转化为plateform_device结构体,因为他们应该交给总线的驱动来处理,而不是单独拿出来处理


plateform_device如何对应plateform_driver

在plateform_device结构体下,存在一个of_node属性,里面的struct property *properties指向该设备节点的所有属性的链表,里面可以得到设备树节点信息,和platform_driver的of_match_table属性进行对比,如果相等,则是配对成功

of_match_table是一个结构体指针,里面可以有多个结构体,表示该驱动可以支持多个设备

当设备和驱动配对成功之后,platform_driver对调用probe函数,用来获取设备树节点的信息。设备树的属性如果不是自定的,那么可以直接获取,比如说reg属性,就是MEM资源,interrupts属性,就是IRQ资源,这些都是可以直接调用函数platform_get_resource获取。

那么对于不是标准的属性,我们应该如何去获取呢。/根节点会保存在of_root这个全局变量中,我们使用这个根节点,来遍历整个设备树(使用系统提供的函数),获取到自己想要的那个节点,就可以获取到非标准化属性的信息了(通过节点获取到属性也是通过系统提供的函数)。


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

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

相关文章

webots学习记录8:R2023b如何在某个零件上添加一个恒定的力(矩)

在webots安装路径下,从include\controller\c\webots\supervisor.h中可以看到如下定义: void wb_supervisor_node_add_force(WbNodeRef node, const double force[3], bool relative); void wb_supervisor_node_add_force_with_offset(WbNodeRef node, c…

37-5 基于时间的盲注 SQL 注入 PoC 的 Python 编写

攻击目标就用sql靶场的第9关,手注与靶场搭建:22-5 SQL注入攻击 - 基于时间的盲注-CSDN博客 poc import concurrent.futures # 导入并发模块 import requests # 导入发送HTTP请求的库 import string # 导入处理字符串的库url = "http://127.0.0.1/sqli-labs-master…

AndroidStudio中虚拟机(AVD)无法启动,出现unable to locate adb错误

1.检查Android SDK Platform-Tools是否安装(个人是通过这个方法解决的) 首先通过File-Project Structure-Project SDK检查SDK有没有被选中 步骤:打开file -> settings ,搜索SDK 之后点击"-",在点击Apply进行安装 2.可能是驱动的问题 电脑…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题,它旨在识别图像中所有感兴趣的目标,并给出它们的类别和位置。近年来,随着深度学习技术的发展,目标检测领域取得了巨大的进步。YOLO(You Only Look Once&a…

基于OSAL 实现UART、LED、ADC等基础示例 4

1 UART 实验目的 串口在我们开发单片机项目是很重要的,可以观察我们的代码运行情况,本节的目的就 是实现串口双工收发。 虽然说 osal 相关的代码已经跟硬件关系不大了,但是我们还是来贴出相关的硬件原理图贴出来。 1.1 初始化 osal_init_s…

交换式网络捕获网络流量的方法

交换式网络捕获网络流量的方法 参考资料: https://blog.csdn.net/weixin_44143678/article/details/107559329 # 一.端口镜像 端口镜像,又称为“端口监视”或“端口抄送”,是一种网络管理技术,旨在将网络设备上的特定端口的流…

PyTorch Conv2d 前向传递中发生了什么?

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Springboot的日常操作技巧

文章目录 1、自定义横幅2、容器刷新后触发方法自定义3、容器启动后触发方法自定义**CommandLineRunner**ApplicationRunner 不定时增加 参考文章 1、自定义横幅 简单就一点你需要把banner.text放到classpath 路径下 ,默认它会找叫做banner的文件,各种格式…

spring的bean创建流程源码解析

文章目录 IOC 和 DIBeanFactoryApplicationContext实现的接口1、BeanFactory接口2、MessageSource 国际化接口3、ResourcePatternResolver,资源解析接口4、EnvironmentCapable接口,用于获取环境变量,配置信息5、ApplicationEventPublisher 事…

使用扩展卡尔曼滤波器进行包裹测量的状态估计

此示例说明如何使用扩展卡尔曼滤波器算法对涉及圆形包裹角度测量的 3D 跟踪进行非线性状态估计。对于目标跟踪,传感器通常采用球形框架来报告物体的方位角、距离和仰角位置。该组的角度测量值在一定范围内报告。例如,报告的方位角范围为- 180∘ 到180∘或…

UE5 GAS开发P34 游戏效果理论

GameplayEffects Attributes(属性)和Gameplay Tags(游戏标签)分别代表游戏中实体的特性和标识。 Attributes(属性):Attributes是用来表示游戏中实体的特性或属性的值,例如生命值、…

【工具】录屏软件Captura安装使用及ffmpeg下载配置

开启技术视频创作,录屏软件林林总总,适合的、习惯的最好。 录屏软件Captura的使用及ffmpeg下载配置 1.Captura下载、安装2.FFmpeg下载、配置3.Captura屏幕录制试用、录制视频效果 1.Captura下载、安装 Captura主要是一个免费开源的录屏软件&#xff0c…

系统架构设计精华知识

数据流风格:适合于分阶段做数据处理,交互性差,包括:批处理序列、管理过滤器。调用/返回风格:一般系统都要用到,包括:主程序/子程序,面向对象,层次结构(分层越…

20240330-1-词嵌入模型w2v+tf-idf

Word2Vector 1.什么是词嵌入模型? 把词映射为实数域向量的技术也叫词嵌⼊ 2.介绍一下Word2Vec 谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构,分别是连续词袋&#xff…

54位大咖演讲精华! 中国生成式AI大会圆满收官,TOP50企业榜单揭晓

54位大咖演讲精华! 中国生成式AI大会圆满收官,TOP50企业榜单揭晓© 由 红板报 提供 智东西4月19日报道,为期两天的2024中国生成式AI大会,今日在京圆满收官。 54位产学研投嘉宾代表全程干货爆棚,报名咨询人数逾52…

操作符不存在:sde.st_geometry ^ !sde.st_geometry建议 SQL函 数st_intersects在内联inlining期间

操作符不存在:sde.st_geometry ^ !sde.st_geometry建议 SQL函 数st_intersects在内联inlining期间 问题:最近在使用SQL图形处理函数处理图形时,莫名奇妙报如下错误,甚是费解 于是开始四处"寻医问药" 1、nav…

G1、CMS垃圾回收期专题

共同点 非阻塞 使用三色标记法 初始标记、并发标记、重新标记、并发清理 (初始标记、重新标记需要stop world) CMS垃圾回收器 缺点 浮动垃圾 有垃圾碎片 关注停顿时间,使用了效率最高的标记清除算法 G1垃圾回收器 缺点 需要配置高&…

MySQL表级锁——技术深度+1

引言 本文是对MySQL表级锁的学习,MySQL一直停留在会用的阶段,需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取,欢迎Star! MySQL表级锁 MySQL中表级锁主要有表锁…

【Java EE】 SpringBoot配置文件

文章目录 🍀配置文件的作用🌴SpringBoot配置文件🍃配置文件的格式🌳properties 配置文件说明🌸properties基本语法🌸读取配置文件🌸properties 缺点分析 🌲yml 配置文件说明&#x1…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…