Linux驱动架构
一、设备驱动的位置┌─────────────────────────────────────────┐ │ 用户空间 (User Space) │ │ 应用程序 → read() / write() / ioctl() │ └─────────────────┬───────────────────────┘ │ 系统调用 (syscall) ┌─────────────────▼───────────────────────┐ │ 内核子系统层 │ │ VFS / Input / DRM / Network / Block │ │ 提供统一抽象接口 │ └─────────────────┬───────────────────────┘ │ 子系统API调用 ┌─────────────────▼───────────────────────┐ │ ┌─────────────────────────────────┐ │ │ │ 设备驱动层 (Device Driver) │ │ │ │ • 实现硬件特定的业务逻辑 │ │ │ │ • 调用控制器API操作硬件 │ │ │ │ • 向子系统注册如input_register│ │ │ └─────────────────────────────────┘ │ │ ↓ 调用 │ │ ┌─────────────────────────────────┐ │ │ │ 控制器驱动层 (Controller) │ │ │ │ • SoC内置IP核驱动I2C/SPI/GPIO│ │ │ │ • 提供标准APIi2c_transfer等 │ │ │ └─────────────────────────────────┘ │ │ ↓ 寄存器读写 │ │ ┌─────────────────────────────────┐ │ │ │ 硬件寄存器层 │ │ │ │ • 实际物理地址0x02000000等 │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘设备驱动的确切位置上方对接内核子系统通过子系统API注册下方调用控制器驱动通过总线API操作硬件角色中间层承上启下二、完整Linux系统流程图┌─────────────────────────────────────────────────────────────────────────┐ │ 用户空间 (User Space) │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │ │ │ Shell │ │ App │ │ GUI │ │ Daemon │ │ 用户态驱动(lib) │ │ │ │ bash/zsh│ │ cat │ │ Qt/GTK │ │ systemd│ │ libusb/libpci │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────────┬────────┘ │ │ │ │ │ │ │ │ │ └────────────┴────────────┴────────────┴─────────────────┘ │ │ │ │ │ 系统调用接口 (System Call) │ │ int 0x80 / syscall / sysenter / svc │ └────────────────────────────────────┬────────────────────────────────────┘ │ ┌────────────────────────────────────▼────────────────────────────────────┐ │ 内核空间 (Kernel Space) │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 系统调用处理层 (Entry) │ │ │ │ sys_read() / sys_write() / sys_ioctl() / sys_open() ... │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 内核子系统层 (Subsystems) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ VFS │ │ Input │ │ DRM │ │ Network │ │ Block │ │ │ │ │ │(fs/) │ │(drivers/│ │(drivers/│ │ (net/) │ │(block/)│ │ │ │ │ │ │ │input/) │ │gpu/drm/)│ │ │ │ │ │ │ │ │ │文件系统 │ │输入设备 │ │显示设备 │ │网络协议 │ │块设备 │ │ │ │ │ │抽象层 │ │抽象层 │ │抽象层 │ │栈 │ │抽象层 │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 提供统一设备模型 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 设备驱动框架层 (Frameworks) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ Platform│ │ I2C │ │ SPI │ │ USB │ │ PCI │ │ │ │ │ │(片上设备)│ │(两线串行)│ │(四线串行)│ │(通用串行)│ │(高速) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │设备树匹配│ │设备枚举 │ │片选控制 │ │热插拔 │ │配置空间│ │ │ │ │ │资源分配 │ │地址扫描 │ │全双工 │ │带宽管理 │ │DMA能力│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 总线类型与设备发现机制 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 控制器驱动层 (Controller Drivers) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ GPIO │ │ I2C │ │ DMA │ │ Clock │ │ Reset │ │ │ │ │ │Controller│ │Controller│ │ Engine │ │ (CCU) │ │Control │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │引脚复用 │ │时序控制 │ │内存拷贝 │ │时钟树 │ │复位序列│ │ │ │ │ │中断触发 │ │起始停止 │ │中断聚合 │ │PLL配置 │ │模块级 │ │ │ │ │ │(pinctrl)│ │(i2c_algo)│ │(dmaengine)│ │(clk) │ │(reset) │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ SoC内置IP核驱动与具体芯片强相关 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 具体设备驱动层 (Device Drivers) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ LCD │ │ Touch │ │ NVMe │ │ USB │ │ Audio │ │ │ │ │ │ (DRM) │ │ (Input) │ │ (Block) │ │ Net │ │ (ALSA) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │调用DE2.0│ │调用I2C │ │调用PCIe │ │调用USB │ │调用I2S │ │ │ │ │ │配置时序 │ │读取坐标│ │配置NVMe │ │控制网卡 │ │传输音频│ │ │ │ │ │注册DRM │ │注册Input│ │注册Block│ │注册Net │ │注册ALSA│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 承上子系统启下控制器的中间层 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 硬件抽象层 (Hardware Abstraction) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ readl │ │ writel │ │ ioremap│ │ dma_map│ │ request│ │ │ │ │ │ readl_relaxed │ │ iounmap│ │ dma_unmap │ │ irq │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │读32位寄存器│ │写32位寄存器│ │映射物理地址│ │DMA内存映射│ │申请中断│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 体系结构相关操作ARM/x86/RISC-V差异封装 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ └───────────────────────────────────────┼──────────────────────────────────┘ │ ┌───────────────────────────────────────▼──────────────────────────────────┐ │ 硬件层 (Hardware) │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ SoC芯片 (T113-I) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ CPU │ │ DE2.0 │ │ I2C │ │ GPIO │ │ DMA │ │ │ │ │ │ Core │ │ Display │ │Controller│ │Controller│ │Engine │ │ │ │ │ │ │ │ Engine │ │ │ │ │ │ │ │ │ │ │ │执行指令 │ │图层混合 │ │串行通信 │ │引脚控制 │ │数据搬运│ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └────────┘ │ │ │ │ 寄存器地址0x02000000 (CCU) / 0x05000000 (DE) 等 │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 片外设备 (External Devices) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ DDR │ │ eMMC │ │ LCD │ │ Touch │ │ PHY │ │ │ │ │ │ Memory │ │ Flash │ │ Panel │ │ (GT911)│ │(Ethernet│ │ │ │ │ │ │ │ │ │ │ │ │ │ PHY) │ │ │ │ │ │数据暂存 │ │持久存储 │ │显示输出 │ │触摸输入 │ │网络接口│ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └────────┘ │ │ │ │ 通过PCB走线连接DDR总线 / SDIO / I2C / SPI / RGB / MDIO │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘三、T113-I实例GT911触摸驱动的完整调用链用户手指触摸屏幕 │ ▼ 电容变化 ┌─────────────────────────────────────────┐ │ 片外设备GT911芯片I2C地址0x14 │ │ PE1引脚电平下降INT中断 │ └─────────────┬───────────────────────────┘ │ 硬件中断 ┌─────────────▼───────────────────────────┐ │ 硬件层GIC中断控制器T113-I片内 │ │ 中断号映射 → CPU收到IRQ │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 内核子系统IRQ子系统 │ │ handle_IRQ() → 查找irq_desc → 调用handler│ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 控制器驱动TWI2/I2C控制器驱动 │ │ sunxi_i2c_irq() → 处理I2C中断 │ │ 唤醒等待队列 → i2c_transfer()完成 │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 设备驱动GT911触摸驱动 │ │ gt911_irq_handler() │ │ ├──► i2c_smbus_read_block_data() 读取坐标│ │ ├──► 坐标变换swap/invert │ │ └──► input_report_abs() 上报事件 │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 内核子系统Input子系统 │ │ input_event() → 插入evdev队列 │ │ 唤醒poll/select → 用户空间可读 │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 用户空间Qt/Android应用 │ │ read(/dev/input/event0) → 获取触摸坐标 │ │ 更新UI界面 │ └─────────────────────────────────────────┘四、关键层次总结层次核心职责T113-I实例用户空间业务逻辑Qt应用显示界面系统调用用户/内核边界read() → sys_read()内核子系统资源抽象管理Input子系统统一处理所有输入设备设备驱动框架总线协议管理I2C框架管理总线仲裁、设备枚举控制器驱动SoC IP核操作sunxi_i2c驱动操作TWI2寄存器硬件抽象体系结构封装readl/writel实现ARM内存屏障硬件层物理信号I2C SCL/SDA电平变化、中断信号五、总结设备驱动位于内核子系统和控制器驱动之间是承上启下的关键层向上通过子系统API注册如input_register_device向下调用控制器API操作硬件如i2c_transfer。它不是简单的建立连接而是实现业务逻辑、数据转换、电源管理、中断处理的完整软件层。

