hisport 无法扫描到 i2c地址

问题描述

我在适配一种新的RAID卡,使用 i2c 通信,在调试的时候,系统日志显示 i2c_write 失败:

2026-04-13 11:08:22.112137 framework NOTICE: l_callbacks.cpp(159): reply_write_read: reply_write_read ret -1
2026-04-13 11:08:22.112289 framework NOTICE: l_callbacks.cpp(150): block_write_read: block_write_read ret -1

使用 hisportdetect 工具扫不到卡的 i2c 地址:

Scanning hisport-18 (port number: 18)…
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: – – – – – – – – – – – – – – – –
10: – – – – – – – – – – – – – – – –
20: – – – – – – – – – – – – – – – –
30: – – – – – – – – – – – – – – – –
40: – – – – – – – – – – – – – – – –
50: – – – – – – – 57 – – – – – – – 5f
60: – – – – – – – – – – – – – – – –
70: – 71 – – – – – – – – – – – – – –

系统 topo 结构如下:
Hisport_18
├─Pca9545_PCA9545_01010103
│ ├─Channel_1
│ │ └─Chip_TempChip_0101010302
│ ├─Channel_2
│ │ └─Chip_RaidChip_0101010303
│ └─Channel_3
│ ├─Pca9555_IO_01010103
│ ├─Chip_MCU1_01010103
│ │ └─Channel_0
│ │ └─Eeprom_IEU_01010103
│ └─Lm75_LM75_01010103
└─Eeprom_3_3_010101

请问 hisport不通可以如何调试?

环境信息

  • 软件版本:OpenUBMC2512

  • 硬件配置:Kunpeng 920 7282C

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

:white_check_mark: 总结结论

问题 是否成立 说明
hisportdetect 能否扫描带 PCA9545 的设备? :cross_mark: 不能 该工具不支持自动通道切换,扫描无效
RAID 卡 I2C 地址不可见? :warning: 可能仅因未激活通道 需手动切换 PCA9545 后再测试
Hisport 链路是否正常? :white_check_mark: 可用手动命令验证 推荐使用 i2ctransfer 进行直接读写测试
点击此处查看详细分析解答

Hisport I2C 通信调试问题分析与解决方案

根据您提供的系统日志、拓扑结构和现象描述,当前问题表现为:Hisport-18 上的 RAID 卡 I2C 地址无法被正常扫描到(预期地址未出现在 hisportdetect 结果中),且 I2C 写操作返回失败。以下将结合知识库信息进行系统性分析并提供调试建议。


:magnifying_glass_tilted_left: 问题现象总结

  • 日志报错block_write_read ret -1,表明底层 I2C 写操作失败。
  • 扫描结果异常:使用 hisportdetect 工具扫描 Hisport-18 时,预期的 RAID 卡 I2C 地址(如 0x50~0x5F 范围)未被发现或部分缺失。
  • 设备拓扑复杂:Hisport-18 下挂载了 PCA9545 多路复用器,并在其 Channel 2 上连接了目标 RAID 卡(Chip_RaidChip_0101010303)。

:puzzle_piece: 根本原因分析

:cross_mark: 1. hisportdetect 对 PCA9545 拓扑支持有限

关键信息来源:文档搜索结果 #1luohao211737 明确指出:

“他这个扫描目前不支持拓扑上带PCA9545的情况”

这意味着:

  • 即使硬件连接正确,hisportdetect 无法自动切换 PCA9545 的通道 来扫描下游设备。
  • 扫描结果显示 575f 等地址,说明总线上存在其他设备响应,但 目标 RAID 卡所在的 Channel_2 可能未被激活,导致其 I2C 地址未被探测到。

:white_check_mark: 解决方案与调试步骤

:white_check_mark: 步骤一:确认 SR 配置与硬件拓扑一致

请检查 SR 文件中以下配置是否准确:

