uBMC通过JTAG更新CPLD时,CPLD芯片中程序不一样,执行的流程也不一样,哪种情况是正常的?

在开发uBMC更新CPLD功能时,uBMC程序不变,CPLD用不同的功能,uBMC打印进入了不同的流程,哪种流程是正常的?

问题描述

CPLD之前是通过仿真器烧录的,现在进行uBMC进行烧录,CPLD开发有多个版本,但是功能是差不多的,但是有的CPLD版本通过uBMC更新是正常的,更新完成后,对办卡重新上电,CPLD编译时间就会显示正常,这种情况的打印如下:

1970-01-01 00:04:59.188831 firmware_mgmt NOTICE: action.lua(99): public finish action start
1970-01-01 00:04:59.215464 firmware_mgmt NOTICE: worker: start action in worker
1970-01-01 00:04:59.291825 firmware_mgmt NOTICE: worker: execute finish action script successfully
1970-01-01 00:05:00.207261 firmware_mgmt NOTICE: action.lua(105): public finish action end
1970-01-01 00:05:00.207613 firmware_mgmt NOTICE: info_mgmt.lua(171): info_key(1Cpld) upgrade set_stage: COMMON_FINISH → DIFF_FINISH, 95
1970-01-01 00:05:00.315781 general_hardware NOTICE: upgrade_subject.lua(105): [on_upgrade_finish] start upgrade Cpld
1970-01-01 00:05:00.317425 general_hardware NOTICE: signal.lua(241): [cpld]Start the system[1] Cpld upgrade finish phase
1970-01-01 00:05:00.421706 general_hardware NOTICE: fructl_handler.lua(58): get_host_type: get host type Singlehost
1970-01-01 00:05:00.427189 general_hardware NOTICE: fructl_handler.lua(77): get_power_state: system[1] get power power ON
1970-01-01 00:05:00.429469 general_hardware NOTICE: signal.lua(161): upgrade_single_host system_id[1] firmware_type[Cpld] power_state[ON]
1970-01-01 00:05:00.431746 general_hardware NOTICE: valid.lua(223): [cpld]get system_id = 1 ValidatingCpldFlag = true
1970-01-01 00:05:00.435392 general_hardware NOTICE: fructl_handler.lua(58): get_host_type: get host type Singlehost
1970-01-01 00:05:00.437692 general_hardware NOTICE: signal.lua(36): [CPLD]Register Active Action start firmware_id = CPLD_ResetAC active_condition = PowerOff
1970-01-01 00:05:00.444443 firmware_mgmt NOTICE: active_info.lua(243): register: FirmwareId = CPLD_ResetAC FirmwareType = CPLD ActiveCondition = PowerOff ActiveMode = ResetAC ActiveStatus = Idle SystemId = nil
1970-01-01 00:05:00.445685 firmware_mgmt NOTICE: active_info.lua(250): upgrade_type is Simple
1970-01-01 00:05:00.461462 firmware_mgmt NOTICE: active_info.lua(123): Insert FirmwareActive info [FirmwareId:CPLD_ResetAC] to table [t_fw_active_objs]
1970-01-01 00:05:00.500328 firmware_mgmt NOTICE: info_mgmt.lua(171): info_key(1Cpld) upgrade set_stage: DIFF_FINISH → CLEAR, 99
1970-01-01 00:05:00.510312 firmware_mgmt NOTICE: control.lua(110): wait_msg_result stage=CLEAR, timeout=600S, loop=1
1970-01-01 00:05:00.510595 firmware_mgmt NOTICE: control.lua(216): Upgrade 1Cpld completely, pre_version=0.01
1970-01-01 00:05:00.597203 general_hardware NOTICE: upgrade_subject.lua(112): [on_upgrade_finish] end upgrade Cpld
1970-01-01 00:05:00.754156 firmware_mgmt NOTICE: info_mgmt.lua(171): info_key(1Cpld) upgrade set_stage: CLEAR → COMPLETED, 100
1970-01-01 00:05:00.849908 firmware_mgmt NOTICE: active_fructl.lua(95): get host type is Singlehost
1970-01-01 00:05:00.851021 firmware_mgmt NOTICE: active_single_host_fructrl.lua(61): active_single_host_fructrl fructrl get power status
1970-01-01 00:05:00.858315 firmware_mgmt NOTICE: state_simple_upgrading.lua(87): simple upgraded, current active mode is:nil, wait restart seconds:30000
1970-01-01 00:05:00.866127 firmware_mgmt NOTICE: init.lua(33): update status to FS_IDLE.

