1.检查节点的 compatible 属性是否包含 "arm" 或 "primecell"。如果是,则不将该节点转换为 platform_device,而是将其识别为 AMBA 设备。 这个规则的目的是什么
在Linux内核的设备树处理逻辑中,当节点的compatible属性包含"arm"或"primecell"时,内核会将其识别为AMBA(Advanced Microcontroller Bus Architecture)设备而非通用的platform_device。这一规则的核心目的是:
1. 适配ARM架构的专用总线协议
- AMBA总线标准:
AMBA是ARM提出的片上总线协议(如AHB、APB),广泛用于ARM SoC(如Cortex-A/R系列芯片)。AMBA设备(如ARM PrimeCell外设)需遵循特定的地址映射、中断处理和时钟管理规则。- 示例:
"arm,primecell"是ARM PrimeCell外设(如PL011 UART、PL031 RTC)的标识符。这些设备直接集成在AMBA总线上,需通过AMBA子系统管理。
- 示例:
- 驱动模型差异化:
AMBA设备使用amba_device结构体而非platform_device,其驱动需通过amba_driver接口注册。这种设计允许内核:- 自动处理AMBA总线的地址解码、中断路由等底层细节。
- 集成AMBA特定的电源管理、时钟门控等优化机制。
2. 避免与通用平台设备模型冲突
- 功能重叠与优先级:
若将AMBA设备强制转换为platform_device,可能导致:- 驱动不兼容:通用平台驱动无法正确处理AMBA设备的专用寄存器布局或时序要求。
- 资源冲突:AMBA设备可能共享同一总线的地址空间或中断线,需通过AMBA子系统统一协调。
- 内核设计原则:
Linux内核通过bus_type机制隔离不同总线协议(如PCI、I2C、AMBA)。将AMBA设备归类到amba_bus_type可确保:- 驱动按总线类型自动匹配(如
amba_driver绑定amba_device)。 - 资源分配(如内存区域、中断号)遵循AMBA规范。
- 驱动按总线类型自动匹配(如
3. 支持ARM生态的硬件抽象
- PrimeCell外设标准化:
ARM PrimeCell是一组标准外设(UART、SPI、I2C等),其设备树节点通过"arm,primecell"标识。内核通过AMBA子系统提供统一的驱动支持,简化多SoC平台的兼容性。- 示例:
某ARM SoC的UART控制器可能通过以下节点描述:
内核会将其转换为uart@90000000 { compatible = "arm,pl011"; // PrimeCell PL011 UART reg = <0x90000000 0x1000>; interrupts = <1 34>; // IRQ号需按AMBA规范处理 };amba_device,并加载amba_pl011_driver驱动。
- 示例:
- 历史兼容性:
早期ARM设备广泛使用AMBA总线,内核通过保留"arm"和"primecell"的特殊处理,确保旧硬件驱动的兼容性。
规则的深层逻辑
-
为什么需要排除AMBA设备?
AMBA设备依赖总线控制器(如AMBA主机)完成底层通信(如地址译码、仲裁)。若将其视为普通平台设备,内核可能无法正确初始化总线控制器,导致设备无法访问。 -
如何与设备树层级协作?
AMBA总线控制器本身可能通过"simple-bus"描述(如SoC根节点),其子节点中包含"arm,primecell"的设备会被自动识别为AMBA设备。这种层级关系确保:- 总线控制器通过
platform_device初始化。 - 挂载的设备通过
amba_device管理,形成完整的总线拓扑。
- 总线控制器通过
总结
该规则通过"arm"/"primecell"标识符,将设备归类到AMBA子系统,实现了:
- 总线协议适配:确保AMBA设备遵循ARM的硬件规范(地址映射、中断处理)。
- 驱动模型隔离:使用
amba_driver而非platform_driver,避免功能冲突。 - 生态兼容性:统一支持ARM PrimeCell等标准外设,简化多SoC平台的驱动开发。
这一机制是Linux内核对ARM架构深度优化的体现,确保了AMBA设备在嵌入式系统中的高效、可靠运行。
2."arm"和"primecell"的区别是什么呢
在Linux设备树中,"arm"和"primecell"是两个与ARM架构相关的compatible属性值,但它们的用途和含义有显著区别:
1. "arm" 属性
-
定义:
"arm"通常用于标识ARM架构相关的总线控制器或核心组件,如AMBA总线控制器、ARM处理器核心等。 -
用途:
- 总线控制器描述:
当节点描述的是AMBA总线控制器(如AHB、APB总线)时,可能使用"arm"属性。例如:amba_bus { compatible = "arm,amba-bus"; // 标识AMBA总线控制器 #address-cells = <1>; #size-cells = <1>; ranges; }; - 核心组件抽象:
某些ARM核心组件(如中断控制器、时钟控制器)可能直接使用"arm"作为兼容性标识,表示其遵循ARM的通用设计规范。
- 总线控制器描述:
-
典型场景:
- 描述SoC内部的AMBA总线拓扑。
- 标识ARM提供的标准外设(如某些型号的定时器、看门狗)。
2. "primecell" 属性
-
定义:
"primecell"是ARM定义的标准外设IP核的标识符,代表一组预定义的外设设计(如UART、SPI、I2C控制器)。这些外设遵循严格的硬件规范,确保跨SoC的兼容性。 -
用途:
-
标准化外设描述:
当节点描述的是ARM PrimeCell外设时,必须使用"primecell"属性。例如:uart@90000000 { compatible = "arm,pl011"; // PL011是PrimeCell UART的型号 reg = <0x90000000 0x1000>; interrupts = <1 34>; };此处
"arm,pl011"是"primecell"属性的具体实现,表示该UART遵循PL011设计规范。 -
驱动自动匹配:
内核通过"primecell"属性识别PrimeCell外设,并自动加载对应的驱动(如amba_pl011_driver),无需手动配置。
-
-
典型场景:
- 描述ARM官方提供的标准外设(如PL011 UART、PL031 RTC)。
- 确保不同厂商的SoC在集成相同PrimeCell外设时,驱动可无缝兼容。
核心区别
| 特性 | "arm" 属性 | "primecell" 属性 |
|---|---|---|
| 描述对象 | 总线控制器、核心组件 | 标准外设IP核(如UART、SPI) |
| 用途 | 总线拓扑、核心功能抽象 | 标准化外设描述与驱动匹配 |
| 驱动模型 | 通常关联platform_device | 关联amba_device(AMBA子系统) |
| 兼容性层级 | 顶层架构级兼容 | 外设级兼容(跨厂商) |
| 典型值示例 | "arm,amba-bus" | "arm,pl011"(UART) |
深层逻辑
- 为什么需要区分?
- 总线 vs. 外设:
"arm"用于描述总线控制器或核心组件,而"primecell"专门针对外设IP核。这种区分允许内核:- 对总线控制器使用
platform_device模型。 - 对PrimeCell外设使用
amba_device模型,利用AMBA子系统的专用优化(如地址解码、中断路由)。
- 对总线控制器使用
- 标准化需求:
ARM通过"primecell"强制推行外设设计的标准化,确保不同厂商的SoC在集成相同PrimeCell外设时,驱动代码无需修改即可复用。
- 总线 vs. 外设:
总结
"arm":标识与ARM架构相关的总线或核心组件,用于顶层硬件抽象。"primecell":标识ARM标准外设IP核,确保外设级的跨平台兼容性。
这一区分是Linux内核对ARM架构深度优化的体现,既支持了总线控制器的通用管理,又实现了外设驱动的标准化和自动化。
191

被折叠的 条评论
为什么被折叠?



