在component_drivers新增驱动调试问题

问题描述

2512 LTS SP1版本基础上,在component_drivers新增Sgm58031电压芯片驱动,vpd中增加该芯片的配置,但hwproxy无法识别该芯片对象,是否hwproxy对于新增的芯片也需要在该库进行相应配置,请帮忙解决下,如果hwproxy需要对于新增驱动在该库内做修改,如何解决?请指导下,谢谢。


component_drivers编译通过,so文件已生成。
image

manifest.yml已增加对该模块的引用

hwproxy无法识别Sgm58031_1芯片对象
image

环境信息

  • 操作系统: Ubuntu 24.04

  • 软件版本:OpenUBMC2512 LTS SP1

期望结果

sgm58031电压芯片可以通过新增驱动,只在sr文件内配置,即可获得相应通道的电压值。

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

## ✅ 六、总结与建议

| 项目 | 结论 |
|------|------|
| **是否需要在 `hwproxy` 做配置?** | ✅ 是!`hwproxy` 必须能识别新芯片类型,否则即使驱动存在也无法使用 |
| **根本原因** | `hwproxy` 未识别 `Sgm58031` 类型的芯片,导致 `Scanner` 引用失败 |
| **解决方案** | 1. 确保驱动符合 `component_drivers` 接口规范<br>2. 在 `gen/` 或 Lua 层注册芯片类型<br>3. 让 `hwproxy` 加载并信任该类型<br>4. 验证 I2C 通信正常 |
| **期望结果是否可达?** | ✅ 可达,但需满足上述条件,**不能仅靠 VPD 配置实现插件即用**
点击此处查看详细分析解答

component_drivers 中新增 Sgm58031 驱动调试问题分析与解决方案

根据您提供的信息,您已在 OpenUBMC 25.12 LTS SP1 版本基础上,在 component_drivers 中新增了 Sgm58031 电压芯片驱动,并完成了 VPD 配置和 manifest.yml 引用,编译生成了 .so 文件。然而,hwproxy 无法识别 Sgm58031_1 芯片对象,导致 Scanner 组件报错 “invalid chip object”。

本文将基于所提供的上下文(知识图谱和文档)进行系统性分析,明确问题根本原因,并提供完整解决方案。


:magnifying_glass_tilted_left: 一、问题定位分析

:white_check_mark: 已确认成功的步骤:

  • 驱动已开发并编译通过:确认 libSgm8031.so 已生成(文件名可能为 libSgm8031.so)。
  • VPD/SR 配置已添加
    "Sgm58031_1": {
      "Address": 146,
      "AddrWidth": 1,
      "OffsetWidth": 1,
      ...
    }
    
    表明芯片基础通信参数已定义。
  • Scanner 配置正确引用芯片
    "Scanner_P12V": {
      "Chip": "#/Sgm58031_1"
    }
    
    引用路径格式规范,无语法错误。
  • manifest 已包含依赖component_drivers 模块被正确引入构建流程。

:cross_mark: 关键失败现象:

hwp proxy ERROR: app_objects.lua(232): invalid chip object for resource Scanner_P12V_01

此日志表明:hwproxy 在解析 Scanner_P12V 对应的 Chip 对象 #/Sgm58031_1 时失败,提示无法找到或验证该芯片对象。


:puzzle_piece: 二、根本原因分析(基于 Context 推理)

核心结论:仅在 component_drivers 添加驱动和 VPD 配置不足以使 hwproxy 识别新芯片类型 —— 必须在 hwproxy 或底层芯片支持层注册该芯片类型。

:link: 1. hwproxy 的职责与芯片对象校验机制

从上下文信息可知:

  • hwproxy 是负责硬件代理访问的核心服务之一(见日志中 hwproxy NOTICEERROR 记录)。
  • 它在启动时通过 dispatch.lua 加载 topo_data 中定义的设备(如 I2C、GPIO 总线设备)。
  • 日志显示其尝试创建 predevice bus handle,但在后续阶段报错“invalid chip object”。

:warning: 这说明:hwproxy 不仅需要知道某个芯片存在(通过 VPD),还必须能识别其类型(如 Sgm58031)并具备对应的访问逻辑。


:link: 2. component_drivers 的角色与局限性

根据知识图谱:

  • component_drivers 是一个 南向部件驱动集,用于管理低级硬件交互(文档搜索结果 ID:5)。
  • 它包含 drivers/ 目录,支持分层架构:驱动实现 → 接口定义 → 协议库调用(ID:2)。
  • component_drivers 包含 chip layer 代码,负责具体的芯片级数据存取操作(KG 实体关系:chip layercomponent_drivers)。