相关新闻

别再手动发群消息了!企业微信外部群自动化推送的架构设计与实现

别再手动发群消息了!企业微信外部群自动化推送的架构设计与实现

​​QiWe开放平台 个人名片 API驱动企微自动化,让开发更高效 核心能力:API 驱动企微自动化,提升开发效率 官方站点:https://www.qiweapi.com 对接通道:进入官方站点联系客服 团队定位:企微生态深度服务&am…

2026/5/17 2:47:18 阅读更多 →
Qt Creator中不写代如何设置 QLabel的颜色

Qt Creator中不写代如何设置 QLabel的颜色

在Qt Creator中完全不用写代码,纯可视化操作就能设置QLabel的文字颜色、背景颜色,步骤超简单,基于Qt Designer可视化界面操作即可,全程点选设置:前提打开Qt Creator的.ui文件,在Qt Designer画布中选中需要设…

2026/5/17 2:47:15 阅读更多 →
企业年会大屏投票小程序:亲测好用案例分享

企业年会大屏投票小程序:亲测好用案例分享

技术痛点引入公司企业年会大屏扫码实时节目投票小程序的数据同步与用户体验优化是当前行业普遍面临的难题。解决方案定位熹乐互动针对这一问题提供了专业解决方案,通过其先进的技术手段和丰富的实践经验,显著提升了系统的稳定性和用户满意度。技术详解该…

