1. Linux设备发现的三种境界概述
在嵌入式Linux开发领域,设备发现机制经历了从原始到智能的演进过程。作为一名长期从事Linux驱动开发的工程师,我见证了设备管理从手动注册到自动枚举的完整技术变迁。这个过程不仅反映了Linux内核设计的哲学演变,也体现了现代硬件架构对操作系统提出的新要求。
设备发现的核心任务是让操作系统识别并管理硬件资源。在早期的嵌入式项目中,我们常常需要手动编写板级支持包(BSP),逐个注册设备节点。随着设备树(DTS)的引入和设备模型的完善,现在的Linux内核已经能够实现相当智能的硬件发现和管理。这种进步极大降低了嵌入式开发的复杂度,特别是对于像MTK 6890这样的多核异构平台,合理的DTS配置可以节省大量底层调试时间。
2. 第一境界:手动设备注册
2.1 传统板级初始化方式
在早期的Linux 2.4内核时代,ARM平台的设备注册完全依赖手工编码。开发者需要在arch/arm/mach-*/目录下创建板级支持文件,使用platform_device_register()等API逐个注册设备。这种方式虽然直接,但存在几个明显问题:
- 内核代码与硬件强耦合,更换硬件平台需要重新编译内核
- 设备资源(IRQ、内存映射等)需要在代码中硬编码
- 不同板级的支持代码无法复用
c复制/* 典型的老式板级初始化代码示例 */
static struct resource demo_resources[] = {
[0] = {
.start = 0x12340000,
.end = 0x1234ffff,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 42,
.end = 42,
.flags = IORESOURCE_IRQ,
}
};
static struct platform_device demo_device = {
.name = "demo-device",
.id = -1,
.resource = demo