CPLD通过仿真器烧录另一个版本后,通过uBMC网页进行烧录,网页烧录也提示烧录成功了,但重新上电,CPLD没有启动,这种情况的打印如下:

1970-01-01 00:15:44.539696 general_hardware NOTICE: valid.lua(92): [cpld]/data/opt/bmc/up_cfg/valid_00000001010302044492_1_1.vme update success!!!
1970-01-01 00:15:47.573115 general_hardware NOTICE: valid.lua(228): [cpld]set system_id = 1 ValidatingCpldFlag = 0
1970-01-01 00:15:47.588731 fructrl NOTICE: fructrl_obj_mgnt.lua(266): [System:1]set power restore policy, reason=ActiveCpld, execute=Yes, period=Once, priority=2
1970-01-01 00:15:47.590269 fructrl NOTICE: fructrl.lua(707): [System:1]Start to set power on strategy exceptions to 2
1970-01-01 00:15:47.593856 general_hardware NOTICE: fructl_handler.lua(166): set power restore successfully, reason: ActiveCpld, execute: Yes, period: Once, priority: 2
1970-01-01 00:15:47.595655 general_hardware NOTICE: fw_upgrade.lua(201): [cpld] set valid false
1970-01-01 00:15:47.599237 general_hardware NOTICE: signal.lua(151): [cpld] Register active action of reset AC
1970-01-01 00:15:47.606613 general_hardware NOTICE: fructl_handler.lua(58): get_host_type: get host type Singlehost
1970-01-01 00:15:47.608735 general_hardware NOTICE: signal.lua(36): [CPLD]Register Active Action start firmware_id = CPLD_ResetAC active_condition = PowerOff
1970-01-01 00:15:47.616096 firmware_mgmt NOTICE: active_info.lua(243): register: FirmwareId = CPLD_ResetAC FirmwareType = CPLD ActiveCondition = PowerOff ActiveMode = ResetAC ActiveStatus = Ready SystemId = nil
1970-01-01 00:15:47.617851 firmware_mgmt NOTICE: active_info.lua(250): upgrade_type is Simple
1970-01-01 00:15:47.636328 firmware_mgmt NOTICE: active_info.lua(123): Insert FirmwareActive info [FirmwareId:CPLD_ResetAC] to table [t_fw_active_objs]
1970-01-01 00:15:47.685391 firmware_mgmt NOTICE: info_mgmt.lua(171): info_key(1Cpld) upgrade set_stage: DIFF_FINISH → CLEAR, 99
1970-01-01 00:15:47.686345 firmware_mgmt NOTICE: control.lua(110): wait_msg_result stage=CLEAR, timeout=600S, loop=295
1970-01-01 00:15:47.687151 firmware_mgmt NOTICE: control.lua(216): Upgrade 1Cpld completely, pre_version=0.00
1970-01-01 00:15:47.957910 firmware_mgmt NOTICE: info_mgmt.lua(171): info_key(1Cpld) upgrade set_stage: CLEAR → COMPLETED, 100
1970-01-01 00:15:48.057497 firmware_mgmt NOTICE: active_fructl.lua(95): get host type is Singlehost
1970-01-01 00:15:48.057807 firmware_mgmt NOTICE: active_single_host_fructrl.lua(61): active_single_host_fructrl fructrl get power status
1970-01-01 00:15:48.060456 firmware_mgmt NOTICE: state_simple_upgrading.lua(87): simple upgraded, current active mode is:ResetAC, wait restart seconds:30000
1970-01-01 00:15:48.068063 firmware_mgmt NOTICE: init.lua(33): update status to FS_WAIT_RESTART.
1970-01-01 00:15:48.068525 firmware_mgmt NOTICE: active_comm.lua(78): start exec ac cycle
1970-01-01 00:15:48.068801 firmware_mgmt NOTICE: active_fructl.lua(95): get host type is Singlehost
1970-01-01 00:15:48.069516 firmware_mgmt NOTICE: active_single_host_fructrl.lua(32): active_single_host_fructrl get fructrl object

哪个是正常的现象?什么原因会导致这个现象?

CPLD端比较功能反馈功能没有差别

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2506]

  • 硬件配置:[如 CPU、内存等]

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

