1. ARM嵌入式开发实战:Platform总线与DTS深度整合
在嵌入式Linux开发中,Platform总线和设备树(Device Tree)的结合使用已经成为现代内核开发的标配方案。相比传统方式,这种组合带来了显著的维护优势:
-
传统方式:每支持一块新板子,就需要在内核源码
arch/arm/mach-xxx/目录下新增一个C文件,充斥着platform_device_register、resource定义和gpio数组等重复代码。这些文件动辄几百行,可读性差且难以维护。 -
DTS方式:板级描述变成了几百行结构化的文本,不再需要为每块板子编写内核代码。主流架构的
mach-xxx目录现在只保留核心代码,大量板级文件已被移除。
这种转变带来的直接好处是内核更干净,维护者更容易审查硬件描述。设备树通过总线匹配机制,只有在匹配成功后才查找设备节点,避免了大量无用功。
1.1 核心实现机制
关键数据结构of_device_id用于定义设备树匹配表:
c复制static const struct of_device_id match_table[] = {
[0] = {.compatible = "pt-led"}
};
在平台驱动注册时,这个匹配表会被关联到驱动结构体:
c复制static struct platform_driver drv = {
.probe = probe,
.remove = remove,
.driver = {
.name = DEV_NAME,
.of_match_table = match_table
}
};
匹配的核心是compatible属性,与设备节点中的名称无关。当compatible匹配成功后,内核会自动调用probe函数,此时我们可以完成设备初始化:
c复制static int probe(struct platform_device *pdev)
{
struct device_node *pnode = of_find_node_by_path("/pt_led");
// 获取设备树属性并初始化硬件
...
}
关键细节:设备树节点路径和属性名称必须严格匹配,否则会导致初始化失败。在实际开发中,建议使用
of_property_read_*系列函数时添加错误检查。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. GPIO子系统实战解析
Linux GPIO子系统为开发者提供了统一的GPIO操作接口,避免了直接操作寄存器带来的移植性问题。相比原始的ioremap方式,GPIO子系统的主要优势包括:
- 自动处理地址映射
- 提供标准的API