所以,即使 libSgm8031.so 被构建出来,若未被 hwproxyhwdiscovery 正确加载和注册为可识别的芯片类型,则仍无法完成对象绑定。


:link: 3. 芯片类型识别依赖于“已知芯片模型”或“动态插件注册”

从文档《GPU2.0卡适配指导》中可知:

驱动规范定义了驱动需要实现的接口。

这意味着:每个芯片驱动必须遵循统一的接口规范(例如继承基类、注册类型名),否则上层模块(如 hwproxy)无法动态加载和使用它。

同时,《openUBMC 25.12 LTS 版本发布说明》提到:

“驱动与协议框架深化…开始适配南向部件驱动新规范接口,为统一驱动模型打下基础。”

这说明当前系统正向标准化驱动模型过渡,新增芯片必须符合这套接口规范才能被自动识别。


:back_arrow: 回到问题本质:

您在 component_drivers 中实现了驱动,但 hwproxy 启动时 未能成功加载或识别 Sgm58031 类型的芯片对象,原因可能是以下任一或多个原因:

原因 是否可能 解释
未实现标准芯片接口 :white_check_mark: 极有可能 驱动未继承通用基类或注册类型名称
未在 gen/ 中定义模型 :white_check_mark: 可能 缺少代码生成所需 .yaml.xml 描述文件
驱动未正确注册到 Lua 环境 :white_check_mark: 可能 libSgm8031.so 加载但未暴露给 hwproxy
hwproxy 未启用对该类型支持 :white_check_mark: 可能 hwproxy 配置或过滤器忽略未知芯片
芯片地址冲突或通信失败 :cross_mark: 较低可能 若地址错,应是 read fail;此处是 invalid object

:white_check_mark: 三、解决方案建议

要解决“hwproxy 无法识别芯片对象”的问题,请按以下步骤排查与修复:


:white_check_mark: 步骤 1:确保驱动按标准接口实现(遵循 component_drivers 规范)

:check_mark: 必须完成以下结构:

component_drivers/
├── drivers/
│   └── sgm58031/                 # 新增芯片目录
│       ├── interface/            # 接口实现
│       │   └── sgm58031_interface.cpp
│       ├── vendor/
│       │   └── sgmicro/
│       │       └── sgm58031.cpp  # 具体实现
│       └── meson.build           # 构建文件

:check_mark: 必须继承标准基类(如 AccessorChip 基类)

参考已有驱动(如 libawmmlp.solibcx4.so)的接口设计。

:light_bulb: 提示:可用 nm libSgm8031.so | grep -i chip 查看是否导出 Chip 相关符号。


:white_check_mark: 步骤 2:检查是否在 gen/ 目录中声明芯片模型(推荐方式)

OpenUBMC 使用代码生成机制(gen/ 目录)自动生成基类。

  • 检查是否有类似 models/chips/sgm58031.yaml 的模型定义:

    chip:
      name: Sgm58031
      type: ADC
      registers:
        - name: VOUT
          offset: 0x00
          size: 2
    
  • 若无,请参考其他芯片模型添加,并确保 meson.build 能触发代码生成。


:white_check_mark: 步骤 3:确保 .so 被正确加载至 hwproxy 插件系统

检查运行时是否加载了该库:

# 在目标设备上执行
lsmod | grep Sgm
# 或
lsof | grep Sgm
# 或查看 hwproxy 启动日志是否打印加载信息

配置插件注册(若需手动注册)

部分系统要求在 Lua 脚本中显式注册:

编辑 hwproxy/lualib/hwproxy_objects/chip_objects.lua 或类似文件,加入:

chip_drivers["Sgm58031"] = {
    library = "libSgm8031.so",
    create = function(info)
        return require("sgm58031").new(info)
    end
}

:pushpin: 注:具体文件路径需根据实际项目结构确认,可参考 Chip_Gpio_31_01 等现有芯片注册方式。


:white_check_mark: 步骤 4:确认 hwproxy 支持该芯片类型(白名单机制)

某些版本的 hwproxy 会对未知芯片类型进行过滤。

检查日志中是否有类似提示:

unknown chip type: Sgm58031
skip unsupported chip

解决方案:

修改 hwproxy 的配置或源码,允许加载该类型:

// 在 chip_manager.cpp 中添加支持类型
supported_chips.push_back("Sgm58031");

或通过配置文件启用:

{
  "AllowedChipTypes": [
    "Eeprom",
    "Chip_Gpio",
    "Sgm58031"
  ]
}

