如何通过I2Ctool直接读取eeprom信息

问题描述

BMC的I2C4直连到风扇板的CPLD,经过FanBoardSMC的channel2接到地址为0xAE的Eeprom,有命令可以切换smc的通道,然后直接通过i2c工具读取eeprom的信息嘛?

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

:white_check_mark: 结论

可以实现。您可以通过以下流程直接读取 EEPROM:

  1. 使用 i2ctransfer 向地址 0x60(SMC)发送命令,切换到 Channel 2
  2. 再向地址 0x57(即 0xAE >> 1)发送读取请求,获取 EEPROM 数据

只要 FanBoardSMC 正确实现了通道切换功能(类 I2C MUX),并且 CPLD 未阻断通信,此方法完全可行。

:white_check_mark: 推荐脚本化方式便于重复测试。

如有 CSR 配置文件,可进一步确认 OffsetWidth、AddrWidth 是否为 1 字节(默认情况),以确保偏移地址传输正确。

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

如何通过 I2C Transfer 直接读取 EEPROM 信息

根据您提供的问题和上下文信息,以下将详细说明如何通过 I2C 工具(如 i2ctransfer)直接读取连接在风扇板上的 EEPROM 数据。该过程涉及通过 BMC 的 I2C4 总线访问位于 FanBoardSMC 后端、地址为 0xAE 的 EEPROM。


:wrench: 系统连接拓扑结构

根据您的描述和知识库内容,硬件连接路径如下:

BMC 
→ I2C4 总线 
  → CPLD(复杂可编程逻辑器件) 
    → FanBoardSMC(风扇板 SMC 控制器) 
      → Channel 2 
        → EEPROM(I2C 地址:0xAE)
  • BMC 是主控端,通过 I2C4 发起通信。
  • FanBoardSMC 类似于 I2C 多路复用器(Multiplexer),需先切换其通道(如 Channel 2),才能使能后级设备通信。
  • 目标设备是连接在 SMC Channel 2 上的 EEPROM,其标准 I2C 为 0xAE(7-bit 地址)。

