当前位置: 首页 > article >正文

子系统是啥?---总线架构的实例化

目录一、新手容易踩的认知坑二、历史演变从硬编码到子系统设备树的转变1原始裸奔时代无结构体、无设备树、无总线架构2结构体封装时代有结构体、无设备树、有总线架构3子系统设备树时代现代标准架构三、从源代码角度分析通用驱动 compatible 匹配如何实现自动化驱动1第一步设备树DTS—— 硬件信息的 “说明书”2第二步驱动源码leds-gpio.c—— 通用驱动的核心实现3第三步probe中调用深层函数真正写入寄存器四、通用驱动不是万能的驱动工程师的核心价值与兜底场景五、日常开发中如何写寄存器1设备树怎么查、怎么写​2如何在运行中动态修改寄存器一、新手容易踩的认知坑相信很多从STM32转Linux驱动开发的新手小白都会有一个根深蒂固的思维误区我以为Linux驱动中说的子系统就是类似STM32的HAL库函数是一堆可以直接调用的寄存器操作函数。而我们写驱动开发就是换了个地方写HAL库。但当真正上手Linux后发现并不是这么回事写个 LED 控制居然不用自己写寄存器操作函数为什么只在设备树里加几行配置灯就自己亮了所谓的 “子系统”到底是个什么东西那么本篇文章就用最直白的逻辑把“库函数思维”到“子系统思维”的完整转变讲透帮助大家彻底明白子系统到底干了啥。二、历史演变从硬编码到子系统设备树的转变Linux驱动开发大体分为几个阶段。但用一句话总结就是从 “人写代码硬操作寄存器” → “人写结构体封装硬件信息人读取结构体并硬操作寄存器” → “人写设备树描述硬件子系统自动匹配通用驱动自动操作硬件”。1原始裸奔时代无结构体、无设备树、无总线架构早期Linux刚刚诞生的时候内核2.4之前驱动开发其实和STM裸机开发并无本质区别都是工程师直接对着硬件手册、开发板使用说明书直接硬编码寄存器地址、硬编码寄存器配置函数。这意味着代码和开发板强绑定换个芯片、开发板寄存器地址可能就变了就得重新编写所有代码。而且没有任何封装概念代码的健壮性、复用性全看工程师的个人能力。2结构体封装时代有结构体、无设备树、有总线架构随着使用的硬件越来越多一些大佬逐渐发现了上述原始阶段的弊端开始尝试解耦把硬件信息地址、中断、GPIO封装成 C 语言结构体struct resource、struct platform_device驱动只读取结构体不写死硬件地址换板子只改结构体不用改驱动。让软件工程师和硬件工程师可以更好的协作配合。这就是早期的 platform 总线架构实现了 “硬件信息” 和 “驱动逻辑” 的初步分离。后来很多大佬觉得这样还是不好用能不能我写好一份通用驱动以后直接让别人匹配绑定呢这其实就是compatible字段、子系统的由来。这一点我们以后在讲解platform总线的时候再详细分析。目前我们只需要有驱动、硬件描述结构体匹配的概念即可。3子系统设备树时代现代标准架构虽然在上一个时代已经将配置信息与寄存器等硬件地址的强绑定进行了解耦但还是有一些不足的同一款芯片不同板子由于寄存器配置信息不同需要维护 N 份结构体代码内核越来越臃肿。改硬件配置要改 C 代码、重新编译内核非常麻烦。于是 Linux 引入了设备树Device Tree把结构体进一步抽象成文本配置文件硬件信息从 C 代码迁移到 DTS 文件彻底和内核代码分离。子系统负责解析设备树、自动构建设备、匹配驱动。这就是我们上个时代末尾提出的观点改硬件配置只需要改 DTS不用重新编译内核真正实现了 “配置即驱动”。在启动的时候内核自动读取DTS进行自动化配置。三、从源代码角度分析通用驱动 compatible 匹配如何实现自动化驱动关于下面的步骤不是研究内核的人可能很难掌握的很好。不过没有关系我们仅仅是想从源码的角度看看子系统到底如何实现自动匹配自动初始化的。这一块我们会在platform中更详细的分析。最后发现子系统这一套就是总线架构的实现即总线架构是一种设计思想而子系统是一个实现该思想的实例。它一直遵循着设备、驱动的解耦与匹配。1第一步设备树DTS—— 硬件信息的 “说明书”我们先在设备树中描述 LED 硬件核心是compatible属性告诉内核用哪个驱动2第二步驱动源码leds-gpio.c—— 通用驱动的核心实现我们简化源码只保留核心逻辑3第三步probe中调用深层函数真正写入寄存器四、通用驱动不是万能的驱动工程师的核心价值与兜底场景尽管通过刚刚的分析我们明白了一般情况下不需要驱动工程师直接写寄存器级别的操作函数这是因为内核中已经包含了市面上绝大多数外设的通用驱动在你裁剪内核的时候加入选项选择是否需要裁剪所以日常开发中只需要知道这个外设用的什么驱动然后对compatible属性赋值即可。不过如果出现一种新的外设比如你在芯片原厂工作那么这个probe函数就得你手动完成了。即所谓的子系统就是probe中的函数调用而这一切现在只能靠你自己写了。不过一般我们只要不是在芯片原厂工作则不会涉及到上述繁琐步骤在日常开发中选择提供了标准子系统的厂商即可。五、日常开发中如何写寄存器1设备树怎么查、怎么写驱动工程师的日常工作本质上就是通过设备树描述硬件把寄存器级的配置操作完全交给子系统自动完成。而设备树的编写核心只有一件事查 Binding 文档。在你的 Linux 内核源码中路径Documentation/devicetree/bindings/下存放着海量由半导体厂商、外设厂商贡献的.txt/.yaml文件它们就是设备树的官方使用说明书规范了每一款硬件的 DTS 写法。比如下图就是 Atmel 公司 GPIO 控制器的 Binding 文档里面清晰标注了必选属性Required propertiescompatible、reg、#gpio-cells、gpio-controller等是写 DTS 时必须严格遵守的规范属性含义说明每个字段的作用、格式要求完整 DTS 示例直接可以参考复用的配置模板。补充说明早期内核以.txt格式的 Binding 文档为主内容相对精简现代内核比如我用的Linux 6.8已全面转向.yaml格式不仅规范更严格还附带详细的使用手册链接、校验规则可查阅的信息更完善全面。不过这个使用文档通常不是很全面多以.txt文件为主。现代的厂家一般会提供.yaml格式文件并附带设备树使用手册的网页链接点进去可以详细看到更多使用方法更加完善全面。https://www.devicetree.org/这个是Linux提供的设备树公共手册可以查询到市面上几乎所有的硬件。2如何在运行中动态修改寄存器设备树是静态配置只会在初始化的时候配置一次寄存器但运行环境可能千变万化。不说修改外设的工作模式单单一个GPIO高低电平控制就是非常容易改变的那么我们如何在运行中动态修改寄存器的配置呢答案就在路径/home/hmy/linux-mini/linux-6.8/include/linux/gpio/下的consumer.h文件中consumer直译就是「消费者」代表使用 GPIO 的上层外设驱动工程师区别于提供 GPIO 控制器的芯片原厂工程师这个头文件里封装了 GPIO 子系统对外的标准通用 API比如gpiod_set_value、gpiod_direction_output等就是你在驱动中动态修改寄存器的唯一入口。比如下面就是gpio通用的一些函数这些 API 本质上就是Linux 版的「标准化 HAL 库」它屏蔽了不同厂商 GPIO 控制器的寄存器差异跨平台通用上层驱动只需要调用这些 API无需关心底层writel操作寄存器的细节所有寄存器修改都会通过 GPIO 子系统转发到底层厂商驱动完成彻底解耦硬件与业务逻辑。我们以后在写驱动代码的时候首先通过设备树静态配置外设的工作模式等属性然后在运行中利用consumer.h中提供的库函数动态修改即可。

