驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比
🔍
B站相应的视屏教程:
📌 内核:博文+视频 - 从静态绑定驱动模型到现代设备模型
主题:深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比
在上一节中,我们从驱动框架的历史演进出发,分析了早期的静态绑定驱动模型及其局限性,并逐步过渡到现代 Linux 设备模型架构。本节将聚焦于设备模型运行时的数据结构与匹配流程,结合实际平台(NXP i.MX8M 与 Raspberry Pi),从设备树的编写、设备注册、驱动匹配、probe 调用等多个角度展开,理论与实战融合讲解设备模型的本质运作方式。
📘 第一部分:设备模型的本质问题 —— 驱动如何找到设备?
在设备模型中,驱动程序不再"直接控制硬件",而是等待系统提供设备信息,再由总线驱动匹配机制完成“驱动与设备的配对”,最终执行 probe()
。
因此,理解设备模型的核心本质,就是要搞清楚:
“驱动是怎么和设备匹配的?设备又是怎么被注册到系统中的?”
我们将通过 i.MX8M 和 Raspberry Pi 两个平台,来回答这个问题。
📘 第二部分:设备节点的来源 —— 设备树(Device Tree)
✅ 什么是设备树?
设备树(DTS)是一种用于描述硬件信息的数据结构,编译为 DTB 后在内核启动初期被解析,生成内核中的 struct device_node
树形结构。内核随后根据设备树中的节点内容,注册相应的 platform_device
。
📎 i.MX8M 示例(LCDIF3 控制器)
lcdif3: lcd-controller@32fc6000 {compatible = "fsl,imx8mp-lcdif1";reg = <0x32fc6000 0x10000>;interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clk IMX8MP_CLK_MEDIA_APB_ROOT>, ...;status = "okay";
};
📌 内核会根据 compatible
字符串创建一个 platform_device
,名字类似 lcdif3.32fc6000
。
📎 Raspberry Pi 示例(I2C 控制器)
i2c1: i2c@7e804000 {compatible = "brcm,bcm2835-i2c";reg = <0x7e804000 0x1000>;interrupts = <2 21>;clock-frequency = <100000>;status = "okay";
};
设备树被内核解析后,注册为 platform_device
,后续等待匹配合适的驱动。
📘 第三部分:驱动如何声明匹配信息?
驱动需要提供一个 of_match_table
,用于告诉设备模型:“我支持哪些设备”。
static const struct of_device_id lcdifv3_dt_ids[] = {{ .compatible = "fsl,imx8mp-lcdif1" },{ }
};
MODULE_DEVICE_TABLE(of, lcdifv3_dt_ids);static struct platform_driver lcdifv3_driver = {.probe = lcdifv3_probe,.remove = lcdifv3_remove,.driver = {.name = "imx-lcdifv3",.of_match_table = lcdifv3_dt_ids,},
};
🔍 注意:只有匹配成功,probe 才会被调用。
📘 第四部分:匹配过程是如何完成的?
✅ 匹配的参与者:
组件 | 数据结构 |
---|---|
设备 | struct platform_device |
驱动 | struct platform_driver |
匹配规则 | struct of_device_id[] |
总线中转调度器 | struct bus_type |
✅ 匹配流程
- 设备树解析阶段,生成
platform_device
(如lcdif3
) - 驱动注册时,添加到
platform_bus_type
的driver_list
- 内核自动遍历设备与驱动,调用
bus_type->match()
- 匹配成功后:
- 设置
pdev->dev.driver = &driver
- 调用
driver->probe(pdev)
完成初始化
- 设置
📘 第五部分:数据结构流动分析(从 DTS 到 probe)
📌 流程图:
DTS → of_node (设备树节点)↓
of_platform_populate()↓
platform_device_register()↓
/sys/devices/platform/xxx ←→ /sys/bus/platform/devices/xxx↓
platform_bus_type.match()↓
platform_driver.probe()
📎 代码对应点(以 LCDIF3 为例):
关键节点 | 对应代码 |
---|---|
compatible = “fsl,imx8mp-lcdif1” | of_device_id 中匹配 |
reg/clocks 等资源 | of_address_to_resource() 等函数读取 |
probe 中访问资源 | platform_get_resource() / devm_ioremap_resource() |
📘 第六部分:i.MX8M vs 树莓派平台对比
对比维度 | NXP i.MX8M | Raspberry Pi |
---|---|---|
SoC 架构 | 多个 LCDIF 控制器 + VPU | Broadcom BCM283x |
DTS 中定义 | fsl,imx8mp-lcdif1 | brcm,bcm2835-i2c |
驱动模块名 | imx-lcdifv3 | i2c-bcm2835 |
驱动结构 | 完整 platform_driver + match | 同样采用 of_match_table 匹配 |
热插拔支持 | 支持 runtime pm / suspend / resume | 同样支持 PM、sysfs、modprobe 热加载 |
📌 虽然 SoC 不同,但设备模型使用方式完全统一。
📘 第七部分:常见问题与调试技巧
❓ Q1: 为什么 probe 没被调用?
- 没有写
of_match_table
compatible
写错,无法匹配- 驱动未被编译进内核或未加载
status = "disabled"
导致设备未注册
❓ Q2: 如何确认设备已注册?
- 查看
/sys/bus/platform/devices/
- 使用
dmesg
检查设备是否出现 - 加
dev_info()
等日志确认 probe 是否执行
❓ Q3: 如何查看匹配关系?
modinfo xxx.ko # 查看 compatible alias
ls /sys/bus/platform/drivers/xxx
📘 第八部分:实战建议
- 永远在驱动中写上正确的
of_match_table
- 使用
devm_*
系列管理资源,避免内存泄漏 - 善用
dev_dbg()
、dev_err()
等接口打印调试信息 - 多观察
/sys/
目录,理解设备与驱动的 sysfs 映射关系 - 多平台共享一个驱动时,合理利用
of_device_id.data
携带平台定制参数
✅ 总结与回顾
本篇深入分析了设备模型中从 DTS → 设备注册 → 驱动匹配 → probe 执行的完整过程。通过对比 i.MX8M 与树莓派平台,我们看到了设备模型在不同平台间的通用性与强大抽象能力。
📌 核心关键词:
- 设备树注册 → platform_device 创建
- 驱动注册 → platform_driver with of_match_table
- 内核总线 → bus_type 匹配 → 调用 probe
这正是现代 Linux 驱动开发的标准范式。
下一篇我们将从 资源管理角度(时钟、中断、寄存器、GPIO)展开,讲解 platform_get_resource()
、devm_*()
、of_property_read_*()
等函数在实际项目中的最佳使用方式。
相关文章:
驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比
🔍 B站相应的视屏教程: 📌 内核:博文视频 - 从静态绑定驱动模型到现代设备模型 主题:深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中,我们从驱动框架的历史演进出…...
MyBatis 动态 SQL 使用详解
🌟 一、什么是动态 SQL? 动态 SQL 是指根据传入参数,动态拼接生成 SQL 语句,不需要写多个 SQL 方法。MyBatis 提供了 <if>、<choose>、<foreach>、<where> 等标签来实现这类操作 ✅ 二、动态 SQL 的优点…...
数据结构实验4.1:链队列的基本操作
文章目录 一,问题描述二,基本要求三,算法分析链队列的存储结构设计基本操作的算法分析 四,示例代码五,实验操作六,运行效果 一,问题描述 编程实现有关链队列的下列基本操作。 (1&am…...
独立部署及使用Ceph RBD块存储
Ceph RBD(RADOS Block Device) 是 Ceph 分布式存储系统中的块存储组件,类似于 AWS EBS、iSCSI 等。它独立于 OpenShift 或 IBM CP4BA,是一个分布式存储系统,提供高性能、可扩展性和容错能力,适用于数据库、…...
C++初阶-C++入门基础
目录 编辑 1.C的简介 1.1C的产生和发展 1.2C的参考文档 1.3C优势和难度 1.4C学习的建议 2.C的第一个程序 2.1打印Hello world 2.2头文件 2.3namespace命名空间 2.4::作用域限定符 2.5namespace的延伸 2.6C的输入输出 3.总结 1.C的简介 …...
部署大模型不再难:DeepSeek + 腾讯云 HAI 实战教程
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
算法训练之位运算
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
初识Linux:常见指令与权限的理解,以及相关衍生知识
目录 前言 关于linux的简介 代码开源 网络功能强大 系统工具链完整 一、Linux下的基本指令 1.ls指令 2.pwd指令 3.cd指令 4.whoami指令 5.touch指令 6.mkdir指令 7.rm指令 8.man指令 9.cp指令 10.mv指令 11.nano指令 12.cat指令 13.tac指令 14.more指令 15.less指令 16.head指令…...
PostgreSQL-数据库的索引 pg_operator_oid_index 损坏
报错信息: 连接测试失败 Error connecting to database: Connection failed: ERROR: index "pg_operator_oid_index" contains unexpected zero page at block 3 Hint: Please REINDEX it. 这个错误表明 PostgreSQL 数据库的索引 pg_operator_oid_index …...
数字图像处理作业4
数字图像处理 作业4 Project 4:Image Restoration The scoring method for this project is as follows: 1.Implement a blurring filter using the equation(5.6-11,数字图像处理(…...
Simulink中Signal Builder在新版中找不到怎么办
在较新的MATLAB版本中,新版Simulink中的Signal Builder用Signal Editor作为替代工具。 signal builder not shown in matlab - MATLAB Answers - MATLAB Central signalBuilderToSignalEditor 1.打开上面第二个链接 2.点击拷贝 3.然后在命令行中粘贴 4.然后就会…...
STM32——RTC实时时钟
RTC简介 RTC(Real Time Clock, RTC)实时时钟,其本质是一个计数器,计数频率常为秒,专门用来记录时间。 其具有能提供时间(秒钟数),能在MCU掉电后运行,低功耗的特性 内部框图 1. RTC预分频器 2. …...
sqli-labs靶场 less4
文章目录 sqli-labs靶场less 4 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
指针数组 vs 数组指针
一、指针数组:「数组装指针」—— 每个元素都是指针 🔍 核心定义 语法:类型* 数组名[长度]; ([]优先级高于*,先形成数组,元素是指针)本质:一个 数组,数组的每个元素是 …...
GitHub优秀项目:数据湖的管理系统LakeFS
lakeFS 是一个开源工具,它将用户的对象存储转换为类似Git的存储库。使用户可以像管理代码一样管理数据湖。借助 lakeFS,可以构建可重复、原子化和版本化的数据湖操作--从复杂的ETL作业到数据科学和分析。 Stars 数11090Forks 数3157 主要特点 强大的数据…...
数据库视图讲解(view)
一、为什么需要视图 二、视图的讲解 三、总结 一、为什么需要视图 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。 比如,针对一个公司的销售人员,我们只想给他看部分数据,…...
pip install pytrec_eval失败的解决方案
1、问题描述 在使用华为云 notebook 的时候,想要: !pip install transformer结果失败,阅读报错后,疑似是 pytrec_eval 库的下载问题。 于是,单独尝试: !pip install pytrec_eval发现确实是这个库安装失…...
使用stream的Collectors.toMap()方法常见问题
文章目录 一、常见问题二、key重复问题2.1、报错示例2.2、解决方法 三、value为空问题3.1、报错示例3.2、解决方法3.1、方案一3.2、方案二 一、常见问题 stream的Collectors.toMap()方法常见问题: 1、 key不能有重复,否则会报错。java.lang.IllegalStat…...
[C++面试] 初始化相关面试点深究
一、入门 1、C中基础类型的初始化方式有哪些?请举例说明 默认初始化 对于全局变量和静态变量,基础类型(如int、float、double等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机…...
ChatDBA:一个基于AI的智能数据库助手
今天给大家介绍一个基于 AI 大语言模型实现数据库故障诊断的智能助手:ChatDBA。 ChatDBA 是由上海爱可生信息技术股份有限公司开发,通过对话交互,提供数据库故障诊断、专业知识学习、SQL 生成和优化等功能,旨在提升 DBA 工作效率。…...
Java延迟队列
📌 1. 场景背景 最近做项目,使用到了延迟队列。场景是这样的:在在线视频学习中,学生每隔几秒上报当前学习进度,为避免频繁写数据库、提升性能,采用以下方案: 先写入 Redis,再延迟一…...
神舟平板电脑怎么样?平板电脑能当电脑用吗?
在如今的数码产品市场上,神舟平板电脑会拥有独特的优势,其中比较受到大家关注的就是神舟PCpad为例,无论是设计还是规格也会有很多的亮点,那么是不是可以直接当成电脑一起来使用呢? 这款平板电脑就会配备10.1英寸显示屏…...
Ansible的使用3
#### 一、Ansible补充模块 try () { } catch () { } finally 等同于 block () { } rescue () { } always ##### 任务块 - block任务块 - 通过block关键字,将多个任务组合到一起 - 将整个block任务组,一…...
PS教学记录
PS制作手机壁纸和电脑壁纸 1. 思绪来源 找到了一位B站UP,分享了有关于灰原哀的动态壁纸。自身( •̀ ω •́ )也是名侦探柯南的爱好者,在此基础上,萌生了制作壁纸的想法。便在B站上搜寻有关于壁纸制作的教学。找到了一位壁纸分享者的教程镜…...
分析一下HashMap内部是怎么实现的
当然可以!我们来深入分析一下 Java 中 HashMap 的内部实现机制(以 JDK 8 为主),包括数据结构、核心算法、源码设计、以及适用场景。 🧠 一、HashMap 的核心结构 HashMap 是基于哈希表实现的 Map,底层结构是…...
面向对象的要素
理解面向对象 程序的三种基本结构 (1)顺序结构 (2)选择结构 (3)循环结构 面向对象程序设计简介 面向对象是一种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、封装、消息等基本…...
Java基础 4.9
1.方法递归调用练习 //请使用递归的方式求出斐波那契数1, 1, 2, 3, 5, 8, 13 //给你一个整数n, 求出它的值是多少 /* 思路 n 1 1 n 2 1 n > 3 前两个数的和 递归的思路 */ public class RecursionExercise01 {public static void main(String[] args) {Mathod mathod ne…...
什么是堆?深入理解堆数据结构及其应用
粉丝提问 ⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream 发表后收到一位粉丝的私信询问: “经常听说堆、堆排序、优先队列这些概念,但一直不太明白堆到底是什么,能简单解释一下吗?它和内存分配中的堆是一回事…...
程序化广告行业(73/89):买卖双方需求痛点及应对策略深度剖析
程序化广告行业(73/89):买卖双方需求痛点及应对策略深度剖析 大家好!一直以来,我都热衷于在技术领域探索学习,也深知知识的分享能让我们共同进步。写这篇博客的目的,就是希望能和大家一起深入了…...
C++ RAII 的用途及业务代码实现案例
C RAII 的用途及业务代码实现案例 RAII 的核心概念 RAII (Resource Acquisition Is Initialization,资源获取即初始化) 是 C 的核心编程范式,其核心思想是: 资源获取与对象构造绑定资源释放与对象析构绑定利用 C 对象生命周期自动管理资源…...
神经网络入门—自定义神经网络续集
修改网络 神经网络入门—自定义网络-CSDN博客 修改数据集,yx^2 # 生成一些示例数据 x_train torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtypetorch.float32) y_train torch.tensor([[1.0], [4.0], [9.0], [16.0]], dtypetorch.float32) 将预测代码改为&…...
【C语言】浮点数在内存的储存
前言: 在上章,了解了整数在内存中的储存,在本章节为大家继续讲解浮点数的储存,也是数据储存的最后一部分。 浮点数是计算机科学中一种重要的数据类型,用于表示实数。它能够表示非常大或非常小的数值,并且…...
安装 Calico 的两种主流方式对比
本文对比了 Calico 的两种主流安装方式: 使用 calico.yaml 的 Manifest 安装方式使用 Tigera Operator(tigera-operator.yaml custom-resources.yaml)安装方式 ✅ 1. 使用 Manifest 方式安装(直接部署 calico.yaml) …...
信用卡欺诈检测实战教程:从数据预处理到模型优化全解析
引言:为什么需要信用卡欺诈检测? 根据尼尔森报告,全球每年因信用卡欺诈造成的损失超过250亿美元,金融机构需要在0.1秒内完成交易风险评估。本文将带您从零构建基于机器学习的信用卡欺诈检测系统,完整代码可视化分析&a…...
android studio编译报错 Gradle
android studio 提示 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-8.0.2-bin.zip. Reason: java.net.SocketTimeoutException: Read timed out 一,手动下载 https://services.gradle.org/distributions/gradle…...
【Nodebb系列】Nodebb笔记写入方案
NodeBB写入方案 前言 最近在整理以前记录的碎片笔记,想把它们汇总到NodeBB中,方便管理和浏览。但是笔记内容有点多,并且用发帖的形式写到NodeBB中会丢失时间信息,因此整理了一套NodeBB写入方案,大致流程如下: 建立标准笔记格式导出原始笔记,并编写脚本将笔记内容转换为…...
Spring Boot 集成 POI
Spring Boot 集合 POI Apache POI 官站:https://poi.apache.org/ 基础概念 Apache POI 是一个开源项目,提供 Java API 用于操作 Microsoft Office 文件格式。Apache POI 对 Excel 文件的处理分为两个主要类库: HSSF (Horrible Spreadsheet …...
8个方向使用DeepSeek打磨完美课题申报书!
一份出色的课题申报书,往往就是项目获批的关键。撰写高质量课题申报书绝非易事,它需要您在选题切入点、研究价值论证、技术路线设计、团队优势呈现、经费规划和预期成果等多维度进行精心布局,确保论证有力、重点突出、结构清晰。 本文为您提供…...
Leetcode 34.在排序数组中查找元素的第一个和最后一个位置
题目描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 考察二…...
ctfshow VIP题目限免 密码逻辑脆弱
根据题目提示:公开的信息比如邮箱,可能造成信息泄露,产生严重后果 在页面上找一个邮箱号 从 QQ 上面搜索这个 QQ号,发现是一个叫大牛的人,地区是陕西西安 然后我们拼接访问 /admin 发现了一个后台登录系统的页面&…...
C++初级入门学习
数据结构初级部分的学习我们已经学完了,接下来就进入C初阶部分的学习,因为数据结构的高阶部分要用到C才能够更好的理解并书写,所以我们要先学习C,初阶部分学完就能继续学习我们对数据结构了。好了,直接进入今天的主题吧…...
2025年汽车加气站操作工证考试内容
汽车加气站操作工证是从事汽车加气站相关操作工作的人员需要考取的资格证书 考试内容 理论知识:包括加气站的工艺流程、设备原理、安全操作规程、气体性质、消防知识、环境保护等方面的知识。例如,需要了解压缩天然气或液化天然气的储存、运输和加注流…...
python爬虫:喜马拉雅案例(破解sign值)
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关ÿ…...
嵌入式AI前沿:精选工具与应用网站解析
1. Edge Impulse 网址:https://www.edgeimpulse.com/核心内容: 提供端到端的嵌入式AI开发平台,简化从数据收集到模型训练再到部署的全流程。支持多模态数据处理(音频、视觉、运动等),并优化模型以在资源受…...
【论文精读】Multi-scale Neighbourhood Feature Interaction Network
摘要(ABSTRACT) 光伏发电是工业领域的关键组成部分,其能量转换效率受光伏电池表面缺陷的显著影响。近年来,深度学习模型的广泛应用推动了缺陷检测技术的进步。然而,由于光伏电池缺陷尺寸差异较大(尤其是微…...
C++ 蓝桥云课代码练习
代码一 ,小明的背包1,代码见下 #include <iostream> #include <cstring> using namespace std;#define maxn 110 #define maxm 1001 #define inf -1int w[maxn], v[maxn]; int dp[maxn][maxm];int main() {memset(dp, inf, sizeof(dp));dp[…...
微软庆祝它成立整整50周年
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
android 启动四大组件
在 Android 开发中,启动通常是指启动一个 Activity、Service、BroadcastReceiver 或其他组件。以下是一些常见的启动方式: 1. 启动一个 Activity 要启动一个 Activity,可以使用 Intent。以下是一个示例代码: 示例:启…...
C# 串口通信
1. 导入 using System.IO.Ports;2. 初始化定义 SerialPort sp new SerialPort(); // 设置串口 sp.PortName "COM3"; // 串口 sp.BaudRate 9600; // 波特率 sp.Parity Parity.None; // 校验位 sp.DataBits 8; // 数据位 sp.StopBits StopBits.One; // 停…...
Spring事务详解
一、Spring对事务的支持 1.事务概述 什么是事务 在一个业务流程当中,通常需要多条DML(insert delete update)语句共同联合才能完成,这多条DML语句必须同时成功,或者同时失败,这样才能保证数据的安全。 多…...