设备树的概念及引入、设备树如何变成device

在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离,但每次调整资源还是会涉及到内核,所以现在更加流行的是设备树方式。设备树的好处是通过独立于内核存在,这样如果设备上外设功能启用与否以及位置变动的话很多时候不用修改与编译内核,只要重新处理设备树文件即可。

设备树代码(或者都算不上代码)只是一些树状的数据,有点像JSON。

设备树源文件有两种尾缀,分别是 dts 以及 dtsi。dtsi 常规意义上定义 SoC 级别的硬件 信息,而 dts 常规意义上定义 board 级别的硬件信息。dts 通过#include 的方式包含进 dtsi 文件

通常每个系列的芯片厂家都会编写好后缀为 .dtsi 的设备树文件,里面把芯片基本上的功能资源都定义了。而对于某个具体的电路板来说,只要编写后缀为 .dts 的文件,在其中引入前述的 .dtsi 文件,然后在 .dts 文件中选择性启用 .dtsi 中已经定义好的并且电路中需要用到的功能。当然在 .dts 文件中也可以自定义新的功能。

.dts 文件最终可以编译为 .dtb 文件,系统在启动的时候会通过Bootloader将该文件传递给内核,内核就会解析取用其中的资源并与驱动进行匹配。如果资源需要调整,通常只需要调整 .dts 文件生成新的 .dtb 文件即可。

                        

设备树的概念:

设备树只是用来给内核里的驱动程序, 指定硬件的信息 。比如 LED 驱动,在内核的驱动程序里去操作寄存器,但是操作哪一个引脚?这由设备树指定。

设备树:

怎么描述这棵树?

我们需要编写设备树文件 (dts: device tree source) ,它需要编译为 dtb(device tree blob)文件,内核使用的是 dtb 文件。

设备树在系统中的编译流程:

一个单板启动时, u-boot 先运行,它的作用是启动内核。 U-boot 会把内核 和设备树文件都读入内存,然后启动内核。在启动内核时会把设备树在内存中的地址告诉内核。
当 U-Boot 通过 ARM 通用寄存器 r2 将设备树 dtb 文件 memory 地址传递给 kernel 之 后,kernel 会将平滑的 FDT 文件解析成 EDT 文件,kernel 将 dtb 进行加工处理、解析成device_node,再将 device_node 转换成各色的 device 如 platform_device 供驱动代码使用。

将创建好的platform_device绑定到platform_bus上

将device 增加进 linux 系统

设备树文件不需要我们从零写出来,内核支持了某款芯片比如 imx6ull,在内核的arch/arm/boot/dts 目录下就有了能用的设备树模板,一般命名为 xxxx.dtsi。“i”表示“include”,被别的文件引用的。

        我们使用某款芯片制作出了自己的单板,所用资源跟 xxxx.dtsi 是大部分相同,小部分不同,所以需要引脚 xxxx.dtsi 并修改。 dtsi 文件跟 dts 文件的语法是完全一样的

编译、更换设备树

我们一般不会从零写 dts 文件,而是修改。程序员水平有高有低,怎么知道改得对不对?需要编译一下。并且内核直接使用 dts 文件的话,就太低效了,它也需要使用二进制格式的 dtb 文件。
kernel 编译时使用 scritpts 下的 dtc 工具(宿主机同样也有 dtc 工具),根据 arch/arm/boot/dts/Makefile 中的规则,将设备树源码编译成 dtb 格式的 ABI 文件。

在内核中直接 make

设置 ARCH CROSS_COMPILE PATH 这三个环境变量后,进入 ubuntu 上板子内核源码的目录,执行如下命令即可编译 dtb 文件:make dtbs V=1

内核对设备树的处理

从源代码文件 dts 文件开始,设备树的处理过程为:
  • dts PC 机上被编译为 dtb 文件;
  • u-boot dtb 文件传给内核;
  • 内核解析 dtb 文件,把每一个节点都转换为 device_node 结构体;
  • 对于某些 device_node 结构体,会被转换为 platform_device 结构体。

哪些设备树节点会被转换为 platform_device

a)根节点下含有compatile 属性的子节点

b)含有特定compatile 属性的节点的子节点

        如果一个节点的 compatile 属性,它的值是这 4 者之一:"simple-bus","simple-mfd","isa","arm,amba-bus", 那 么 它 的 子结点 ( 需 含 compatile 属性)也可以转换为 platform_device

c)总线 I2CSPI 节点下的子节点:不转换platform_device

        某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被 转换为 platform_device

怎么转换为 platform_device

 内核处理设备树的函数调用过程,这里不去分析;我们只需要得到如下结论:
◼ platform_device 中含有 resource 数组 , 它来自 device_node 的 reg, interrupts 属性 ;
◼ platform_device.dev.of_node 指向 device_node, 可以通过它获得其他属性

