设备树的概念、设备树如何变成device、与driver的匹配

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

设备树代码(或者都算不上代码)只是一些树状的数据,有点像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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文速读】| 基于大语言模型的模糊测试技术

本次分享论文为:Large Language Models Based Fuzzing Techniques: A Survey 基本信息 原文作者:Linghan Huang, Peizhou Zhao, Huaming Chen, Lei Ma 作者单位:悉尼大学;东京大学;阿尔伯塔大学 关键词:…

8. Spring Boot 配置文件

源码地址:SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/config包下 1. 配置文件是什么 上节说到,Spring Boot的项目分为三个部分:源代码目录、资源目录、单元测试目录。 而配置文件的位置就位于资源目录res…

Python-VBA函数之旅-delattr函数

目录 1、 delattr函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:https://blog.csdn.net/ygb_1024?spm1010.2135.3001.5421 delattr函数在Python中具有广泛的应用场景,主要用于动态地管理对象的属性。常用…

Python十大最佳实践:高效Python编程的十个关键方法

在当今的软件开发世界中,Python是一种极其重要且广泛使用的编程语言。以下是Python编程的十大最佳实践,这些实践将帮助你提升编程效率,优化代码质量,以及更好地应用Python的强大功能。 1.理解Pythonic的方式 “Pythonic”是指遵循…

傲基科技冲刺上市:依赖单一产品,元气未恢复,有股东提前退出

近日,傲基科技股份有限公司(下称“傲基科技”)递交招股书,准备在港交所主板上市,华泰证券为其独家保荐人。 据招股书介绍,傲基科技是一家提供家具家居类产品的品牌运营商及出口物流服务商。傲基科技在招股…

Java+vue2+springboot智慧班牌系统源码,支持PC端、移动客户端、电子班牌端,SaaS模式部署

智慧班牌作为一个班级的标识,也是班级空间日常管理的载体,作为班级文化展示交流窗口与学科教学、德育管理,以及学校信息収布等有机结合起来,作为学生展示的平台,又可应用于普及教育安全知识和科学文化,拓展…

Python爬虫:requests模块的基本使用

学习目标: 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问

应用场景:防止恶意IP尝试ssh登录 脚本说明:将密码输入错误超过四次得ip地址通过iptable防火墙访问。 分析: 首先,需要知道ssh远程访问记录在哪一个文件中 /var/log/secure 其次,模拟远程访问输错密码,查…

2024 十五届蓝桥杯省赛Python B组

以下仅是我的答案,仅供参考,欢迎讨论。 A:穿越时空之门 二进制、四进制转换。答案:63。 B:数字串个数 排除0,总的方案数9^10000,减去不存在3和不存在7的2*8^10000,再加上同时不存在3和7的7^…

MYSQL09_行格式概述、变长字段、NULL值、记录头信息、真实数据、内部结构

文章目录 ①. InnoDB - 行格式概述②. 变长字段长度列表 ③. NULL值列表④. 记录头信息5字节⑤. 记录的真实数据⑥. Compact行记录的内部结构⑦. Dynamic和Compressed行格式 ①. InnoDB - 行格式概述 ①. 我们平时的数据以行为单位来向表中插入数据,这些记录在磁盘上的存放方式…

【C语言基础】:编译和链接(计算机中的翻译官)

文章目录 一、翻译环境和运行环境1. 翻译环境1.1 编译1.1.1 预处理1.1.2 编译1.1.3 汇编 1.2 链接 2. 运行环境 一、翻译环境和运行环境 我们在Visual Studio上写的C语言代码其实都是一些文本信息,计算机是不能够直接执行他们的,计算机只能够执行二进制…

基于Linux定时任务实现的MySQL周期性备份

1、创建备份目录 sudo mkdir -p /var/backups/mysql/database_name2、创建备份脚本 sudo touch /var/backups/mysql/mysqldump.sh# 用VIM编辑脚本文件,写入备份命令 sudo vim /var/backups/mysql/mysqldump.sh# 内如如下 #!/bin/bash mysqldump -uroot --single-…

下载好了annaconda,但是在创建一个新的Conda虚拟环境报错

文章目录 问题描述:解决方案1.生成一个配置文件 问题总结 问题描述: ProxyError(MaxRetryError(“HTTPSConnectionPool(host‘repo.anaconda.com’, port443): Max retries exceeded with url: /pkgs/pro/win-64/repodata.json.bz2 (Caused by ProxyErr…

系统架构最佳实践 -- 金融企业的资损防控

一、资损产生的原因 由于支付行业的特殊性与复杂性(主要处理资金相关业务),支付公司处于资损的风口浪尖,最容易发生资损,可以说资损风险无处不在。 常规来说,资损原因主要可以分为以下三类: 1…

【鸿蒙开发】第二十章 Camera相机服务

1 简介 开发者通过调用Camera Kit(相机服务)提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。 2 …

浮点数的表示

王道考研ppt总结: 二、个人理解 浮点数解决的是定点数的位数局限,导致表示范围有限的问题 阶码:由阶符和数值部分组成,阶符为,小数点向左移动,否则向右移动;数值部分,是底数的几次幂…

【新版】系统架构设计师 - 知识点 - 面向对象开发方法

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 知识点 - 面向对象开发方法面向对象开发方法面向对象的分析需求模型分析模型 面向对象的设计 用例模型关系、UML事务关系、类的关系 架构 - 知识点 - 面向对象开发方法 面向对象开发方法 分析阶段…

多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别

EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富,包括主流标准协议,有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海…

面试算法-164-K 个一组翻转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

MySQL事务与事务原理

目录 事务 事务的四大特性ACID 事务隔离级别 事务原理 存储引擎 四大特性的保证 MVCC 事务链 ReadView 事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 start transaction; -- 开启事务 或者 b…