"Hisport_18": {
  "Buses": ["Bus_Hisport_18"]
},
"Pca9545_PCA9545_01010103": {
  "ParentBus": "Bus_Hisport_18",
  "I2cAddress": "0x70"  // 必须与实际配置匹配
},
"Chip_RaidChip_0101010303": {
  "ParentBus": "Bus_Hisport_18_Channel_2",
  "I2cAddress": "0x54"  // 或实际使用的地址
}

:warning: 常见错误:

  • PCA9545 自身 I2C 地址配置错误(默认为 0x70 ~ 0x77
  • RAID 卡的 I2C 地址不匹配固件或硬件设计文档

:white_check_mark: 步骤二:手动控制 PCA9545 通道切换(关键步骤)

由于 hisportdetect 不支持自动通道切换,必须通过底层工具 手动写入 PCA9545 寄存器 来激活指定通道。

使用 i2ctransfer 命令切换 PCA9545 通道:

# 切换 Hisport-18 的 PCA9545 到 Channel 2 (对应二进制值 0x04)
i2ctransfer -f -w2@0x70 0x04

:magnifying_glass_tilted_right: 参数说明:

  • -f: 强制操作(hwproxy 环境下可用)
  • -w2: 写入 2 字节数据(第一个是寄存器地址,第二个是值)
  • @0x70: PCA9545 的 I2C 地址(7 位地址)
  • 0x04: 选择 Channel 2(具体值请参考 PCA9545 手册)

:white_check_mark: 切换后再尝试读取 RAID 卡设备。


:white_check_mark: 步骤三:使用 i2ctransfer 直接测试通信

即使 hisportdetect 扫不到设备,仍可通过命令行手动读写验证通信是否正常。

向 RAID 卡写入并读取测试(例如地址 0x54):

# 写入一个字节(例如寄存器偏移 0x00,写入值 0x01)
i2ctransfer -f -w3@0x54 0x00 0x01

# 读取一个字节(从寄存器 0x00 读)
i2ctransfer -f -w1@0x54 0x00 -r1

:pushpin: 若此命令成功,则说明:

  • Hisport 链路物理通路正常
  • 地址配置正确
  • 问题出在 自动扫描机制或 hwproxy 拓扑驱动初始化逻辑

:white_check_mark: 步骤四:检查 BMC 日志与内核日志

查看更详细的错误信息:

# 查看 framework.log 中关于 block_write_read 的上下文
grep "block_write_read" /var/log/framework.log | tail -20

# 查看内核 I2C/HISPORT 错误日志
dmesg | grep -i "hisport\|i2c" | tail -20

可能出现的关键错误码:

  • NACK from device → 设备无响应
  • Timeout → 总线阻塞或信号质量差
  • Invalid argument → 地址或寄存器格式错误

:white_check_mark: 步骤五:确认工具链版本与功能完整性

根据知识库内容(#3 工具分享帖):

  • hisportdetect 仅支持扫描,尚未实现 hisporttransfer(读写功能)
  • 社区正在开发 bus_tools 组件以完善支持

建议操作:

  • 确保已安装最新版 bus_tools HPM 包
  • 推荐使用 i2ctransfer 替代 hisportdetect 进行功能性验证

:hammer_and_wrench: 补充建议

建议项 说明
缩小扫描范围 若必须使用 hisportdetect,可通过参数限定地址范围加快响应
交叉验证硬件 更换另一张同型号 RAID 卡,排除硬件故障
抓取总线波形 使用逻辑分析仪抓取 Hisport 转 I2C 的实际信号,验证时序与切换
AC 掉电重启 排除上电初始化状态异常问题(参考 Mao_0v0_q7rci 提问)

:white_check_mark: 总结结论

问题 是否成立 说明
hisportdetect 能否扫描带 PCA9545 的设备? :cross_mark: 不能 该工具不支持自动通道切换,扫描无效
RAID 卡 I2C 地址不可见? :warning: 可能仅因未激活通道 需手动切换 PCA9545 后再测试
Hisport 链路是否正常? :white_check_mark: 可用手动命令验证 推荐使用 i2ctransfer 进行直接读写测试

:books: 参考资料

  1. [Topic 4713] hisportdetect 不支持 PCA9545 拓扑 —— luohao211737
  2. [bus_tools 组件] 提供 i2cdetect / i2ctransfer 支持 —— 开发者文档
  3. V3 硬件访问排查指南 —— 检查 SR 配置与实际拓扑一致性

:white_check_mark: 最终建议:放弃依赖 hisportdetect 自动扫描,改用 i2ctransfer 手动控制 PCA9545 通道并直接测试目标设备通信。

直接调用器件的读写方法呢?比如Eeprom_3_3_010101的

~ /tmp # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_3_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {“format”:“./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_3_010101, bus: Hisport_18, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290”,“name”:“BMC.Error.Unknow”}

同样的错误,我打开调试在日志中也看到了:

2026-04-13 19:20:55.865857 hwproxy DEBUG: init.lua(48): [Storage]Failed to write through i2c, err:./opt/bmc/apps/hwproxy/lualib/chip.lua:656: ./opt/bmc/apps/hwproxy/lualib/stream/hisport.lua:94: response error, ioctl(HISPORT_CMD_WRITE) failed: Unknown error 290

这种是硬件问题,参考下面这个文档。定位的话估计得排查下硬件链路问题,用逻辑分析仪看看数据是否正确之类的。

Hisport_12
├─Pca9545_PCA9545_01010109
│ └─Channel_3
│   ├─Pca9555_IO_01010109
│   ├─Chip_MCU1_01010109
│   │ └─Channel_0
│   │   └─Eeprom_IEU_01010109
│   └─Lm75_LM75_01010109
└─Eeprom_3_9_010101

Hisport_13
└─Eeprom_3_10_010101

Hisport_14
└─Eeprom_3_8_010101

Hisport_15
└─Eeprom_3_7_010101

Hisport_16
└─Eeprom_3_1_010101

Hisport_17
└─Eeprom_3_2_010101

Hisport_18
├─Eeprom_3_3_010101
└─Pca9545_PCA9545_01010103
  ├─Channel_1
  │ └─Chip_TempChip_0101010302
  ├─Channel_2
  │ └─Chip_RaidChip_0101010303
  └─Channel_3
    ├─Pca9555_IO_01010103
    ├─Chip_MCU1_01010103
    │ └─Channel_0
    │   └─Eeprom_IEU_01010103
    └─Lm75_LM75_01010103

~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_9_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_9_010101, bus: Hisport_12, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290","name":"BMC.Error.Unknow"}
~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_10_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_10_010101, bus: Hisport_13, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 338","name":"BMC.Error.Unknow"}
~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_8_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_8_010101, bus: Hisport_14, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290","name":"BMC.Error.Unknow"}
~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_7_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_7_010101, bus: Hisport_15, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290","name":"BMC.Error.Unknow"}
~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_1_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_1_010101, bus: Hisport_16, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290","name":"BMC.Error.Unknow"}
~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_2_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_2_010101, bus: Hisport_17, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290","name":"BMC.Error.Unknow"}
~ ~ # busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_3_3_010101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 1
Call failed: {"format":"./opt/bmc/libmc/lualib/mc/context.lua:203: ./opt/bmc/libmc/lualib/sd_bus/object.lua:317: ./opt/bmc/apps/hwproxy/lualib/hwproxy_objects/app_bus.lua:104: ./opt/bmc/apps/hwproxy/lualib/hw_utils/hw_wait_access.lua:101: chip: Eeprom_3_3_010101, bus: Hisport_18, read failed: hisport.lua:62: response error, ioctl(HISPORT_CMD_READ) failed: Unknown error 290","name":"BMC.Error.Unknow"}



感觉所有 hisport 都不通,可能是什么原因?

说明Hisport通道下没有器件或者硬件链路异常。没有器件是最常见的。

另外问下 hisport 是只要支持 i2c 通信的卡就支持吧,不需要有专门支持 hisport 协议是吗?

i2c 地址配错,i2c 地址需要左移一位