尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

OpenBMC:I2C 设备适配流程

OpenBMC:I2C 设备适配流程 OpenBMCI2C 设备适配流程1. 前言OpenBMC 平台中大量设备通过 I2C 或 SMBus 与 BMC 连接例如温度传感器电源模块风扇控制器EEPROMADCGPIO 扩展器时钟芯片电压和电流监控芯片一个 I2C 设备从硬件连接到 WebUI 展示通常需要经过以下层次I2C 硬件设备 ↓ 设备树 ↓ Linux I2C 驱动 ↓ hwmon / nvmem / GPIO 等内核接口 ↓ OpenBMC 用户空间服务 ↓ D-Bus ↓ Redfish / IPMI / WebUI2. 确认硬件连接适配前需要从原理图和芯片手册确认I2C 控制器总线编号设备地址地址选择引脚供电电压中断引脚复位引脚Alert 信号是否经过 I2C Mux总线速率I2C 地址通常采用 7 位地址。例如芯片地址为0x48设备树中应写reg 0x48;不要将包含读写方向位的 8 位地址直接写入设备树。3. 启用 I2C 控制器首先需要在设备树中启用对应的 I2C 控制器i2c0 { status okay; clock-frequency 100000; };如果引脚存在复用还需要配置pinctrli2c0 { pinctrl-names default; pinctrl-0 i2c0_pins; status okay; };控制器驱动初始化成功后Linux 才能注册对应的 I2C Adapter。4. 添加 I2C 设备节点以温度传感器为例i2c0 { status okay; temperature-sensor48 { compatible vendor,temp-sensor; reg 0x48; }; };如果设备具有中断temperature-sensor48 { compatible vendor,temp-sensor; reg 0x48; interrupt-parent gpio0; interrupts 12 IRQ_TYPE_LEVEL_LOW; };设备节点名称中的地址应与reg保持一致。5. 经过 I2C Mux 的设备服务器平台经常使用 I2C Mux 扩展总线。i2c0 { mux70 { compatible nxp,pca9548; reg 0x70; i2c0 { reg 0; temperature-sensor48 { compatible vendor,temp-sensor; reg 0x48; }; }; i2c1 { reg 1; eeprom50 { compatible atmel,24c02; reg 0x50; }; }; }; };Mux 的每个通道会在 Linux 中形成新的逻辑 I2C 总线。用户空间配置应使用系统运行时分配的逻辑总线而不是只根据物理控制器编号推断。6. Linux 驱动匹配与初始化设备树中的compatible与驱动的设备匹配表对应static const struct of_device_id sensor_of_match[] { { .compatible vendor,temp-sensor }, { } }; MODULE_DEVICE_TABLE(of, sensor_of_match);匹配成功后Linux 调用驱动的probe()读取设备树属性 ↓ 申请驱动私有数据 ↓ 初始化 regmap 或 I2C 访问接口 ↓ 读取芯片标识 ↓ 配置寄存器 ↓ 注册 hwmon、nvmem 或 GPIO 接口I2C 设备驱动通常使用i2c_smbus_read_byte_data() i2c_smbus_write_byte_data() regmap_read() regmap_write()具体方式由设备寄存器结构和内核驱动框架决定。7. 内核接口选择不同类型的 I2C 设备应注册到合适的 Linux 子系统。设备类型常用内核子系统温度、电压、电流、功率hwmonEEPROMnvmemGPIO 扩展器gpio实时时钟rtcLED 控制器leds输入设备input多功能芯片mfd电源管理芯片regulator、power supply例如 hwmon 驱动可能生成/sys/class/hwmon/hwmon0/name /sys/class/hwmon/hwmon0/temp1_input /sys/class/hwmon/hwmon0/temp1_max用户空间服务通过标准内核接口读取数据不需要直接访问 I2C 寄存器。8. 接入 OpenBMC 传感器架构对于温度、电压和功率等传感器还需要完成 OpenBMC 用户空间配置。常见架构为entity-manager JSON ↓ 创建 Configuration 对象 ↓ dbus-sensors 读取配置 ↓ 匹配 hwmon 与 I2C 设备 ↓ 创建 D-Bus Sensor 对象配置通常需要描述Name Type Bus Address Channel Thresholds Associations最终创建类似对象/xyz/openbmc_project/sensors/temperature/Board_Temp /xyz/openbmc_project/sensors/voltage/P12V /xyz/openbmc_project/sensors/power/PSU0_Input_Powerbmcweb 和 IPMI 服务再从这些 D-Bus 对象读取数据。9. 完整适配流程一个 I2C 传感器的完整适配过程如下1. 确认原理图和芯片地址 ↓ 2. 启用 I2C 控制器和引脚复用 ↓ 3. 在设备树中添加设备节点 ↓ 4. 启用或编写 Linux 内核驱动 ↓ 5. 注册标准内核子系统接口 ↓ 6. 编写 entity-manager 配置 ↓ 7. 启用对应 dbus-sensors 服务 ↓ 8. 创建 D-Bus Sensor 对象 ↓ 9. 由 Redfish、IPMI 和 WebUI 使用对于 EEPROM、GPIO 扩展器和 RTC 等非传感器设备用户空间接入方式不同但设备树和内核驱动适配过程基本一致。10. 总结OpenBMC 中的 I2C 设备适配跨越硬件、内核和用户空间多个层次。硬件连接决定总线和地址 设备树描述设备 Linux 驱动访问寄存器 内核子系统提供标准接口 OpenBMC 服务建立 D-Bus 模型 Redfish 和 IPMI 提供外部访问适配时应优先使用 Linux 已有的标准驱动和子系统接口再通过 entity-manager、dbus-sensors 或其他 OpenBMC 服务完成用户空间建模。
返回列表