platform_device 如何与 platform_driver 配对

从设备树转换得来的 platform_device 会被注册进内核里 ,以后当我们每 注册一个 platform_driver 时,它们就会两两确定能否配对,如果能配对成功 就调用 platform_driver probe 函数。

1 最先比较:是否强制选择某个 driver

比较 : platform_device.driver_override 和 platform_driver.driver.name
        可以设置 platform_device driver_override ,强制选择某个 platform_driver

2 然后比较:设备树信息

比较: platform_device.dev.of_node p latform_driver.driver.of_match_table
        由设备树节点转换得来的 platform_device 中,含有一个结构体: of_node
它的类型如下
如果一个 platform_driver 支 持 设 备 树 , 它 的 platform_driver.driver. of_match_table 是一个数组,类型如下:
使用设备树信息来判断 dev drv 是否配对时 :
首先 ,如果 of_match_table 中含有 compatible 值,就跟 dev compatile 属性比较,若一致则成功,否则返回失败;
其次 ,如果 of_match_table 中含有 type 值,就跟 dev device_type 属性 比较,若一致则成功,否则返回失败;
最后 ,如果 of_match_table 中含有 name 值,就跟 dev name 属性比 较,若一致则成功,否则返回失败。
而设备树中建议不再使用 devcie_type name 属性,所以基本上只使用设 备节点的 compatible 属性来寻找匹配的 platform_driver

3 接下来比较:platform_device_id

 ⚫ 比较 :platform_device. name 和 platform_driver.id_table[i].name ,id_table 中可能有多项。
        platform_driver.id_table 是“ platform_device_id ”指针,表示该 drv 支持若干个 device,它里面列出了各个 device {.name, .driver_data} , 其中的“name ”表示该 drv 支持的设备的名字, driver_data 是些提供给该 device 的私有数据。

4 最后比较

⚫ 比较:platform_device.name 和 platform_driver.driver.name
        platform_driver.id_table 可能为空, 这 时 可 以 根 据 platform_driver.driver.name 来 寻 找 同 名 的 platform_device。

怎么修改设备树文件

一个写得好的驱动程序 , 它会尽量确定所用资源。只把不能确定的资源留给 设备树, 让设备树来指定。根据原理图确定 " 驱动程序无法确定的硬件资源 ", 再在设备树文件中填写对应内容。那么 , 所填写内容的格式是什么 ?

使用芯片厂家提供的工具

有些芯片,厂家提供了对应的设备树生成工具,可以选择某个引脚用于某些 功能,就可以自动生成设备树节点。 再把这些节点复制到内核的设备树文件里即可。

看绑定文档

内核文档 Documentation/devicetree/bindings/ 做得好的厂家也会提供设备树的说明文档

参考同类型单板的设备树文件

网上搜索

实在没办法时, 只能去研究驱动源码

原文链接:https://blog.csdn.net/Naisu_kun/article/details/130860190

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

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

相关文章

【股权激励】“三级股权分配法”——某互联网电商企业股权激励管理

【客户背景及面临难题】K公司于2014年上线,是由多位创始人联合创办的一家以众包微物流配送为核心模式,主营同城水果、蔬菜、生鲜、日常生活用品、零食等商品在线销售,专注于社区生鲜最后一公里配送,主打一小时之内闪电送达的互联网…

使用C语言函数对数组进行操作

前言 在我们了解数组和函数之后,我们对数组和函数进行结合,之后完成一些操作吧 题目描述 杰克想将函数与数组结合进行一些操作,以下是他想要达到的效果,请你帮帮他吧! 创建一个整型数组,完成对数组的操作 1…

签约速递 | 看零信任如何打造安全互联的数字底座?

近期,易安联再传佳音,签约南通市公安局、隆基绿能科技股份有限公司、南京体育学院等,持续为客户提供功能更完善、体验更好的零信任安全解决方案,赋能千行百业数字化转型升级,共创网络安全繁荣生态。 南通市公安局 数字…

K-means聚类算法的原理、应用与实例

文章目录 K-means 聚类算法:原理K-means 聚类算法的应用K-means 聚类算法的优化与改进 一个使用 K-means 聚类算法进行客户细分的简单实例 K-means 聚类算法:原理 K-means 算法是一种经典的无监督学习方法,用于对未标记的数据集进行分群&…

智慧公厕是智慧城市建设中不可或缺的一部分

智慧城市的数字化转型正在取得显著成效,各项基础设施的建设也在迅速发展,其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施,公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…

macOS 启动 Nacos(2),50家大厂面试万字精华总结

进来之后一定要选择支持 arm64 的版本不然会出现因为版本不支持导致无法启动 WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested点击 copy docker pull nacos/naco…