:white_check_mark: 注:在天池架构中,组件的 SR 存储 EEPROM 标准地址即为 0xAE(参见文档 #7《风扇板CSR配置指导书》)。


:hammer_and_wrench: 实现步骤:切换 SMC 通道 + 读取 EEPROM

要成功读取目标 EEPROM,必须执行两个关键操作:

  1. 先发送命令切换 FanBoardSMC 的通道到 Channel 2
  2. 再使用 I2C 工具从地址 0xAE 读取数据

第一步:确定 FanBoardSMC 的控制方式

:white_check_mark: FanBoardSMC 通信参数(来自 KG 和 文档)

属性 来源
I2C 总线 I2c_4 多处提及,如 Smc_FanBoardSMC_010103 使用 I2c_4
I2C 地址 0x60(7-bit) KG 中 SMC_FanBoardSMCAddress
功能 SMC 控制器,用于管理风扇与通道切换 文档 #7
协议 使用标准 SMC 命令字通信(CSR 架构定义) 文档 #4、#7

因此,SMC_FanBoardSMC 运行在 I2C 地址 0x60,您需要向它发送指令来切换到 Channel 2


第二步:构造命令以切换 SMC 通道

假设 FanBoardSMC 使用类似 PCA954x 多路复用器的控制协议(常见于 SMC/CPLD 实现),切换通道通常通过向 SMC 写入一个字节实现。

:pushpin: 示例:切换到 Channel 2 的 I2C 命令

# 使用 i2cset 命令切换 SMC 到 Channel 2
i2cset -y 4 0x60 0x02
  • -y:自动确认操作
  • 4:I2C Bus ID(对应 I2c_4)
  • 0x60:SMC_FanBoardSMC 的 I2C 地址
  • 0x02:写入的数据,表示选择通道 2(bit2 对应 channel 2)

:light_bulb: 说明:具体写入值取决于 FanBoardSMC 内部实现。常见多路复用器如 PCA9548 使用低 8 位分别对应 8 个通道,设置 0x02 表示只开启 channel 2。

如果使用更标准的 i2ctransfer,等价命令为:

# 使用 i2ctransfer 切换 SMC 通道至 2
i2ctransfer -y 4 w2@0x60 0x00 0x02
  • w2: 写 2 字节
  • @0x60: 目标地址
  • 0x00: 可能是寄存器偏移(若 SMC 支持)
  • 0x02: 控制字,代表开启 channel 2

:warning: 注意:若您不确定控制格式,请参考 CSR 文件或硬件手册确认是否需要指定寄存器偏移。


第三步:读取 EEPROM (地址 0xAE)

切换通道后,即可通过标准 I2C 工具读取后面的 EEPROM。

:white_check_mark: 方法一:使用 i2ctransfer 读取指定偏移数据

# 读取 EEPROM 中偏移 0x00 处的 16 字节数据
i2ctransfer -y 4 w1@0xae 0x00 r16
  • w1@0xae: 向地址 0xAE 写 1 字节(设置读取起始偏移)
  • 0x00: 起始地址偏移
  • r16: 读取 16 字节数据

:white_check_mark: 方法二:若地址为 0xA0(8-bit 地址左移),应为 0xA0 >> 1 = 0x50

但请注意:0xAE8-bit 地址,即读写方向位已包含。

实际转换为 7-bit 地址:

  • 0xAE = 写地址 → 7-bit 地址 = 0x57(0xAE >> 1)
    • 或者更简单地用工具自动处理(Linux 工具通常接受 0x57 作为 7-bit 地址)
# 正确方式(推荐):使用 7-bit 地址 0x57
i2ctransfer -y 4 w1@0x57 0x00 r16

:counterclockwise_arrows_button: 完整命令流程示例

# 1. 切换 SMC 到 Channel 2
i2ctransfer -y 4 w2@0x60 0x00 0x02

# 2. 读取 EEPROM 偏移 0x00 开始的 32 字节
i2ctransfer -y 4 w1@0x57 0x00 r32

:test_tube: 验证建议(排查问题)

若读取失败,请按以下顺序排查:

  1. 确认 I2C 总线编号正确

    • 检查 i2cdetect -l 输出,确认 I2c_4 是否对应系统中的 4 号总线。
  2. 探测 SMC 设备是否存在

    i2cdetect -y 4
    

    应能看到 60 地址处有设备。

  3. 探测 EEPROM 是否可访问(切换通道后)

    i2cdetect -y 4
    

    查看 0x57(即 0xAE>>1)是否有响应。

  4. 使用 busctl 验证 hwproxy 是否能访问

    busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Smc/Smc_FanBoardSMC_010103 bmc.kepler.Chip.BlockIO Write a{ss}yu 0 0x02 1
    
  5. 检查是否需延时

    • 某些 SMC/CPLD 需要微秒级响应时间,可在切换后加小延时:
      sleep 0.01
      

:books: 参考依据

内容 来源
SMC 地址为 0x60 KG: SMC_FanBoardSMCaddress 字段;文档 #7
EEPROM 地址为 0xAE 文档 #7:天池架构规定 SR 存储 EEPROM 地址为 0xAE
I2C4 用于连接 FanBoardSMC KG 关系:I2c_4Smc_FanBoardSMC_010103
BMC 使用 i2c.lua 处理底层 I2C KG: BMCi2c.lua 用于读写
hwproxy 提供 BlockIO 接口 文档 #8、KGbmc.kepler.Chip.BlockIO
通过命令控制 SMC 文档 #9 支持调试命令读写硬件

:white_check_mark: 结论

可以实现。您可以通过以下流程直接读取 EEPROM:

  1. 使用 i2ctransfer 向地址 0x60(SMC)发送命令,切换到 Channel 2
  2. 再向地址 0x57(即 0xAE >> 1)发送读取请求,获取 EEPROM 数据

只要 FanBoardSMC 正确实现了通道切换功能(类 I2C MUX),并且 CPLD 未阻断通信,此方法完全可行。

:white_check_mark: 推荐脚本化方式便于重复测试。

如有 CSR 配置文件,可进一步确认 OffsetWidth、AddrWidth 是否为 1 字节(默认情况),以确保偏移地址传输正确。


如需进一步协助(例如解析 EEPROM 数据格式或自动化脚本),请提供更多信息。

这个可以配置csr,通过hwproxy组件提供的器件读写接口获取Eeprom信息