相关文章:

子系统是啥?---总线架构的实例化

目录 一、新手容易踩的认知坑 二、历史演变:从硬编码到子系统设备树的转变 (1)原始裸奔时代:无结构体、无设备树、无总线架构 (2)结构体封装时代:有结构体、无设备树、有总线架构 &…...

【Kali Linux】 2026.1 新功能详解

2026年3月24日发布,基于 2025.4 的更新,带来全新视觉体验和多项新工具!🎨 2026 年度主题更新每年惯例的主题大换血,覆盖全流程:组件更新内容引导动画修复了实时镜像卡在第一帧的问题,循环更流畅…...

Java RAG入门基础教程(非常详细),用LangChain4j构建问答系统看这篇就够了!

1. 引言:为什么需要 RAG 1.1 大模型的局限性 在使用大语言模型(LLM)时,我们常常遇到以下问题: ❌ 问题 1:模型不知道企业内部信息用户:我们公司的年假政策是什么?AI:抱…...

C语言学习的第一周

1.自我介绍我姓马,来自成都的一个双非一本,目前大一,神秘专业,目前学c语言是兴趣使然和为了未来转码作铺垫,多项技能傍身也没错嘛2.学习目标打下c语言的坚实基础,方向初步是逐步从c语言到c再到更深度的知识…...

简易数据采集与分析系统

