请问BMC有没有reset,recover iic/i2c over hisport 总线的办法

目前正在适配一款新的板卡,用iic或者iic over hisport去管理板卡都会出现iic read failed的情况。
BMC是否有主动对hisport或者iic总线进行复位的方法?I2c 接口文档 | 文档中心 | openUBMC
具体日志:

failed, error: BMC.Error.Unknow: ./opt/bmc/libmc/lualib/mc/context.lua:196: ./opt/bmc/libmc/lualib/sd_bus/object.lua:314: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ...bmc/apps/hwproxy/lualib/hwproxy_objects/work_objects.lua:117: bus: Hisport_10, chip: Pca9545_E8_0101010401 open channel(3) failed, error: ./opt/bmc/apps/hwproxy/lualib/chip.lua:378: ./opt/bmc/apps/hwproxy/lualib/stream/hisport.lua:94: response error, ioctl(HISPORT_CMD_WRITE) failed: Unknown error 338[times:3]
2026-07-23 06:47:44.025554 error: ./opt/bmc/apps/hwproxy/lualib/stream/hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 338
Hisport_10,Chip_PEXAOutletTemperatureCelsius_0101010401,0,0,4321,1,11914,0.36276040355206,"2026-07-23 04:16:24.973860 error: ./opt/bmc/apps/hwproxy/lualib/stream/hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290"

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

4. 总结

问题 BMC 是否提供方法 依据
I²C 总线复位 :white_check_mark:reset 方法 实体 reset 和关系 I2C Bus → reset
Hisport 总线复位 :cross_mark: 未直接描述 知识库无相关方法,但可通过底层 I²C reset 或临时禁用链路间接处理
临时禁用总线避免冲突 :white_check_mark: SetAccessibility 方法 文档 Chunk #4
地址配置错误 需排查左移 文档 Chunk #1(topic 5592)
硬件链路异常 需物理排查 Search Result #8、#7

建议操作步骤:

  1. 核对 CSR 中 I²C 地址是否已左移一位(尤其针对 7 位地址的器件)。
  2. 尝试对出问题的 Hisport 总线对应的 I²C 总线执行 reset(需确认具体接口文档)。
  3. 若无法直接 reset,可临时禁用该总线 30 秒(使用 SetAccessibility),观察通信是否恢复。
  4. 使用 i2ctool 单独测试对端芯片,排除硬件链路问题。

如果以上步骤无法解决,建议抓取总线逻辑数据并参考 Hisport 错误码表格进行深度定位。

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

根据提供的知识库信息,可以确认 BMC 提供了对 I²C 总线的 reset 方法,用于将总线恢复到已知状态。对于 Hisport 总线,虽然没有直接描述专用的复位方法,但可以通过关联的 I²C 总线或使用临时禁用/启用机制间接恢复链路。


1. BMC 对 I²C 总线的复位方法

知识库中明确提到:

  • 实体 reset

    “The reset method performs a reset on a specified I2C bus, restoring its state to a known condition.”
    (reset 方法对指定的 I²C 总线执行复位,将其状态恢复到已知条件。)

  • 关系 I2C Bus → reset

    “The reset method is executed to restore the I2C bus to a known state.”
    (reset 方法被用于将 I²C 总线恢复到已知状态。)

因此,BMC 确实提供了针对 I²C 总线reset 操作。调用方式可参考 I²C 接口文档(用户链接中的文档),但知识库内未给出具体命令,建议查阅相关 API 说明。


2. 对 Hisport 总线的处理

Hisport 是一种高速串行接口,用于承载 I²C、UART、SPI 等协议(即 “I²C over Hisport”)。知识库中未直接提供 reset Hisport 总线的方法,但有以下可用的恢复机制:

:wrench: 临时禁用总线(SetAccessibility)

通过调用 SetAccessibility 方法,可以临时禁用 I²C 总线或 Chip 对象,从而避免冲突并可能在禁用结束后恢复正常访问。

  • 示例命令(来自文档 Chunk 4):
    busctl --user call bmc.kepler.hwproxy /bmc/kepler/Bus/I2c/I2c_<总线ID> bmc.kepler.Bus SetAccessibility a{ss}bq 0 false 30
    
    • false 表示禁用访问
    • 30 表示禁用的时长(秒)
    • 到期后系统自动解除限制,无需额外操作。

此方法虽非直接复位,但可用于隔离故障、等待设备就绪或避免 I²C 链路冲突,常用于 NPU/RAID 卡升级等场景。

:wrench: 对 Hisport 对应的 I²C 总线执行 reset

由于 Hisport 底层仍是通过 I²C 进行通信,在 Hisport 总线上挂载的芯片通常连接到具体的 I²C 总线(如 I2c_8、I2c_9 等),对这些 I²C 总线执行 reset 方法理论上可以影响其上的 Hisport 链路。


3. 针对日志错误的分析与排查建议

您的日志中出现了 ioctl(HISPORT_CMD_READ) failed: Unknown error 290338。知识库中提供了以下诊断方向:

