YMQMKK
(wuzhou-xiaokaili)
1
目前正在适配一款新的板卡,用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 总线复位 |
有 reset 方法 |
实体 reset 和关系 I2C Bus → reset |
| Hisport 总线复位 |
未直接描述 |
知识库无相关方法,但可通过底层 I²C reset 或临时禁用链路间接处理 |
| 临时禁用总线避免冲突 |
SetAccessibility 方法 |
文档 Chunk #4 |
| 地址配置错误 |
需排查左移 |
文档 Chunk #1(topic 5592) |
| 硬件链路异常 |
需物理排查 |
Search Result #8、#7 |
建议操作步骤:
- 核对 CSR 中 I²C 地址是否已左移一位(尤其针对 7 位地址的器件)。
- 尝试对出问题的 Hisport 总线对应的 I²C 总线执行
reset(需确认具体接口文档)。
- 若无法直接 reset,可临时禁用该总线 30 秒(使用
SetAccessibility),观察通信是否恢复。
- 使用
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 总线的方法,但有以下可用的恢复机制:
临时禁用总线(SetAccessibility)
通过调用 SetAccessibility 方法,可以临时禁用 I²C 总线或 Chip 对象,从而避免冲突并可能在禁用结束后恢复正常访问。
此方法虽非直接复位,但可用于隔离故障、等待设备就绪或避免 I²C 链路冲突,常用于 NPU/RAID 卡升级等场景。
对 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 290 和 338。知识库中提供了以下诊断方向:
常见原因:I²C 地址未左移
- 知识库问题 #5592(文档 Chunk 1)指出:
“i2c 地址实际为 7 位地址,实际 i2c 总线上发的是 8 位地址,在 BMC 侧需要将实际的 7 位地址左移一位的数值配置为 i2c 地址才可以正常识别。”
- 如果地址未左移配置,会导致无法通信,出现类似
error 290 的日志。请检查 CSR 配置中对应的 I²C 地址是否为左移后的值。
错误码含义
硬件链路排查
- V3 硬件访问错误排查指南(Search Result 第7条):
- 使用
i2ctool 直接发送 I²C 命令到对端器件,确认器件是否正常。
- 通过更换插卡进行交叉验证。
- 若条件允许,可在对应总线上抓取逻辑分析数据,分析发送和返回的波形。
- 尝试 AC 重启 MCU,查看状态是否恢复;若无效则需重新烧录 MCU 固件。
器件初始化时序
- Atlas 300I 读取温度失败分析(Search Result 第4条):
BMC 启动速度快于 OS 及 NPU 驱动加载,可能导致器件未初始化完成时 BMC 即发起访问。解决方案是在 Chip 对象中增加 DrvWriteDelay 属性(写延迟),但此案例针对的是写操作;对于您遇到的读失败,可尝试调整访问时序或等待器件就绪。
4. 总结
| 问题 |
BMC 是否提供方法 |
依据 |
| I²C 总线复位 |
有 reset 方法 |
实体 reset 和关系 I2C Bus → reset |
| Hisport 总线复位 |
未直接描述 |
知识库无相关方法,但可通过底层 I²C reset 或临时禁用链路间接处理 |
| 临时禁用总线避免冲突 |
SetAccessibility 方法 |
文档 Chunk #4 |
| 地址配置错误 |
需排查左移 |
文档 Chunk #1(topic 5592) |
| 硬件链路异常 |
需物理排查 |
Search Result #8、#7 |
建议操作步骤:
- 核对 CSR 中 I²C 地址是否已左移一位(尤其针对 7 位地址的器件)。
- 尝试对出问题的 Hisport 总线对应的 I²C 总线执行
reset(需确认具体接口文档)。
- 若无法直接 reset,可临时禁用该总线 30 秒(使用
SetAccessibility),观察通信是否恢复。
- 使用
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: – – – – – – – – – – – – – – – –