:white_check_mark: 步骤 5:验证 I2C 通信是否正常(排除物理层问题)

虽然报错是“invalid object”,但仍建议确认基本通信:

# 使用 i2c-tools 测试是否能读取设备
i2cdetect -y 2
i2cget -y 2 0x92 0x00 w  # 0x92 = 146, Sgm58031 默认地址

若返回错误,则可能是硬件未连接、电源未上电或地址不匹配。


:compass: 四、理想工作流程(标准做法)

以下是 OpenUBMC 推荐的完整流程:

步骤 内容
1 component_drivers/drivers/sgm58031 下开发驱动
2 定义芯片模型 .yaml 文件并生成基类
3 实现具体功能并导出符合规范的接口
4 编写 meson.build 并确保 .so 被构建
5 hwproxy 插件系统中注册该芯片类型
6 在 VPD (xx.sr) 中配置 Sgm58031_1 对象
7 配置 Scanner_P12V 引用该芯片
8 编译并部署,验证 hwproxy 成功创建对象

:books: 五、参考资料建议

  1. component_drivers GitHub
  2. GPU2.0卡适配指导》——了解标准驱动结构
  3. 南向网卡驱动适配指南》——理解分层架构与接口实现
  4. 《openUBMC 25.12 LTS 发布说明》——了解新驱动框架趋势

:white_check_mark: 六、总结与建议

项目 结论
是否需要在 hwproxy 做配置? :white_check_mark: 是!hwproxy 必须能识别新芯片类型,否则即使驱动存在也无法使用
根本原因 hwproxy 未识别 Sgm58031 类型的芯片,导致 Scanner 引用失败
解决方案 1. 确保驱动符合 component_drivers 接口规范
2. 在 gen/ 或 Lua 层注册芯片类型
3. 让 hwproxy 加载并信任该类型
4. 验证 I2C 通信正常
期望结果是否可达? :white_check_mark: 可达,但需满足上述条件,不能仅靠 VPD 配置实现插件即用

:white_check_mark: 最终建议操作清单:

  1. 检查 libSgm8031.so 是否导出有效符号(nm, readelf
  2. hwproxy 的 Lua 脚本中注册 Sgm58031 类型
  3. 添加 .yaml 模型定义(如有代码生成机制)
  4. 重启 hwproxy 并查看是否仍有 invalid chip object 错误
  5. 检查 i2cget 是否可读取该地址数据

如仍失败,请提供:

  • libSgm8031.so 的导出函数列表(nm -D libSgm8031.so
  • hwproxy 启动时是否加载该模块的日志
  • 芯片模型文件内容(如有)

我们将可进一步深入分析。

component_drivers的驱动是提供给devmon组件使用的,不是给hwproxy使用的。我理解你应该把对象配置在格式版本为5.00的csr里

感谢回复,版本为5.00的csr在默认的vpd里面没有,指的是sr文件头以下信息么?
“FormatVersion”: “3.00”,
“DataVersion”: “3.01”,

问题会不会在这里,日志中hwdiscovery有报错,没找到Sgm58031类信息,所以devmon下没有生成对应的dbus路径?因为hwproxy和hwdiscovery都闭源,没法查,请帮忙指导下,谢谢。

devmon加载的sr在component_drivers里,你在仓里搜下.sr文件,目前只有在里面配置的sr才支持devmon加载,才会使用component_drivers的驱动。hwdiscovery、hwproxy加载sr不会解析component_drivers配置的对象。devmon才会解析,但devmon只会加载格式版本为5.00的csr

我也遇到了这个问题,我和上面情况一样,我尝试过在component_drivers/drivers/pcie_nic_card/hisi/csr/14140130_19e50222_19e504b1.sr中添加新增驱动的配置信息,这个文件确认是格式版本为5.00的csr。我在系统内/opt/bmc/sr/目录下可以找到这个被修改的sr文件,但是hwproxy还是没有发现这个新增加的传感器。

em,hwproxy不会新增,是在devmon新增,可以查devmon的资源树

发现devmon仓加了对于bus和chip的过滤,在该仓的delete_ignored_objects。已经加了5.00的csr,发现devmon只处理component_drivers中csr板卡。。。

是的,devmon只处理component_drivers中csr板卡

对于Chip的新增驱动,目前有什么推荐的解决方案么?devmon仓库是否修改过滤条件也能处理component_drivers内新增的chip驱动呢。

devmon加载csr的时候会根据类名查找驱动,你在component_drivers新增了驱动,在加载component_drivers中配置的csr板卡的时候就会根据你新增的驱动,创建对象,注册到devmon的资源树上。