总结

  • 日志B所示流程是标准且正常的冷升级流程,它确保了新固件在完整的断电重启后能够被激活和加载。
  • 日志A所示流程可能属于热升级或固件即时生效的场景,系统未执行AC重启。
  • 导致现象差异的根本原因是CPLD固件版本不同,以及对应的升级包配置(如是否支持热升级)不同。若要确保升级后CPLD可靠启动,应遵循冷升级流程(即日志B所示),并在执行AC操作时确保足够的下电时间(如10秒以上)。
点击此处查看详细分析解答

根据您提供的日志和知识库信息,可以分析出第二种情况(日志B)是正常的冷升级(冷启动生效)流程,而第一种情况(日志A)属于热升级或固件即时生效的流程。两种流程都是系统支持的,但生效机制不同。

以下是详细分析和原因说明:

1. 两种流程的关键差异对比

对比项 日志A(情况一:上电后编译时间显示正常) 日志B(情况二:上电后CPLD未启动)
生效动作注册 注册了Active Action,但**ActiveStatus = Idle**。 注册了Active Action,且**ActiveStatus = Ready**。
生效模式 ActiveMode = ResetAC,但升级完成后状态直接进入 FS_IDLE。 ActiveMode = ResetAC,升级完成后状态进入 FS_WAIT_RESTART。
后续动作 未立即执行AC循环。 立即执行 AC循环(start exec ac cycle)。
流程特点 固件写入后,激活动作已注册但处于待命(Idle) 状态,系统并未主动触发重启。这可能意味着该版本CPLD固件在写入时已经通过特定机制(如热升级或固件自身的处理)使新代码生效,因此上电后编译时间显示正常。 固件写入后,激活动作已注册且处于待命(Ready) 状态,系统主动触发AC(交流电)下电再上电来使新固件生效。这正是知识库中描述的标准冷升级(Cold Upgrade) 流程。

2. 哪种流程是正常的?

第二种情况(日志B)是CPLD标准冷升级流程的正常表现。

根据知识库信息,CPLD升级流程明确包含 Prepare(准备) → Process(执行) → Finish(完成) → Valid(生效) 四个阶段。

  • 日志B中出现的 FS_WAIT_RESTART 状态和 start exec ac cycle 动作,正是 Valid(生效)阶段 的标准操作:通过AC掉电重启来激活新固件。知识库也指出:“CPLD通常需要一次完整的AC电源循环才能激活新固件”。

而第一种情况(日志A)中,升级完成后系统直接进入 FS_IDLE 状态,并未触发AC重启。这通常意味着:

  • 该CPLD固件版本支持热升级(Hot Upgrade),或
  • 固件包中配置了 HotValidList 属性(如知识库文档参考5所述),使得固件无需重启即可生效。

3. 导致差异的根本原因

根据知识库信息,造成这种流程差异的核心原因在于CPLD固件版本及其对应的升级配置:

  • 固件包配置差异:知识库明确说明,CPLD升级支持冷升级(需重启生效) 和热升级(无感升级,立即生效) 两种模式。系统会根据升级包中 update.cfg 文件的配置来决定执行哪种流程。如果配置了 HotValidList 属性,则走热升级流程;否则走冷升级流程。
  • CPLD固件本身行为差异:您提到的CPLD通过仿真器烧录了不同版本,这些版本对升级后生效机制的处理可能不同。例如,某个版本的固件可能在写入后即可自启动,而另一个版本则需要严格遵守AC断电等待时间。知识库中同样提到:“重新上电CPLD不启动了……等10秒后重新上电CPLD更新过来了”,说明冷升级后执行AC操作时,需要满足一定的下电时间间隔,否则新固件可能无法正常启动。

总结

  • 日志B所示流程是标准且正常的冷升级流程,它确保了新固件在完整的断电重启后能够被激活和加载。
  • 日志A所示流程可能属于热升级或固件即时生效的场景,系统未执行AC重启。
  • 导致现象差异的根本原因是CPLD固件版本不同,以及对应的升级包配置(如是否支持热升级)不同。若要确保升级后CPLD可靠启动,应遵循冷升级流程(即日志B所示),并在执行AC操作时确保足够的下电时间(如10秒以上)。

通过核对打印信息,最后查明原因为cpld端SMC接口没有例化,导致更新CPLD时,交互信息异常,更新失败,CPLD将SMC总线例化后,打印正常了