OpenBMC:设备树在平台适配中的作用
OpenBMC设备树在平台适配中的作用1. 设备树简介设备树用于描述无法由系统自动发现的硬件资源。它以树形结构描述 SoC、总线、控制器和外设之间的关系。设备树通常包含寄存器地址中断号时钟和复位GPIODMAI2C 和 SPI 总线串口网卡Flash传感器和控制芯片设备树源文件经过编译后生成 DTB由 Bootloader 传递给 Linux 内核。DTS / DTSI ↓ 设备树编译器 ↓ DTB ↓ Bootloader ↓ Linux 内核 ↓ 设备和驱动匹配2. DTS、DTSI 与 DTBDTSDTS 是具体平台的设备树源文件通常描述一块完整主板。DTSIDTSI 是可复用的设备树包含文件常用于描述SoC 公共资源芯片系列公共外设通用板级配置多个平台共享的硬件结构DTBDTB 是编译后的二进制设备树由内核在启动阶段解析。组织关系通常为SoC 公共 DTSI ↓ 芯片系列 DTSI ↓ 主板 DTS ↓ 最终 DTB平台 DTS 可以覆盖公共 DTSI 中的属性从而启用、关闭或重新配置某个控制器。3. compatible 与驱动匹配compatible是设备树中最重要的属性之一用于将设备与 Linux 驱动匹配。例如temperature-sensor48 { compatible vendor,temp-sensor; reg 0x48; };内核驱动中会提供对应的匹配表static const struct of_device_id sensor_of_match[] { { .compatible vendor,temp-sensor }, { } };匹配成功后内核调用驱动的probe()函数。解析设备树节点 ↓ 读取 compatible ↓ 查找匹配驱动 ↓ 创建 platform_device 或总线设备 ↓ 调用驱动 probe()4. 描述 SoC 控制器设备树首先需要描述 SoC 内部控制器例如i2c0: i2c10000000 { compatible vendor,i2c-controller; reg 0x10000000 0x1000; interrupts 32; clocks clock 5; status disabled; };主板设备树再启用该控制器i2c0 { status okay; };常见控制器节点还会包含reg interrupts clocks resets pinctrl dmas status这些信息决定驱动如何访问寄存器、处理中断以及配置时钟和引脚。5. 描述板级外设外设通常挂载在对应总线控制器下。例如 I2C 温度传感器i2c0 { status okay; temperature-sensor48 { compatible vendor,temp-sensor; reg 0x48; }; };SPI Flash 示例spi0 { status okay; flash0 { compatible jedec,spi-nor; reg 0; spi-max-frequency 50000000; }; };设备所在的父节点决定其总线类型reg属性的含义也随总线而变化。6. GPIO 和引脚配置BMC 平台通常使用大量 GPIO例如电源按键复位信号Power Good风扇在位电源模块在位告警信号机箱入侵LED 控制设备树可以通过 GPIO 属性描述信号连接power-controller { compatible vendor,power-controller; power-button-gpios gpio0 10 GPIO_ACTIVE_LOW; power-good-gpios gpio0 11 GPIO_ACTIVE_HIGH; };GPIO_ACTIVE_LOW和GPIO_ACTIVE_HIGH用于描述有效电平驱动不需要在代码中硬编码信号极性。引脚复用通常通过pinctrl配置确保物理引脚工作在 GPIO、I2C、UART 或其他目标模式。7. 设备树与 OpenBMC 用户空间设备树主要服务于 Linux 内核但它会间接影响 OpenBMC 用户空间。设备树 ↓ 内核创建 I2C、GPIO、hwmon 等设备 ↓ sysfs 和字符设备接口 ↓ dbus-sensors、entity-manager 等服务 ↓ D-Bus ↓ Redfish、IPMI 和 WebUI例如设备树添加温度传感器 ↓ 内核驱动创建 hwmon ↓ dbus-sensors 读取温度 ↓ 创建 D-Bus Sensor ↓ WebUI 显示温度设备树负责描述硬件存在和连接关系entity-manager 则更侧重于 OpenBMC 用户空间中的设备建模和属性配置。8. 设备树在平台适配中的价值设备树将板级硬件差异从驱动代码中分离出来。同一个内核驱动可以支持多块主板只需要在设备树中提供不同的寄存器地址中断号I2C 地址GPIO 编号时钟参数设备数量有效电平平台适配时设备树通常承担以下工作启用 SoC 控制器 配置引脚复用 添加板级设备 描述中断和 GPIO 定义硬件连接关系 关闭未使用的外设9. 总结设备树是 OpenBMC 平台适配中连接硬件设计与 Linux 内核的重要部分。硬件原理图 ↓ 设备树描述 ↓ Linux 设备模型 ↓ 内核驱动 ↓ OpenBMC 用户空间服务驱动负责实现硬件访问逻辑设备树负责提供平台资源和连接信息。将平台差异放在设备树中能够提高驱动复用性并减少板级硬编码。