2026/7/4 11:30:03 阅读更多 →

最新新闻

利用RAG构建品牌AI知识库:六步SOP提升技术影响力

利用RAG构建品牌AI知识库:六步SOP提升技术影响力

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 你的品牌、产品、技术文档,是否正在被 AI 遗忘?当开发者向 ChatGPT、Claude 或国内大模型提问“如何集成 XX S…

2026/7/5 3:25:01 阅读更多 →
DesignWare® Cores LPDDR5/4/4x PHY for TSMC12FFC18 Databook的中文版

DesignWare® Cores LPDDR5/4/4x PHY for TSMC12FFC18 Databook的中文版

DesignWare Cores LPDDR5/4/4x PHY for TSMC12FFC18 Databook的中文版,dwc_lpddr54_phy_tsmc12ffc18- Product Code: D774-0,PHY Version: 2.40a July 8, 2021,是DW LPDDR5/4 PHY在TSMC12FFC工艺下的技术数据手册,为芯片设计者提供…

2026/7/5 3:25:01 阅读更多 →
曲线曲线2D解析求交方案

曲线曲线2D解析求交方案

曲线曲线2D解析求交方案 文章目录曲线曲线2D解析求交方案一. 2D 点到椭圆的最近点计算1. 推荐主方案:λ 方程 Halley bracket 保护2. bracket 区间3. Halley bracket 保护4. Newton bracket 对比实现5. 轴线和中心特殊情况6. 椭圆弧最近点7. 方向角初值方案的定位…

2026/7/5 3:23:00 阅读更多 →
Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

今天为大家带来DbSet.Local属性的使用与实现。和上次介绍的Find函数首先查找context中缓存的实体类似,DbSet的Local属性也是返回context中缓存并且被跟踪的实体。不同点在于,Local属性不会返回状态为EntityState.Deleted的实体,且即使缓存中什…

2026/7/5 3:23:00 阅读更多 →
面试官问:项目中分布式事务怎么处理的?

面试官问:项目中分布式事务怎么处理的?

第一层:先讲本地事务 Transactional(基础铺垫)先从单体本地事务切入,体现基础功底:单体服务单库场景,我们用 Spring 的 Transactional 声明式本地事务;底层依靠 AOP 实现,保证同一个…

2026/7/5 3:23:00 阅读更多 →
KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

1. 项目概述:KARL权限模型不是“配个role”就完事的系统工程KARL——这个在开源知识协作领域低调但极具设计深度的平台,它的权限体系远非传统RBAC(基于角色的访问控制)所能简单概括。我第一次接触KARL是在2021年参与一个高校数字人…

2026/7/5 3:18:59 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