Blender2.83 下载地址及安装教程

Blender是一款开源的3D计算机图形软件,广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能,让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出,使用户能够与其他软件进…

Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.4 库存超卖问题及其解决4.3.4.1 问题分析4.3.4.2 问题解决 4.3.5 一人一单需求4.3.5.1 需求分析4.3.5.2 代码实现4.3.5.3 并发问题4.3.5.4 悲观锁解决并发问题4.3.5.5 集群环境下的并发问题 4.4 …

最新版手机软件App下载排行网站源码/App应用商店源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 一款简洁蓝色的手机软件应用app下载排行,app下载平台,最新手机app发布网站响应式织梦模板。 主要有:主页、app列表页、app介绍详情页、新闻资讯列…

Linux中磁盘的分区,格式化,挂载和文件系统的修复

一.分区工具 1.分区工具介绍 fdisk 2t及以下分区 推荐 (分完区不保存不生效,有反悔的可能) gdisk 全支持 推荐 parted 全支持 不推荐 ( 即时生效,分完立即生效) 2.fdisk 分区,查看磁盘 格式:fdisk -l [磁盘设备] fdisk -l 查看…

网络协议——RSTP(快速生成树)与MSTP(多实例生成树)

一. RSTP 1. STP的不足 1、依靠计时器超时的方式进行收敛导致它的收敛时间需要30到50秒 2、端口状态和端口角色没有细致区分,指导数据转发依靠的不是端口状态而是端口所扮演角色。 3、如果拓扑频繁变化导致用户通信质量差,甚至通信中断&#xf…

排序:冒泡排序,直接插入排序,简单选择排序,希尔排序,快速排序,堆排序,二路归并排序

目录 一.冒泡排序 代码如下 冒泡排序时间复杂度分析 二.直接插入排序 直接插入排序时间复杂度分析 直接插入排序优化:折半插入排序 三.简单选择排序 简单选择排序优化:双向选择排序 选择排序时间复杂度 双向选择排序时间复杂度 四.希尔排序 希…

达梦的归档日志参数ARCH_RESERVE_TIME测试

达梦的参数ARCH_RESERVE_TIME测试 前面有提到和oracle相比,达梦的归档日志相关参数有个比较特别,可以通过设置它去规定归档日志的保留时间。 ARCH_RESERVE_TIME:归档日志保留时间,单位分钟,取值范围 0~2147483647。只…

黄金白银价格上涨是投资机会吗?

黄金和白银,作为历史悠久的贵重金属,一直以来都被投资者视为避险资产。近年来,随着全球经济环境的变动,我们观察到黄金与白银的价格不断攀升,这是否预示着投资机会的到来?今天,就让我们来深度探…

R+VIC模型融合实践技术应用及未来气候变化模型预测

在气候变化问题日益严重的今天,水文模型在防洪规划,未来预测等方面发挥着不可替代的重要作用。目前,无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然,这些软件有各自的优点;但是&am…

【软考】哈希表

目录 一、概念1.1 定义 二、哈希函数的构造方法2.1 说明2.2 特性 三、处理冲突的方法3.1 说明3.2 开放定址法3.2.1 说明3.2.2 线性探测 3.3 链地址法3.4 再哈希法3.5 建立公共溢出区 四、哈希表的查找4.1 查找过程4.2 查找特点4.3 装填因子 一、概念 1.1 定义 1.一般存储结构由…

centos7部署zabbix6.4.9

文章目录 [toc]一、环境准备1)部署lnmp2)修改配置文件3)安装数据库 二、部署zabbix1)下载zabbix2)安装zabbix服务端3)修改配置4)开机启动5)安装客户端 三、登录配置1)访问…

在Windows电脑上上传iOS应用至App Store

引言 📱 使用UniApp开发iOS应用十分便捷,一套代码即可兼容多个平台。然而,UniApp开发iOS应用需要进行证书打包和将IPA文件上传至App Store,这两个步骤通常需要在Mac电脑上完成。那么,如果我们使用的是Windows开发环境…

three.js跟着教程实现VR效果(四)

参照教程:https://juejin.cn/post/6973865268426571784(作者:大帅老猿) 1.WebGD3D引擎 用three.js (1)使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 (2)使…

机器学习 —— 使用机器学习进行情感分析 详细介绍版

机器学习 —— 使用机器学习进行情感分析 详细介绍版 机器学习 —— 使用机器学习进行情感分析 演示版 目录 一、 绪论二、 数据处理1. 构建CSV文档2. 构建模型前的思考2.1. 问题2.2. 解决方法 3. 读取数据4. 用正则表达式来进行对特定符号的剔除5. 使用口袋模型进行文本处理和…