Linux 设备树解析中区分 Platform 设备与非 Platform 设备
在 Linux 内核解析设备树 (Device Tree) 时,区分 Platform 设备和非 Platform 设备主要依据以下几个标准:
Platform 设备的识别特征
-
直接位于根节点下的设备:
-
设备树中直接挂在根节点
/
下的设备通常会被识别为 Platform 设备 -
例如:
/serial@101f0000
-
-
具有
compatible
属性的节点:-
任何具有
compatible
属性的节点如果没有被其他总线驱动认领,最终会被当作 Platform 设备处理
-
-
没有明确总线父节点的设备:
-
不属于任何特定总线(如 I2C、SPI、PCI 等)的设备
-
-
典型示例:
-
处理器内置外设(UART、GPIO、定时器等)
-
内存映射设备
-
中断控制器
-
非 Platform 设备的识别特征
-
位于特定总线下的设备:
-
如 I2C、SPI、PCI 等总线下的设备节点
-
例如:
/i2c@101f8000/eeprom@52
-
-
有特定总线相关属性:
-
如 I2C 设备的
reg
属性表示 I2C 地址 -
SPI 设备的
reg
属性表示片选号
-
-
被特定总线驱动处理:
-
由对应的总线控制器驱动处理并创建相应的设备
-
内核处理流程
内核通过以下方式区分设备类型:
-
设备树扫描:
-
内核首先扫描设备树中的所有节点
-
-
总线类型匹配:
-
对每个节点,内核检查其父节点是否关联了某种总线驱动
-
如果父节点是 I2C、SPI 等总线,则创建对应的非 Platform 设备
-
-
Platform 设备回退:
-
如果节点不属于任何已知总线类型,且具有
compatible
属性 -
内核会将其注册为 Platform 设备
-
示例对比
Platform 设备示例:
text
/ { serial@101f0000 { compatible = "arm,pl011"; reg = <0x101f0000 0x1000>; interrupts = <0 35 4>; }; }
非 Platform 设备 (I2C) 示例:
text
/ { i2c@101f8000 { compatible = "arm,versatile-i2c"; reg = <0x101f8000 0x1000>; #address-cells = <1>; #size-cells = <0>; eeprom@52 { compatible = "atmel,24c256"; reg = <0x52>; }; }; }
在第二个示例中,eeprom@52
是 I2C 设备,不会被当作 Platform 设备处理。