问题描述
我的程序中,需要通过SMC协议获取传感器状态,
offset偏移量为:
网页显示信息如下:
测试中发现,offset我定义了0x82~0x96多个command值,但是实际测试发现0x8B~0x92这几个command无法读到值,SMC通信设备是CPLD,CPLD通过串口能显示出对应这几个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 内部数据不存在。
建议您按照以下方向排查:
0x8B~0x92 对应的功能是否已在 CPLD 逻辑中实现,并注册了相应的 SMC 操作码。Chip、Accessor 或 Scanner,且未发生重复定义。write / read 数据帧,确认写指令携带的参数是否被 CPLD 正确解析。注意:所有分析均严格基于提供的 Context(知识图谱与文档片段),不包含外部推测。如需进一步定位,请提供具体的 CSR 配置、CPLD 固件版本以及完整的通信日志。
从您描述的现象来看,原有 SMC 类的 scanner 能正常工作,但新增加的 offset 范围(0x82~0x96)中 0x8B~0x92 这些命令无法读到值。CPLD 通过串口可以显示这些命令对应的数值,说明 CPLD 内部已存储了数据,但 SMC 读取失败。结合提供的 Context(知识图谱与文档片段),可能的原因如下:
在多次系统日志中,均出现 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 中 CPLD 与 SMC Protocol 的关系明确说明:“The CPLD must support the SMC protocol to enable functions like forced reboot”)。
您的 0x8B~0x92 这几个 offset 可能正好对应 CPLD 固件中未实现的操作码,因此 BMC 在执行读操作时收到 unsupported opcode 响应,导致无法获取值。
Topic 7027 的回复详细解释了 SMC 读操作的步骤:
如果在写指令阶段,CPLD 无法解析该 offset 对应的命令(例如命令格式错误或超出地址范围),则会直接返回失败码。CPLD 串口能显示数值,说明其内部逻辑正确,但 BMC 可能因写指令不被接受而无法触发后续读取。
Knowledge Graph 中多次提到特定芯片(如 Smc_CpuBrdSMC_0101、Smc_CpuBrdSMC_010101)在通信时因 unsupported chip type 或 failed to create chip object 导致后续操作失败。
新增的 command 可能映射到某个新的芯片对象或地址范围,若该芯片在 BMC 的 hwproxy 资源树中未正确配置(例如 CSR 中缺失对应的 Chip 定义、Accessor 关联不完整),则 SMC 接口无法发起有效的读取请求。
Search Result 2 中描述了一个场景:新增的 Scanner 配置重复,框架会将相同 type/mask/offset 的 Scanner 合并处理,只有最先加载的配置生效,后续的值可能被覆盖。
虽然您的问题涉及直接读取 command,但如果这些 offset 是通过多个 Scanner 或 Accessor 同时配置的,可能因重复定义导致部分配置失效,间接影响读取结果。
I2C_1 总线上,且所有失败都伴随着相同芯片、相同总线。如果 0x8B~0x92 的读取需要经过特定的 I2C 通道或 mux,而该通道存在暂时性问题(如时序错误、设备未就绪),也可能造成读取失败。但鉴于其他 offset 正常,此可能性较低。综合以上信息,最可能的原因是 CPLD 固件未实现 0x8B~0x92 这些 offset 对应的操作码。从上下文大量出现的 opcode not supported 错误可以印证,SMC 协议要求 CPLD 必须支持相应的命令才能完成通信,而 CPLD 串口能显示数值进一步说明问题出在 BMC 与 CPLD 之间的协议交互层,而非 CPLD 内部数据不存在。
建议您按照以下方向排查:
0x8B~0x92 对应的功能是否已在 CPLD 逻辑中实现,并注册了相应的 SMC 操作码。Chip、Accessor 或 Scanner,且未发生重复定义。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查也行
mdbctl lsprop 对象名