我用 Trae(SOLO Coder) 自主开发了这款专为硬件工程师打造的数据分析工具,无需懂代码,点点鼠标即可完成采集卡数据全流程分析。核心功能一键导入采集卡原始 ADC 数据,自动适配 12/16 位分辨率,精准转换为真…...

CSS如何利用Less快速生成颜色渐变背景_使用混合函数生成多样渐变

用带参数的.gradient-bg()混合函数,支持start-color、end-color、direction及透明度微调,避免硬编码;多色用.gradient-bg-stops();注意转义方向值、变量定义顺序、CSS变量分层及Safari渲染兼容性。Less混合函数怎么写才能生成可复…...

别再让图片拖慢你的多模态模型了:手把手教你用Q-Former和PruMerge压缩视觉Token(附代码)

视觉Token压缩实战:用Q-Former和PruMerge提升多模态模型效率 当你在深夜调试一个多模态问答系统时,突然收到告警——GPU显存爆了。查看日志发现,一张用户上传的4K产品图片生成了超过3万个视觉Token,直接拖垮了整个推理流程。这不是…...

深入解析MCU:从哈佛架构到智能家居应用

1. MCU的哈佛架构揭秘 第一次拆开智能音箱时,我盯着那块指甲盖大小的芯片发愣——这就是控制所有功能的"大脑"?后来才知道,这种叫MCU的微型计算机,核心秘密藏在它的哈佛架构里。想象你同时用两只手写字:左手…...

微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆

微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经因为手机丢失或系统升级,担心…...

HsMod:革新性炉石传说增强工具,全方位提升游戏体验

HsMod:革新性炉石传说增强工具,全方位提升游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 一、你是否也面临这些游戏痛点? 当你兴致勃勃地开启…...

Linux学习进展 计算机基本硬件结构

学习Linux系统,本质上是掌握“软件如何操控硬件”的逻辑——Linux作为开源操作系统,其内核与硬件的深度绑定的特性,决定了我们必须先理解计算机基本硬件结构,才能更清晰地明白Linux内核的调度机制、资源管理逻辑,以及后…...

Excel文件压缩难?这4个方法让文件秒变小,传输再也不卡壳!

在数据驱动的办公场景中,Excel文件的"臃肿"问题越来越普遍。比如财务部门每月导出的销售报表,因包含近百张动态图表和历史数据,文件大小可能达到几十MB;市场调研团队收集的问卷数据,若未做图片压缩&#xff…...

基于springboot+vue高校物资信息采购系统hx0807

文章目录详细视频演示技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 技术介绍 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomca…...

【2026春招必看】MiniMax大模型算法岗面试深度解析:薪资福利+核心考点+项目经验!手把手教你冲刺高薪Offer!

今天给大家梳理出来minmax的福利待遇,顺便分享面试大模型算法岗的面试题。喜欢本文记得收藏、关注、点赞。 废话不多说,我们要开车了。 薪资介绍 月薪(base) 应届/初级(1–2年):35K–50K / 月中…...

十大AI写作工具迎来深度评测,AIGC论文助手从功能性、稳定性等维度出发,量化分析其核心表现。

工具名称 核心优势 适用场景 aicheck 快速降AIGC率至个位数 AIGC优化、重复率降低 aibiye 智能生成论文大纲 论文结构与内容生成 askpaper 文献高效整合 开题报告与文献综述 秒篇 降重效果显著 重复率大幅降低 一站式论文查重降重 查重改写一站式 完整论文优化…...

5分钟搞懂LLM、Token、Agent,解锁AI核心价值!

