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

驱动与设备的匹配流程如下:

  1. 内核启动时,注册所有platform_driver到platform总线。
  2. 设备树解析完成后,为每个匹配的节点创建platform_device。
  3. 总线匹配函数遍历驱动列表,通过of_device_id或id_table进行匹配。
  4. 匹配成功后调用驱动的probe函数,驱动在probe中获取资源并初始化硬件。
Platform驱动模型匹配流程 设备树节点 compatible = "vendor,dev" platform_device 资源列表 + 名称 总线匹配 of_match_table probe() 回调 获取资源 → 初始化 platform_driver probe/remove/id_table 匹配成功后,驱动通过 platform_get_resource() 系列API获取设备树中定义的硬件资源

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)
设备树节点 → 驱动资源映射 设备树节点 uart@ff000000 { compatible = "vendor,uart"; reg = <0xff000000 0x1000>; interrupts = <0 33 4>; clocks = <&uart_clk>; pinctrl-0 = <&uart_pins>; dmas = <&dma0 0>; }; 驱动获取的资源 IORESOURCE_MEM start=0xff000000, end=0xff000fff IORESOURCE_IRQ start=33, flags=IRQF_TRIGGER_HIGH struct clk *uart_clk struct pinctrl_state *pins struct dma_chan *dma_ch 驱动移植关键 修改设备树即可适配 不同硬件平台 驱动代码无需改动

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章 设备树验证、驱动调试、性能优化 完整驱动移植项目实战
课程学习路径(30章) 基础篇 第1-5章 Platform模型 设备树语法 进阶篇 第6-15章 中断/时钟/DMA GPIO/pinctrl 实战篇 第16-25章 多资源协同 电源管理 调试篇 第26-30章 验证/调试 性能优化 学习路径说明 每阶段包含理论讲解 + 代码演示 + 实战练习,逐步构建完整的驱动移植能力 建议按顺序学习,每章完成后完成课后练习,巩固知识点

1.4 本章小结

本章作为课程导论,介绍了Platform驱动模型的基本概念、设备树在驱动移植中的核心作用,以及本课程的学习目标与路径。从下一章开始,我们将深入设备树语法细节,学习如何编写和验证设备树源文件(.dts),为后续的资源解析打下坚实基础。

关键要点回顾:
  • Platform驱动模型通过虚拟总线实现设备与驱动的匹配,核心数据结构包括platform_device、platform_driver和resource。
  • 设备树将硬件资源描述从驱动代码中剥离,通过compatible属性实现驱动与设备的绑定。
  • 驱动通过platform_get_resource()、of_property_read_*()等API解析设备树属性,获取硬件资源。
  • 本课程共30章,分为基础、进阶、实战、调试四个阶段,循序渐进掌握驱动移植技能。