在Linux内核中,设备树(Device Tree,DT)是一种描述硬件系统资源的结构化数据。解析设备树文件时,如何区分设备是属于platform设备
还是非platform设备
,主要取决于设备的驱动框架和注册方式。以下是区分方法和相关原理:
1. Platform设备的特点
Platform设备(platform_device
)是一种与系统总线无关的设备类型,通常用于嵌入式系统中。它们没有严格依赖于特定的硬件总线(如PCI、USB等),而是通过设备树或其他方式直接描述。
判断设备是否属于Platform设备
- 匹配的驱动框架:如果该设备被绑定到
platform_driver
,那么它就是一个Platform设备。 - 设备树描述方式:
- 在设备树中,Platform设备通常通过
compatible
属性与其驱动匹配。 - 设备树节点的属性中没有特定的总线信息(如PCI、I2C、SPI等),或者写的是
simple-bus
。 - 设备绑定的驱动通常通过
platform_driver
注册。
- 在设备树中,Platform设备通常通过
- 内核代码解析:
在设备树解析时,of_platform_populate()
函数会扫描设备树中的节点,并将其注册为platform_device
。
代码检查
可以通过以下方式确认设备是否是Platform设备:
- 检查内核中驱动的注册代码是否使用了
platform_driver_register()
。 - 检查设备的
compatible
属性是否与platform_driver
的of_match_table
匹配。 - 查阅设备树的相关节点是否是通过
simple-bus
或直接挂载在根节点下的。
2. 非Platform设备的特点
非Platform设备是指依赖于特定硬件总线的设备,例如:
- PCI设备
- I2C设备
- SPI设备
- USB设备
判断设备是否属于非Platform设备
- 匹配的驱动框架:该设备会绑定到特定总线的驱动框架,例如:
- PCI设备绑定到
pci_driver
。 - I2C设备绑定到
i2c_driver
。 - SPI设备绑定到
spi_driver
。
- PCI设备绑定到
- 设备树描述方式:
- 非Platform设备的设备树节点通常包含特定总线的信息。例如:
- PCI设备会有
reg
属性,描述PCI配置空间地址。 - I2C设备会有
i2c
父节点和从设备地址。 - SPI设备会有
spi
父节点和从设备信息。
- PCI设备会有
- 设备通常通过总线的
of_xxx_populate()
函数解析并注册。
- 非Platform设备的设备树节点通常包含特定总线的信息。例如:
- 内核代码解析:
- 根据设备树中描述的总线类型,内核会调用对应总线的解析函数(如
of_i2c_register_devices()
、of_spi_register_master()
等)。 - 设备会注册为对应总线的设备类型(如
i2c_device
、spi_device
等)。
- 根据设备树中描述的总线类型,内核会调用对应总线的解析函数(如
设备树中典型特征
- I2C设备:挂载在
i2c
总线节点下,包含reg
属性表示从设备地址。 - SPI设备:挂载在
spi
总线节点下,包含reg
属性或cs-gpios
表示片选信息。 - PCI设备:挂载在
pci
节点下,包含reg
属性表示PCI地址信息。
3. 设备树解析流程
Linux内核解析设备树的流程如下:
- 挂载设备树根节点(
of_root
),并迭代扫描各节点。 - 根据节点的
compatible
属性,匹配适配的驱动程序。 - 如果节点没有特定总线信息,则通常注册为
platform_device
。 - 如果节点包含特定总线信息,则注册为对应总线类型的设备。
4. 总结
- Platform设备:
- 与硬件总线无关。
- 通常通过
compatible
属性匹配驱动。 - 使用
platform_device
和platform_driver
框架。
- 非Platform设备:
- 依赖于具体的硬件总线(PCI、I2C、SPI等)。
- 需要在设备树中明确标注总线信息。
- 使用特定总线的设备和驱动框架(如
i2c_device
、spi_device
等)。
通过检查设备树文件中节点的结构以及驱动框架的注册方式,可以准确区分设备是属于Platform设备还是非Platform设备。