1. 项目概述:Platform驱动与设备树开发框架解析
在嵌入式Linux开发中,Platform驱动和设备树的结合使用是硬件外设驱动开发的标准模式。以正点原子i.MX6ULL开发板的LED控制驱动为例,这种架构完美体现了Linux内核"驱动与硬件分离"的设计哲学。Platform驱动作为Linux设备驱动模型的核心组成部分,与字符设备框架协同工作,通过设备树动态获取硬件资源,实现了真正的"一次编写,多处适配"。
关键设计理念:通过设备树描述硬件,驱动只关注操作逻辑,这种解耦设计使得同一份驱动代码可以适配不同电路板,只需修改设备树而无需重新编译驱动。
2. 核心架构设计解析
2.1 五层架构分解
典型的Platform驱动+字符设备架构包含以下层级:
- 用户空间接口层:通过/dev节点提供文件操作接口
- VFS抽象层:处理open/read/write等系统调用
- 字符设备框架层:实现file_operations结构体
- Platform驱动层:处理设备树匹配和资源获取
- 硬件操作层:直接控制GPIO等物理设备
c复制// 典型结构体关系图示
struct platform_driver ────┐
│ │
├─ probe() │
│ ├─ alloc_chrdev_region()
│ ├─ cdev_init() │
│ └─ device_create()├─── struct file_operations
│ │ │
└─ remove() │ └─ .owner = THIS_MODULE
│ └─ .write = led_write
struct of_device_id ──────┘
2.2 设备树与驱动的交互机制
设备树作为硬件描述文件,与Platform驱动的交互主要通过以下关键步骤:
- 匹配机制:驱动中定义的compatible字符串必须与设备树节点完全一致
- 资源获取:驱动probe函数通过of_系列API读取设备树中的硬件参数
- 平台设备注册:内核启动时会将设备树节点转换为platform_device
dts复制// 设备树节点示例
led_platform {
compatible = "atk,led-platform";
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
status = "okay";
};
3. 关键模块实现细节
3.1 驱动数据结构设计
驱动核心数据结构需要同时满足字符设备和Platform驱动的需求:
c复制struct led_platform_dev {
dev_t devid; // 设备号
struct cdev cdev; // 字符设备
struct class *class; // 设备类
struct device *device; // 设备节点
struct device_node *nd; //
