1. 课程导论:Platform驱动模型概述、设备树在驱动移植中的核心作用、课程目标与学习路径
1.1 Platform驱动模型概述
在Linux内核中,Platform驱动模型(Platform Driver Model)是用于管理那些不挂载在PCI、USB、I2C、SPI等标准总线上,而是直接由CPU内存映射或中断控制器连接的设备的一种虚拟总线机制。它通过platform_bus_type将设备(platform_device)与驱动(platform_driver)进行匹配,实现设备资源的动态分配与驱动加载。
核心设计思想:将硬件描述与驱动代码分离。驱动只关注如何操作硬件,而硬件资源(地址、中断、DMA通道等)由设备节点提供,从而实现跨平台移植。
Platform驱动模型的核心数据结构包括:
| 数据结构 | 作用 | 关键字段 |
|---|---|---|
platform_device |
描述一个平台设备,包含设备名称、ID、资源列表 | name, id, num_resources, resource |
platform_driver |
描述一个平台驱动,包含probe/remove回调及匹配表 | probe, remove, driver, id_table |
resource |
描述设备的硬件资源(IO内存、中断、DMA) | start, end, flags, name |
of_device_id |
设备树匹配表,用于与设备树节点进行匹配 | compatible, data |
驱动与设备的匹配流程如下:
- 内核启动时,注册所有
platform_driver到platform总线。 - 设备树解析完成后,为每个匹配的节点创建
platform_device。 - 总线匹配函数遍历驱动列表,通过
of_device_id或id_table进行匹配。 - 匹配成功后调用驱动的
probe函数,驱动在probe中获取资源并初始化硬件。
1.2 设备树(Device Tree)在驱动移植中的核心作用
设备树是一种描述硬件拓扑结构的数据结构,以节点(node)和属性(property)的形式描述CPU、内存、外设、中断控制器、时钟等硬件信息。在驱动移植中,设备树扮演着硬件配置清单的角色,使得同一份驱动代码无需修改即可适配不同硬件平台。
关键优势:设备树将硬件资源从驱动代码中剥离,驱动只需通过API解析设备树属性即可获取寄存器地址、中断号、时钟频率、GPIO引脚等参数,极大提升了代码的可移植性。
设备树在驱动移植中的核心作用体现在以下几个方面:
- 资源描述标准化:通过
reg属性定义IO内存地址范围,interrupts属性定义中断号,clocks属性定义时钟源。 - 匹配机制:通过
compatible属性将设备节点与驱动进行绑定,支持多平台兼容。 - 引脚配置:通过
pinctrl-*属性配置引脚复用功能,无需修改驱动代码。 - 电源管理:通过
power-domains属性描述设备所属的电源域。 - DMA配置:通过
dmas属性描述DMA通道及请求线。
| 设备树属性 | 对应资源类型 | 驱动获取API |
|---|---|---|
reg |
IO内存地址范围 | platform_get_resource(pdev, IORESOURCE_MEM, index) |
interrupts |
中断号及触发类型 | platform_get_resource(pdev, IORESOURCE_IRQ, index) |
clocks |
时钟句柄 | of_clk_get(np, index) |
dmas |
DMA通道 | of_dma_request_slave_channel(np, name) |
gpios |
GPIO引脚 | of_get_named_gpio(np, name, index) |
1.3 课程目标与学习路径
本课程旨在帮助嵌入式Linux开发者系统掌握Platform驱动移植的核心技能,特别是如何通过设备树属性解析来获取硬件资源,并完成驱动的移植与调试。课程从基础概念出发,逐步深入到实战案例,确保学员能够独立完成从设备树编写到驱动验证的完整流程。
前置要求:学员需具备C语言基础、Linux内核模块编程基础,了解基本的嵌入式硬件知识(寄存器、中断、时钟等)。建议先完成《Linux内核模块开发入门》课程。
课程核心目标:
- 理解Platform驱动模型的工作原理与匹配机制。
- 掌握设备树语法、绑定规则及常用属性。
- 熟练使用
platform_get_resource()、of_property_read_*()等API解析设备树属性。 - 能够独立完成一个外设驱动的设备树编写与驱动移植。
- 掌握驱动调试方法,包括
dev_dbg()、print_hex_dump()及设备树验证工具。
学习路径规划:
| 阶段 | 章节范围 | 核心内容 | 实践任务 |
|---|---|---|---|
| 基础篇 | 第1-5章 | Platform模型、设备树语法、资源API | 编写简单字符设备驱动 |
| 进阶篇 | 第6-15章 | 中断、时钟、DMA、GPIO、pinctrl解析 | 移植UART/SPI/I2C驱动 |
| 实战篇 | 第16-25章 | 多资源协同、电源管理、DMA引擎 | 移植网卡/音频/摄像头驱动 |
| 调试篇 | 第26-30章 | 设备树验证、驱动调试、性能优化 | 完整驱动移植项目实战 |
1.4 本章小结
本章作为课程导论,介绍了Platform驱动模型的基本概念、设备树在驱动移植中的核心作用,以及本课程的学习目标与路径。从下一章开始,我们将深入设备树语法细节,学习如何编写和验证设备树源文件(.dts),为后续的资源解析打下坚实基础。
关键要点回顾:
- Platform驱动模型通过虚拟总线实现设备与驱动的匹配,核心数据结构包括
platform_device、platform_driver和resource。 - 设备树将硬件资源描述从驱动代码中剥离,通过
compatible属性实现驱动与设备的绑定。 - 驱动通过
platform_get_resource()、of_property_read_*()等API解析设备树属性,获取硬件资源。 - 本课程共30章,分为基础、进阶、实战、调试四个阶段,循序渐进掌握驱动移植技能。