添加INA3221芯片驱动需要做哪些工作

目前采用的风扇板涉及到两块INA3221芯片,需要新增驱动获取到芯片读值
具体需要做哪些工作?初步认知是在component_drivers\drivers\internal\chip\chip_ina\ina.cpp中添加INA3221部分的内容,除此之外还需要关注哪些点?

答案内容由AI生成,仅供参考:

:white_check_mark: 总结:完整流程图

1. 编写 INA3221 驱动代码(ina3221.cpp)
   ↓
2. 注册到 component_drivers 构建系统
   ↓
3. 编写 CSR .sr 文件定义芯片对象
   ↓
4. 在设备树拓扑中添加 I2C 节点
   ↓
5. 配置 Scanner/Accessor 实现数据采集
   ↓
6. 可选:暴露 D-Bus 接口
   ↓
7. 编译、烧录、测试通信与数据正确性

:white_check_mark: 最终目标:实现通过 busctl 或 WebUI 实时查看风扇板两路 INA3221 的电压、电流、功率数据。

如有进一步需求(如功率封顶联动控制),可在本驱动基础上扩展。

点击此处查看详细分析解答

添加 INA3221 芯片驱动所需的工作

根据您提供的上下文和现有知识,当前 OpenUBMC SDK 尚不支持 INA3221 芯片,因此需要手动开发并集成其驱动程序以实现对风扇板上两块 INA3221 芯片的电流/功率数据采集。以下是完整的实施步骤与关键注意事项。


:white_check_mark: 一、为何必须添加驱动?

从现有信息可得出明确结论:

  • INA3221 不在当前支持列表中INA3221 当前未被 OpenUBMC SDK 原生支持(见文档块 #2 和搜索结果 #9)。
  • 无法通过 CSR 配置直接识别:仅在拓扑中配置无法加载该器件,“得写驱动后,在格式版本为5.00的sr里新增器件配置,才能获取”。
  • 已有参考器件支持OpenUBMC SDK 支持 ina238,且 ina238 被用作兼容性参考,可作为开发模板(见 KG 实体 ina238 和关系 OpenUBMC SDK → ina238)。

因此,必须编写驱动程序,否则无法正常读取 INA3221 数据。


:white_check_mark: 二、具体需要完成的工作

1. 在 component_drivers 中添加 INA3221 驱动文件

您的初步认知是正确的:应修改或扩展 component_drivers/drivers/internal/chip/chip_ina/ina.cpp 文件。

:hammer_and_wrench: 实施建议:

  • ina.cpp 或新建 ina3221.cpp 中实现以下功能:
    • 定义设备 ID 匹配表(匹配 INA3221 的 I2C 地址,通常为 0x40–0x4F)。
    • 实现寄存器读取逻辑(如 bus_voltage, shunt_voltage, current, power 寄存器地址)。
    • 设置采样周期、校准参数(如 Config 寄存器配置为连续模式)。
    • 支持 BlockIOBitIO 读写接口,供上层 Scanner/Accessor 使用。
  • 继承通用 Ina 基类(如有),或遵循 bmc.kepler.Chip.Ina 接口规范。

提示:可参照 ina238 的驱动结构,并参考 SR 文件中新增器件对象的方式(见搜索结果 #9:“新增 bmc.kepler.Chip.Ina 接口”)。


2. 更新 CSR(Configuration & Status Repository)文件

必须在对应的 CSR .sr 文件中声明 INA3221 设备。

:page_facing_up: 配置内容包括:

"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> 查看设备是否存在
寄存器读取 使用 i2cgetbusctl 手动读取关键寄存器
数据准确性 对比万用表实测电流与读出值
驱动稳定性 长时间运行观察是否崩溃或超时
自启动加载 重启 BMC 验证驱动是否自动加载

:white_check_mark: 三、其他需关注的关键点

关注点 说明
I2C 地址冲突 确认两块 INA3221 使用不同 I2C 地址(可通过 ADDR 引脚设置)
电源与通信稳定性 INA3221 需要稳定供电,注意布线噪声影响测量精度
校准系数配置 PowerMultiplierPowerDivisor 应由硬件团队提供,写入 SR 文件
驱动依赖构建系统 确保 meson.buildCMakeLists.txt 包含新驱动文件
日志调试输出 添加 DEBUG 级日志帮助定位通信失败问题
错误处理机制 实现 I2C 重试逻辑,避免因短暂故障导致服务崩溃

:white_check_mark: 四、参考资源与路径

类型 路径/名称
驱动模板 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 可作为配置参考

:white_check_mark: 总结:完整流程图

1. 编写 INA3221 驱动代码(ina3221.cpp)
   ↓
2. 注册到 component_drivers 构建系统
   ↓
3. 编写 CSR .sr 文件定义芯片对象
   ↓
4. 在设备树拓扑中添加 I2C 节点
   ↓
5. 配置 Scanner/Accessor 实现数据采集
   ↓
6. 可选:暴露 D-Bus 接口
   ↓
7. 编译、烧录、测试通信与数据正确性

:white_check_mark: 最终目标:实现通过 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。发现以下问题:

1

3

目前drivers\fan\huawei\csr\14100363_00000001050302023924.sr这个5.00版本的csr是否可用?问题出在哪里?

我看了下代码,component_drivers里drivers/meson.build并没有包含fan驱动,subdir没有包含fan目录,我不确定是还不完善还是什么别的原因。这里没包含,驱动没打包出来,风扇板的sr是加载不了的。