目前采用的风扇板涉及到两块INA3221芯片,需要新增驱动获取到芯片读值
具体需要做哪些工作?初步认知是在component_drivers\drivers\internal\chip\chip_ina\ina.cpp中添加INA3221部分的内容,除此之外还需要关注哪些点?
答案内容由AI生成,仅供参考:
总结:完整流程图
1. 编写 INA3221 驱动代码(ina3221.cpp)
↓
2. 注册到 component_drivers 构建系统
↓
3. 编写 CSR .sr 文件定义芯片对象
↓
4. 在设备树拓扑中添加 I2C 节点
↓
5. 配置 Scanner/Accessor 实现数据采集
↓
6. 可选:暴露 D-Bus 接口
↓
7. 编译、烧录、测试通信与数据正确性
最终目标:实现通过
busctl或 WebUI 实时查看风扇板两路 INA3221 的电压、电流、功率数据。
如有进一步需求(如功率封顶联动控制),可在本驱动基础上扩展。
点击此处查看详细分析解答
添加 INA3221 芯片驱动所需的工作
根据您提供的上下文和现有知识,当前 OpenUBMC SDK 尚不支持 INA3221 芯片,因此需要手动开发并集成其驱动程序以实现对风扇板上两块 INA3221 芯片的电流/功率数据采集。以下是完整的实施步骤与关键注意事项。
一、为何必须添加驱动?
从现有信息可得出明确结论:
- INA3221 不在当前支持列表中:
INA3221当前未被 OpenUBMC SDK 原生支持(见文档块#2和搜索结果#9)。 - 无法通过 CSR 配置直接识别:仅在拓扑中配置无法加载该器件,“得写驱动后,在格式版本为5.00的sr里新增器件配置,才能获取”。
- 已有参考器件支持:
OpenUBMC SDK支持ina238,且ina238被用作兼容性参考,可作为开发模板(见 KG 实体ina238和关系OpenUBMC SDK → ina238)。
因此,必须编写驱动程序,否则无法正常读取 INA3221 数据。
二、具体需要完成的工作
1. 在 component_drivers 中添加 INA3221 驱动文件
您的初步认知是正确的:应修改或扩展 component_drivers/drivers/internal/chip/chip_ina/ina.cpp 文件。
实施建议:
- 在
ina.cpp或新建ina3221.cpp中实现以下功能:- 定义设备 ID 匹配表(匹配 INA3221 的 I2C 地址,通常为 0x40–0x4F)。
- 实现寄存器读取逻辑(如
bus_voltage,shunt_voltage,current,power寄存器地址)。 - 设置采样周期、校准参数(如
Config寄存器配置为连续模式)。 - 支持
BlockIO或BitIO读写接口,供上层 Scanner/Accessor 使用。
- 继承通用 Ina 基类(如有),或遵循
bmc.kepler.Chip.Ina接口规范。
提示:可参照
ina238的驱动结构,并参考 SR 文件中新增器件对象的方式(见搜索结果#9:“新增 bmc.kepler.Chip.Ina 接口”)。
2. 更新 CSR(Configuration & Status Repository)文件
必须在对应的 CSR .sr 文件中声明 INA3221 设备。
配置内容包括:
"Chip_INA3221_Front": {
"DevType": "INA3221",
"I2CAddress": 0x40,
"BusWidth": 1,
"AddrWidth": 1,
"Owner": "I2c_4_dev"
},
"Chip_INA3221_Rear": {
"DevType": "INA3221",
"I2CAddress": 0x41,
"BusWidth": 1,
"AddrWidth": 1,
"Owner": "I2c_4_dev"
}
- 确保
.sr文件格式为 v5.00 或以上,否则无法识别自定义器件。 - 将
.sr文件路径添加到profile.txt中。
3. 拓扑配置:在设备树中添加芯片节点
依据现有项目结构(如 I2c_4_dev 下已有 Chip_Fan_PWM_010103_dev),需将两个 INA3221 添加到相应 I2C 总线下。
示例结构(基于您提供的拓扑路径):
/bmc/dev/topology/I2c_4_dev/Chip_INA3221_Front_dev
/bmc/dev/topology/I2c_4_dev/Chip_INA3221_Rear_dev
- 每个节点需关联到对应的
.sr中的Chip对象。 - 利用
Chip抽象类机制进行资源映射(见 KG 中Chip实体描述)。
4. 创建 Scanner 或 Accessor 获取数据
使用 Scanner 对象周期性读取 INA3221 的测量值,或通过 Accessor 主动调用。
示例配置:
"Scanner_INA3221_Current": {
"Chip": "#/Chip_INA3221_Front",
"Offset": 0x01, // Shunt Voltage Register
"Size": 2,
"Type": 1, // 块读
"Period": 1000, // 每秒刷新一次
"Value": 0
}
- 可结合
PowerMultiplier/PowerDivisor参数进行单位换算(见决策文档#9)。 - 上报值可用于事件监控、功率封顶等高级功能。
5. 注册 D-Bus 接口(可选但推荐)
若需外部服务访问 INA3221 数据,应在 hwproxy 层暴露 D-Bus 接口。
推荐做法:
- 创建 D-Bus 对象路径,例如:
/bmc/kepler/Chip/INA3221/Front - 实现
bmc.kepler.Chip.BlockIO.Read方法支持寄存器读取。 - 使用
busctl工具调试测试:busctl --user call /bmc/kepler/Chip/INA3221/Front bmc.kepler.Chip.BlockIO Read ...
6. 验证与测试
测试项清单:
| 项目 | 方法 |
|---|---|
| I2C 通信 | 使用 i2cdetect -y <bus> 查看设备是否存在 |
| 寄存器读取 | 使用 i2cget 或 busctl 手动读取关键寄存器 |
| 数据准确性 | 对比万用表实测电流与读出值 |
| 驱动稳定性 | 长时间运行观察是否崩溃或超时 |
| 自启动加载 | 重启 BMC 验证驱动是否自动加载 |
三、其他需关注的关键点
| 关注点 | 说明 |
|---|---|
| I2C 地址冲突 | 确认两块 INA3221 使用不同 I2C 地址(可通过 ADDR 引脚设置) |
| 电源与通信稳定性 | INA3221 需要稳定供电,注意布线噪声影响测量精度 |
| 校准系数配置 | PowerMultiplier 和 PowerDivisor 应由硬件团队提供,写入 SR 文件 |
| 驱动依赖构建系统 | 确保 meson.build 或 CMakeLists.txt 包含新驱动文件 |
| 日志调试输出 | 添加 DEBUG 级日志帮助定位通信失败问题 |
| 错误处理机制 | 实现 I2C 重试逻辑,避免因短暂故障导致服务崩溃 |
四、参考资源与路径
| 类型 | 路径/名称 |
|---|---|
| 驱动模板 | component_drivers/drivers/internal/chip/chip_ina/ina.cpp |
| 支持的同类芯片 | ina238(见 Document Chunk #2) |
| SR 文件样例 | 参考 #9 决策文档中新增 Ina 器件对象 |
| 设备树位置 | /bmc/dev/topology/I2c_4_dev/(见 DC #3) |
| D-Bus 接口 | 依赖 bmc.kepler.Chip.BlockIO(见 KG 和 DC #1) |
| 已有 Fan 控制逻辑 | Accessor_Fan1_PWM, Scanner_Fan1_FSpeed 可作为配置参考 |
总结:完整流程图
1. 编写 INA3221 驱动代码(ina3221.cpp)
↓
2. 注册到 component_drivers 构建系统
↓
3. 编写 CSR .sr 文件定义芯片对象
↓
4. 在设备树拓扑中添加 I2C 节点
↓
5. 配置 Scanner/Accessor 实现数据采集
↓
6. 可选:暴露 D-Bus 接口
↓
7. 编译、烧录、测试通信与数据正确性
最终目标:实现通过
busctl或 WebUI 实时查看风扇板两路 INA3221 的电压、电流、功率数据。
如有进一步需求(如功率封顶联动控制),可在本驱动基础上扩展。
添加驱动参考这个文档。编写完驱动后,需要在格式版本为5.00的csr里配置器件对象。
这一步是什么意思,只有"FormatVersion": "5.00"的csr才可以使用吗
我前面配置的风扇板csr还是3.00的,目前在csr的配置为:
此外在已有的ina驱动单独添加了ina3221部分的内容,大部分逻辑保持不变。需要以5.00的csr为模板重写风扇板csr吗?
是的,目前devmon只会加载格式版本5.00的csr,并根据里面的对象匹配component_drivers的驱动。因此写在component_drivers的驱动只有格式版本5.00的csr才会使用。
您好,有个问题需要请教一下
目前我们想先用component_drivers中已经存在的5.00版本的华为风扇板csr去验证一下:
我们编译了component组件,在manifest中build/product/BMC/openUBMC/rootfs/include/profile.txt目录下添加5.00sr文件;
在build/subsys/rc/framework.yml和build/subsys/stable/framework.yml文件里面将component组件的版本修改成之前编译的版本。
然后编译了manifest包验证,发现bmc上散热组件不在位。从日志里看发现Connector_CLU_1_0101读取的csr路径是/opt/bmc/sr/14100363_00000001050302023924.sr,且版本均为5.00。发现以下问题:


目前drivers\fan\huawei\csr\14100363_00000001050302023924.sr这个5.00版本的csr是否可用?问题出在哪里?
我看了下代码,component_drivers里drivers/meson.build并没有包含fan驱动,subdir没有包含fan目录,我不确定是还不完善还是什么别的原因。这里没包含,驱动没打包出来,风扇板的sr是加载不了的。


