通过CPLD来切换I2C通道切换,虚拟I2CMux的功能

议题申报地址

议题评审时间

  • 评审时间:双周的周一下午16点-18点

议题评审订阅

议题基本信息

当前我们在适配硬盘背板+NVME盘,硬件拓扑如下:

        I2C11 –> PCA9545 ( chan2 ) –----写CPLD寄存器:值:1 切换---- > NVME0  (VPD地址0xA6)    
                                  –----写CPLD寄存器:值:2 切换---- > NVME1  (VPD地址0xA6)  
                                  ... ....
                                  –----写CPLD寄存器:值:3 切换---- > NVME7  (VPD地址0xA6)                           

OpenUBMC怎么配置sr文件,我当前参考这样配置不可以

   "Smc_BP_Switch": {
      "Buses": [
        "I2cMux_SMC_PCA1",
        "I2cMux_SMC_PCA2",
        "I2cMux_SMC_PCA3",
        "I2cMux_SMC_PCA4",
        "I2cMux_SMC_PCA5",
        "I2cMux_SMC_PCA6",
        "I2cMux_SMC_PCA7",
        "I2cMux_SMC_PCA8"
      ]
    },

手动拼接I2C命令,可以读VPD信息

/data # ./i2ctool64
==============================================================================
                                  i2ctool help
==============================================================================
1   read i2c     e.g. i2ctool 1 busid read_len cmd_data_len slave_addr
                 data1 data2 ...dataN (read_len<=32,cmd_data_len<=6)
2   write i2c    e.g. i2ctool 2 busid write_len slave_addr
                 data1 data2 ...dataN (write_len<=32)
==============================================================================
Uasge:i2ctool <option> <param...>




~ /data # ./i2ctool64 2 11 1 0xE0 0x02; ./i2ctool64 2 11 2 0x66 0x0C 0x02; ./i2ctool64 1 11 32 1 0xA6 0x00
********************************
     i2c read data is
********************************
0x01  0x00  0x00  0x00
0x01  0x0f  0x00  0xef
0x01  0x0e  0x19  0xc8
0x4a  0x44  0x20  0x43
0x6c  0x6f  0x75  0x64
0xd8  0x4a  0x36  0x35
0x31  0x31  0x00  0x00
0x00  0x00  0x00  0x00
  • 评审点:新增通过CPLD来切换I2C通道切换,虚拟I2CMux的功能

注意: 请在SIG例会前至少提前一周提交此模板,以便社区成员有足够的时间进行评审和准备。

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

三、结论

综合知识库信息:

  • OpenUBMC 中存在 I2C 多路复用器(I2cMux)的配置类和 CPLD 通道切换命令,说明这类功能在系统层面有一定基础。
  • 但针对“通过写 CPLD 寄存器来切换 PCA9545 通道,进而访问 NVME 设备”这一具体硬件方案,现有案例显示直接通过 SR 配置可能无法实现
  • 因此,您申报的评审点“新增通过 CPLD 来切换 I2C 通道,虚拟 I2CMux 的功能”正是为了弥补这一能力缺口,需在 SIG 中进行方案评审和设计。
点击此处查看详细分析解答

根据知识库中的信息,您提供的议题“通过CPLD来切换I2C通道切换,虚拟I2CMux的功能”主要围绕一个具体的硬件适配场景展开,以下是基于现有上下文梳理出的关键内容。

一、议题背景与需求

在适配“硬盘背板 + NVME 盘”时,硬件拓扑如下:

I2C11 -> PCA9545 ( chan2 ) –写CPLD寄存器:值1切换–> NVME0(VPD地址0xA6)
                            –写CPLD寄存器:值2切换–> NVME1(VPD地址0xA6)
                            ... ...
                            –写CPLD寄存器:值3切换–> NVME7(VPD地址0xA6)

即:需要先通过 CPLD 寄存器写入来控制 PCA9545 多路复用器切换 I2C 通道,从而访问不同 NVME 盘的 VPD 信息。

知识库中对“I2C Channel Switching”的定义与此一致:

“I2C channel switching refers to the process of routing I2C communication through a multiplexer (PCA9545) to access different devices (e.g., NVME0 to NVME7) by changing register values in the CPLD.”

另外,知识图谱中也存在 CPLD 控制 I2C 多路复用器的实例关系:
CPLD_2I2C_Mux(0) 提供控制逻辑,Cpld_2 管理或控制 I2cMux(0)

二、当前 OpenUBMC 中的相关配置支持

1. I2cMux 类配置

CSR 配置字典中存在 I2cMux 类,用于 I2C 总线的通道选择和管理:

  • 功能描述:I2C 多路复用器配置,用于 I2C 总线的通道选择和管理
  • 核心属性:ChannelId,用于选择特定的 I2C 通道
  • 典型硬件:PCA9545(4 通道 I2C 多路复用器)
  • 配置方式:静态配置,例如 ChannelId: 0

2. Set-Cpld-Channel 命令

知识库中还提到一条 设置 CPLD 通道(Set-Cpld-Channel) 的命令:

  • 功能说明:CPLD 通道的切换
  • 支持切换范围包括:前置硬盘背板、Basic Computing Backplane、Fan Backplane 等
  • 该命令依赖“Get Cpld Manufacturer ID”命令查询相关信息

3. 实际案例中的配置尝试与结论

在您引用的社区讨论(topic 7531)中,提问者尝试在 SR 文件中按以下方式配置但未成功:

"Smc_BP_Switch": {
  "Buses": [
    "I2cMux_SMC_PCA1",
    "I2cMux_SMC_PCA2",
    ...
  ]
}

而通过手动拼接 I2C 命令,可以成功读取 NVME 的 VPD 信息,例如:

./i2ctool64 2 11 1 0xE0 0x02
./i2ctool64 2 11 2 0x66 0x0C 0x02
./i2ctool64 1 11 32 1 0xA6 0x00

该讨论给出的分析结论是:

“当前 OpenUBMC 可能不支持这种硬件切换方式。”

三、结论

综合知识库信息:

  • OpenUBMC 中存在 I2C 多路复用器(I2cMux)的配置类和 CPLD 通道切换命令,说明这类功能在系统层面有一定基础。
  • 但针对“通过写 CPLD 寄存器来切换 PCA9545 通道,进而访问 NVME 设备”这一具体硬件方案,现有案例显示直接通过 SR 配置可能无法实现
  • 因此,您申报的评审点“新增通过 CPLD 来切换 I2C 通道,虚拟 I2CMux 的功能”正是为了弥补这一能力缺口,需在 SIG 中进行方案评审和设计。

这里是提问求助板块哦,如果需要申报议题评审的话,还请在对应sig的评审专区新建帖子,并登记议题

已经重新提: 【待评审】通过CPLD来切换I2C通道切换,虚拟I2CMux的功能

也已经登记

麻烦看下是否还有问题呢