1. 课程导论:网关驱动加载流程概述
1.1 网关驱动加载流程全景
嵌入式网关作为工业与车载网络的核心枢纽,其驱动加载流程决定了外设的发现时机、中断响应速度以及数据通路稳定性。本课程以 CAN(Controller Area Network)外设驱动注册 为切入点,系统讲解从设备树解析到驱动 probe 的完整链路。
下图展示了网关驱动加载的宏观阶段,其中设备树匹配是连接硬件描述与软件驱动的关键桥梁:
关键认知: 设备树(Device Tree)是 Linux 内核用于描述硬件拓扑的扁平数据结构。网关驱动加载的实质是“设备树节点 → platform_device → 驱动 probe”的逐级展开过程。CAN 外设的驱动注册必须等待设备树匹配成功后才能进行。
1.2 设备树与 CAN 外设驱动注册的关系
设备树为 CAN 控制器提供了静态硬件描述,包括寄存器基址、中断号、时钟频率、波特率参数等。驱动则通过 of_match_table 与设备树节点建立绑定关系。下表总结了设备树节点与驱动结构体之间的映射:
| 设备树节点属性 | 驱动对应结构/宏 | 作用说明 |
|---|---|---|
compatible = "vendor,can-ctrl" |
of_match_table 中的 .compatible |
驱动与设备树节点的匹配标识 |
reg = <0x0 0x1c00000 0x0 0x1000> |
platform_get_resource(pdev, IORESOURCE_MEM, 0) |
获取 CAN 控制器的 MMIO 地址范围 |
interrupts = <0 55 4> |
platform_get_irq(pdev, 0) |
获取 CAN 中断号及触发类型 |
clocks = <&can_clk> |
devm_clk_get(dev, NULL) |
获取 CAN 控制器工作时钟 |
bosch,can-sample-point = <875> |
of_property_read_u32() |
读取自定义采样点参数 |
驱动注册的典型流程如下:
- 设备树编译与加载:
.dts源文件编译为.dtb,由 bootloader 传递给内核。 - 平台设备创建: 内核在
of_platform_populate()中遍历设备树根节点,为每个compatible属性匹配的节点创建platform_device。 - 驱动匹配: 总线驱动(platform bus)遍历已注册的
platform_driver,调用of_match_device()比对of_match_table。 - probe 执行: 匹配成功后调用驱动的
probe函数,在此函数中完成 CAN 控制器的寄存器初始化、net_device注册、中断申请等操作。
实践提示: 在调试 CAN 驱动加载问题时,首先检查
/sys/firmware/devicetree/base/ 下是否存在对应的设备树节点,然后查看 /sys/bus/platform/drivers/ 中驱动是否绑定成功。使用 of_device_is_available() 可以判断节点 status 是否为 "okay"。
1.3 学习目标与前置知识
本课程面向具备嵌入式 Linux 基础开发经验的工程师,旨在帮助学员建立从设备树到驱动注册的完整认知链路。完成本章节后,学员应达到以下目标:
- 理解 网关驱动加载的宏观阶段划分,明确设备树在其中的定位。
- 掌握 设备树节点属性与驱动结构体之间的映射关系。
- 能够 分析 CAN 外设驱动注册过程中设备树匹配失败的根本原因。
- 具备 独立阅读和修改 CAN 控制器设备树节点的能力。
建议前置知识储备:
| 知识领域 | 具体要求 | 推荐参考 |
|---|---|---|
| Linux 内核模块编程 | 理解 module_init、module_exit、platform_driver 结构 | 《Linux Device Drivers》第 2 章 |
| 设备树语法 | 熟悉节点、属性、reg、interrupts 的写法 | devicetree-specification v0.4 |
| CAN 协议基础 | 了解 CAN 2.0B 帧格式、位时序、仲裁机制 | ISO 11898-1 标准 |
| 中断子系统 | 了解 request_irq、中断号、中断触发类型 | 内核文档 Documentation/core-api/genericirq.rst |
下图展示了本课程的知识体系结构,帮助学员建立全局视角:
常见误区: 初学者容易将设备树中的
reg 属性与驱动中的 ioremap 混淆。设备树只提供物理地址描述,驱动必须通过 devm_ioremap_resource() 或 of_iomap() 将物理地址映射到内核虚拟地址空间后才能访问寄存器。此外,compatible 属性的字符串必须与驱动中的 of_match_table 完全一致(包括大小写和通配符),否则匹配会静默失败。
通过本章节的导论,学员应能清晰理解网关驱动加载的整体脉络,明确设备树在 CAN 外设驱动注册中的核心作用,并为后续章节的深入学习奠定基础。下一阶段将深入设备树节点解析与 platform_device 创建的细节。