:pushpin: 常见原因:I²C 地址未左移

  • 知识库问题 #5592(文档 Chunk 1)指出:

    “i2c 地址实际为 7 位地址,实际 i2c 总线上发的是 8 位地址,在 BMC 侧需要将实际的 7 位地址左移一位的数值配置为 i2c 地址才可以正常识别。”

  • 如果地址未左移配置,会导致无法通信,出现类似 error 290 的日志。请检查 CSR 配置中对应的 I²C 地址是否为左移后的值。

:pushpin: 错误码含义

  • Hisport 总线介绍(Search Result 第8条):

    错误码大于 256 时,错误为逻辑返回的寄存器值,可使用公式 ret_code = (reg_value - 256) 计算。
    但若错误码不在已知返回码范围内,可能表示硬件链路异常或对端器件未响应。

  • 日志中的错误 290 和 338 均大于 256,属于逻辑层错误,建议结合硬件逻辑文档分析寄存器返回值。

:pushpin: 硬件链路排查

  • V3 硬件访问错误排查指南(Search Result 第7条):
    • 使用 i2ctool 直接发送 I²C 命令到对端器件,确认器件是否正常。
    • 通过更换插卡进行交叉验证。
    • 若条件允许,可在对应总线上抓取逻辑分析数据,分析发送和返回的波形。
    • 尝试 AC 重启 MCU,查看状态是否恢复;若无效则需重新烧录 MCU 固件。

:pushpin: 器件初始化时序

  • Atlas 300I 读取温度失败分析(Search Result 第4条):
    BMC 启动速度快于 OS 及 NPU 驱动加载,可能导致器件未初始化完成时 BMC 即发起访问。解决方案是在 Chip 对象中增加 DrvWriteDelay 属性(写延迟),但此案例针对的是写操作;对于您遇到的读失败,可尝试调整访问时序或等待器件就绪。

4. 总结

问题 BMC 是否提供方法 依据
I²C 总线复位 :white_check_mark:reset 方法 实体 reset 和关系 I2C Bus → reset
Hisport 总线复位 :cross_mark: 未直接描述 知识库无相关方法,但可通过底层 I²C reset 或临时禁用链路间接处理
临时禁用总线避免冲突 :white_check_mark: SetAccessibility 方法 文档 Chunk #4
地址配置错误 需排查左移 文档 Chunk #1(topic 5592)
硬件链路异常 需物理排查 Search Result #8、#7

建议操作步骤:

  1. 核对 CSR 中 I²C 地址是否已左移一位(尤其针对 7 位地址的器件)。
  2. 尝试对出问题的 Hisport 总线对应的 I²C 总线执行 reset(需确认具体接口文档)。
  3. 若无法直接 reset,可临时禁用该总线 30 秒(使用 SetAccessibility),观察通信是否恢复。
  4. 使用 i2ctool 单独测试对端芯片,排除硬件链路问题。

如果以上步骤无法解决,建议抓取总线逻辑数据并参考 Hisport 错误码表格进行深度定位。

我最近也在i2c over hisport 访问I2C器件,报如下错误,请问你是怎么配置的,我是如下配置,但是报 hisport i2c stream_buf write wait timeout,请求你是怎么配置,我现在无法界定是软件的错误还是硬件的错误

“ManagementTopology”: {

"Anchor": {

  "Buses": \[

    "Hisport_0",

    "Hisport_1"

  \]

},

"Hisport_1": {

  "SubBuses": \[

    "I2cOverHisport_0",

    "I2cOverHisport_1",

    "I2cOverHisport_2",

2026-07-29 16:41:51.929776 frudata ERROR: remote_rp.lua(198): Get object Fru_1_010116’s reference property PcbId failed, err: BMC.Error.Unknow: ./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/mc/signal.lua:310: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: bus: I2cOverHisport_1, chip: Pca9545_9545_i2c1_e2_010116 open channel(3) failed, error: ./opt/bmc/apps/hwproxy/lualib/chip.lua:656: ./opt/bmc/apps/hwproxy/lualib/stream/i2c_over_hisport.lua:70: ioctl(HIS_CMD_I2C_STREAM_WRITE) failed: Connection timed out[times:3]
2026-07-29T16:41:52.250237+00:00 xxx kernel: 2026-07-29 16:41:52,3832,i2c_stream_w_liner,385,hisport i2c stream_buf write wait timeout

我尝试去探测,但是一个地址没探测出来,也可能这个工具,不能探测 i2c over hisport的

/data # hisportdetect -l
hisport-0
hisport-1
/data # hisportdetect -a hisport-0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: – – – – – – – – – – – – – – – –
10: – – – – – – – – – – – – – – – –
20: – – – – – – – – – – – – – – – –
30: – – – – – – – – – – – – – – – –
40: – – – – – – – – – – – – – – – –
50: – – – – – – – – – – – – – – – –
60: – – – – – – – – – – – – – – – –
70: – – – – – – – – – – – – – – – –
/data # hisportdetect -a hisport-1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: – – – – – – – – – – – – – – – –
10: – – – – – – – – – – – – – – – –
20: – – – – – – – – – – – – – – – –
30: – – – – – – – – – – – – – – – –
40: – – – – – – – – – – – – – – – –
50: – – – – – – – – – – – – – – – –
60: – – – – – – – – – – – – – – – –
70: – – – – – – – – – – – – – – – –