本文深入浅出地解析了AI核心概念,从基础的大语言模型(LLM)到Token、Tools、Skills、MCP,再到智能体(Agent)的演进。强调了AI虽擅长语言生成但缺乏实际操作能力,并通过工具和接口(Too…...

MTK平台Camera移植避坑指南:从驱动添加到DWS配置的完整流程(基于Kernel 4.19)

MTK平台Camera移植避坑指南:从驱动添加到DWS配置的完整流程(基于Kernel 4.19) 在嵌入式设备开发中,Camera模块的移植往往是系统集成中最具挑战性的环节之一。特别是基于MTK平台的Android设备,Camera驱动的移植涉及从内…...

从LLM到A2A:AI工程师必备7大核心概念解析,掌握AI未来!

从 LLM 到 A2A:AI 工程师必须掌握的七个核心概念 大模型 API Agent MCP Skill A2A 全景解析 你是否曾经困惑:调用一个大模型 API 和「部署一个 Agent」到底有什么本质区别?MCP 和 Skill 都是「能力扩展」,为什么需要两套机制…...

5分钟上手libhv:用自带httpd和curl工具快速搭建本地测试服务

5分钟实战libhv:零配置构建高效本地HTTP测试环境 第一次听说libhv时,我正被一个紧急的前后端联调任务逼得焦头烂额。当时需要快速搭建一个模拟API服务,但Node.js环境配置卡在了权限问题上,Python的SimpleHTTPServer又无法满足复杂…...

Python 办公自动化封神篇:PDF+Word 全自动处理,从此告别复制粘贴!

前言每天对着一堆 PDF 合并拆分、Word 改格式、手动做报表?重复操作又累又容易错,Python 几行代码就能全自动搞定!这篇不讲废话、不搞应试,全是能直接用在工作 / 学习 / 小项目的干货,从读取、创建、批量生成到美化排版…...

数字后端 | Innovus 中解决 Congestion 的常用方法

前言 Congestion(布线拥塞)是数字后端实现中常见的问题。当局部区域标准单元过密、pin 密度过高或走线方向冲突时,就会出现 Congestion,最终可能导致 DRC 违例增多甚至布线失败。本文介绍在 Innovus 中如何查看和分析 Congestion&…...

Polars 2.0大规模清洗踩坑实录:3类隐性OOM陷阱+4步零拷贝修复法,DBA紧急封存的内部手册

第一章:Polars 2.0大规模清洗踩坑实录:3类隐性OOM陷阱4步零拷贝修复法,DBA紧急封存的内部手册三类隐性OOM陷阱真实复现 在处理12TB电商日志(单文件超80GB Parquet)时,Polars 2.0默认配置下静默触发OOM——非…...

Python程序员最后的护城河:掌握无GIL环境下的内存序建模、seq_cst原子操作与TSO一致性验证(附GCC/Clang内联汇编对照表)

第一章:Python程序员的无GIL并发觉醒:从CPython锁争用到真正并行的范式跃迁Python开发者长期在CPython解释器下与全局解释器锁(GIL)共处——它保障了内存管理的安全,却也悄然扼杀了多核CPU上真正的并行计算能力。当I/O…...

Docker镜像拉取超时?5分钟搞定国内镜像源加速配置(附最新可用镜像列表)

Docker镜像加速全攻略:2024国内镜像源配置与疑难排解 每次在终端输入docker pull后盯着进度条卡住不动,是不是感觉血压都在飙升?作为国内开发者,Docker官方镜像源的访问问题就像一场永远打不完的"拉锯战"。但别急着摔键…...

eNSP启动AR报错码40终极排查指南:从Hyper-V冲突到虚拟网卡修复

1. 遇到eNSP启动AR报错码40怎么办? 最近在折腾eNSP的时候,遇到了AR设备启动报错码40的问题,按照官方帮助手册排查了一圈都没解决。这种系统级的虚拟化冲突确实让人头疼,特别是当你急着做实验的时候。经过反复测试和查阅资料&#…...

双轴卷取分切机程序,PLC和触摸屏使用西门子smart200系列。 前后卷取双轴张力控制计算

双轴卷取分切机程序,PLC和触摸屏使用西门子smart200系列。 前后卷取双轴张力控制计算。 利用变频器模拟量输出控制张力。 卷取版型较好。 内部张力梯度算法理解后可用于恒张力卷取设备。 程序有完整注释,完整的设备图纸,方便理解阅读。 只包含…...

小红书合规引流新姿势:聚光平台落地页卡片制作全流程指南

小红书聚光平台合规引流实战手册:从落地页设计到高效转化全解析 在小红书这个日活超过2亿的内容社区里,企业营销人员和个体创业者最关心的莫过于如何在不触碰平台红线的前提下实现精准引流。聚光平台作为小红书官方推出的商业工具,其落地页卡…...

【信息科学与工程学】【管理科学】第十六篇 利益设计与分配:从静态薪酬到动态激励生态系统的工程化重构

1. 从静态薪酬到动态激励:一场组织动力系统的革命 记得三年前我参与过一家科技公司的薪酬体系改革项目。当时他们的CTO对我说:"我们给工程师的薪水在行业里算高的,但为什么总感觉大家没干劲?"这个问题困扰着无数技术管理…...

Aseprite新手必看:5分钟搞定像素角色基础动画(附完整工程文件)

Aseprite像素动画速成指南:从静态角色到生动动作的5分钟魔法 第一次打开Aseprite时,我被它简洁的界面和强大的功能震撼了——作为一个独立游戏开发者,我需要快速制作角色动画,但又不想陷入复杂的美术流程。经过多次实践&#xff…...

从原理到实战:LRU缓存算法的核心机制与工程实践

1. LRU缓存算法的基础原理 最近最少使用(LRU)算法是每个后端工程师都应该掌握的缓存淘汰策略。我第一次在线上系统使用LRU时,发现它完美解决了我们的缓存击穿问题。简单来说,LRU就像图书馆里整理书籍的管理员——总是把最近被借阅…...