原smc类scanner正常,但是新增一个command后,无法获取值

问题描述

我的程序中,需要通过SMC协议获取传感器状态,

offset偏移量为:

网页显示信息如下:

测试中发现,offset我定义了0x82~0x96多个command值,但是实际测试发现0x8B~0x92这几个command无法读到值,SMC通信设备是CPLD,CPLD通过串口能显示出对应这几个command中存放的数值,这个可能什么原因?

环境信息

分析结论

[详细总结您对此问题的分析结论]

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

分析结论

综合以上信息,最可能的原因是 CPLD 固件未实现 0x8B~0x92 这些 offset 对应的操作码。从上下文大量出现的 opcode not supported 错误可以印证,SMC 协议要求 CPLD 必须支持相应的命令才能完成通信,而 CPLD 串口能显示数值进一步说明问题出在 BMC 与 CPLD 之间的协议交互层,而非 CPLD 内部数据不存在。

建议您按照以下方向排查:

  1. 检查 CPLD 固件:确认 0x8B~0x92 对应的功能是否已在 CPLD 逻辑中实现,并注册了相应的 SMC 操作码。
  2. 验证 BMC 端配置:确保新增的 command 在 CSR 中正确关联了 ChipAccessorScanner,且未发生重复定义。
  3. 抓取 SMC 通信日志:对比成功与失败的 write / read 数据帧,确认写指令携带的参数是否被 CPLD 正确解析。

注意:所有分析均严格基于提供的 Context(知识图谱与文档片段),不包含外部推测。如需进一步定位,请提供具体的 CSR 配置、CPLD 固件版本以及完整的通信日志。

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

问题分析

从您描述的现象来看,原有 SMC 类的 scanner 能正常工作,但新增加的 offset 范围(0x82~0x96)中 0x8B~0x92 这些命令无法读到值。CPLD 通过串口可以显示这些命令对应的数值,说明 CPLD 内部已存储了数据,但 SMC 读取失败。结合提供的 Context(知识图谱与文档片段),可能的原因如下:

1. CPLD 固件不支持特定操作码(opcode)

  • 在多次系统日志中,均出现 opcode not supported 的错误,例如:

    chip: Smc_CpuBrdSMC_0101, bus: I2c_1, read failed: smc.lua:89: request error, opcode not supported, SMC completion code: 1
    

    (详见 Document Chunk 3 和 Knowledge Graph 中 Smc_CpuBrdSMC_0101 的描述)

  • 该错误表明 BMC 通过 SMC 协议发送的命令(opcode)未被 CPLD 识别或支持。CPLD 必须实现 SMC Protocol 才能接收并处理这些命令(Knowledge Graph 中 CPLDSMC Protocol 的关系明确说明:“The CPLD must support the SMC protocol to enable functions like forced reboot”)。

  • 您的 0x8B~0x92 这几个 offset 可能正好对应 CPLD 固件中未实现的操作码,因此 BMC 在执行读操作时收到 unsupported opcode 响应,导致无法获取值。

2. SMC 读操作流程异常

  • Topic 7027 的回复详细解释了 SMC 读操作的步骤:

    • 写一条固定指令通知 CPLD 将要执行读操作;
    • 然后读数据,返回的第一个字节是读取长度,第二个字节是完成码,后续是数据段和 CRC。
  • 如果在写指令阶段,CPLD 无法解析该 offset 对应的命令(例如命令格式错误或超出地址范围),则会直接返回失败码。CPLD 串口能显示数值,说明其内部逻辑正确,但 BMC 可能因写指令不被接受而无法触发后续读取。

3. 芯片或对象未正确初始化

  • Knowledge Graph 中多次提到特定芯片(如 Smc_CpuBrdSMC_0101Smc_CpuBrdSMC_010101)在通信时因 unsupported chip typefailed to create chip object 导致后续操作失败。

  • 新增的 command 可能映射到某个新的芯片对象或地址范围,若该芯片在 BMC 的 hwproxy 资源树中未正确配置(例如 CSR 中缺失对应的 Chip 定义、Accessor 关联不完整),则 SMC 接口无法发起有效的读取请求。

4. 配置重复导致的框架处理异常

  • Search Result 2 中描述了一个场景:新增的 Scanner 配置重复,框架会将相同 type/mask/offset 的 Scanner 合并处理,只有最先加载的配置生效,后续的值可能被覆盖。

  • 虽然您的问题涉及直接读取 command,但如果这些 offset 是通过多个 Scanner 或 Accessor 同时配置的,可能因重复定义导致部分配置失效,间接影响读取结果。

5. I2C 总线稳定性

  • 错误日志均发生在 I2C_1 总线上,且所有失败都伴随着相同芯片、相同总线。如果 0x8B~0x92 的读取需要经过特定的 I2C 通道或 mux,而该通道存在暂时性问题(如时序错误、设备未就绪),也可能造成读取失败。但鉴于其他 offset 正常,此可能性较低。

分析结论

综合以上信息,最可能的原因是 CPLD 固件未实现 0x8B~0x92 这些 offset 对应的操作码。从上下文大量出现的 opcode not supported 错误可以印证,SMC 协议要求 CPLD 必须支持相应的命令才能完成通信,而 CPLD 串口能显示数值进一步说明问题出在 BMC 与 CPLD 之间的协议交互层,而非 CPLD 内部数据不存在。

建议您按照以下方向排查:

  1. 检查 CPLD 固件:确认 0x8B~0x92 对应的功能是否已在 CPLD 逻辑中实现,并注册了相应的 SMC 操作码。
  2. 验证 BMC 端配置:确保新增的 command 在 CSR 中正确关联了 ChipAccessorScanner,且未发生重复定义。
  3. 抓取 SMC 通信日志:对比成功与失败的 write / read 数据帧,确认写指令携带的参数是否被 CPLD 正确解析。

注意:所有分析均严格基于提供的 Context(知识图谱与文档片段),不包含外部推测。如需进一步定位,请提供具体的 CSR 配置、CPLD 固件版本以及完整的通信日志。

下面是我的网页显示截图

当前值显示0的刚好和我SMC中0x8B至0x92对应,我的操作是新命名了Scanner

然后声明了ThresholdSensor_VOL_1V8OTP

之后再vpd文件夹下bingo build编译,之后在manifest中编译生成hpm文件进行烧录,网页12有该传感器,但是就是不显示值

有点没看懂你的问题,你用mdbctl查询你创建的Scanner,看看属性呢

BMC通过SMC协议与CPLD交互获取传感器信息,SMC协议中offset参数包含command信息,我们通过设置0x80~0x9F,每个值对应一个scanner,用于采集一个传感器信息,但是实际测试过程中,0x80~0x8A对应的值都能正常采集到,0x8B~0x92的值一直上报为0,0x92之后的值也有,uBMC这边除了设置scanner和ThresholdSensor还需要配置什么吗?还是CPLD的问题

有什么报错,命令不支持还是器件问题

没报错,就是没有值,还在查

?什么意思,Scanner要么有值要么报错,什么叫还在查

哪里能看到报错?我们外接的CPLD,现在不确定是不是CPLD没收到信息

Scanner如果读不到值,你查属性就能看到报错,如果Value有值,表示Scanner从硬件获取到了实际值

是在app.log里吗?刚接触uBMC,不是很了解,感谢

AppDump/hwproxy/mdb_info,或者环境上直接通过mdbctl查也行

请问这个路径在什么位置?这个是我从BMC这端的log,或者mdbctl指令该怎么排查?感谢

mdbctl lsprop 对象名