XCD SoC功能安全心跳开启后刷机指导
背景:
XCD 将在E4U2阶段开启功能安全SoC心跳监控功能,旨在能够在SoC系统异常场景下MCU根据SoC心跳监控策略重启SoC,实现功能安全要求。此前DCD平台可通过金手指设备将心跳关闭,XCD硬件变更后没有金手指可用,功能安全心跳打开后,会对Fastboot刷机及EDL刷机造成影响**,**MCU会在SoC执行刷机过程中重启SoC(第一次心跳喂狗之前的超时时间是120秒,超过120秒没有喂心跳),进而造成SoC刷机失败,需在刷机前关闭心跳/通过MCU指令进入刷机模式,以下对各种刷机场景进行说明。(更多心跳使能场景说明:XCD SoC心跳使能说明 )
前置说明
心跳使能策略
- SoC下电后重新启动(包括STR)后的心跳超时时间是120秒,MCU收到第一包心跳后将超时时间改为60秒。
- SoC开机后会下发心跳开关配置到MCU,在此之前MCU会持久化保存此前SoC下发的配置。
注意事项:
对于在实车刷写用于集成测试的SoC版本,如采用adb shell指令将心跳关闭,刷写成功后需将心跳开关再次打开,让功能安全心跳正常使能,以覆盖功能安全SoC心跳的测试用例。(跳转到心跳开关配置指令,打开心跳)
DEBUG版本
EDL刷机
1. 利用MCU shell指令强制进入 9008 (推荐)
-
进入MCU shell方法参考:mcu shell命令参考文档
- adb 登录进MCU shell
adb root && adb shell stop mculog microcom /dev/ttyHS4- 接入MCU串口线
-
进入MCU shell后执行下面指令即可通过设置pin脚强制进入9008模式,此种情况心跳自动关闭,进入后即可刷机。
pm.soc.edl.ctrl 1- 利用一键刷机/MiFlash刷机
2. 利用上电短接/MCU调试工具miniwigger进入 9008
-
关闭SoC心跳使能
- 通过SoC侧关闭心跳,重启后依旧关闭。
adb root && adb shell setprop persist.soc_heartbeat_switch false adb reboot //重启生效心跳关闭 -
进入9008模式刷机
- 上电用镊子短接
- MCU调试工具miniwigger进入9008模式。详见硬件老师文档:N801调试说明——P1阶段
-
利用一键刷机/MiFlash刷机
Fastboot刷机
1. 利用MCU shell指令强制进入 fastboot(推荐)
-
进入MCU shell方法参考:mcu shell命令参考文档
- adb 登录进MCU shell
adb root && adb shell stop mculog microcom /dev/ttyHS4- 接入MCU串口线
-
进入MCU shell后执行下面指令即可通过设置pin脚强制进入fastboot,此种情况心跳自动关闭,进入后即可刷机。
pm.soc.fastboot.ctrl 1- 执行Fastboot刷机流程
2. 利用adb指令关闭心跳后再进入fastboot
-
关闭SoC心跳使能
- 通过SoC侧关闭心跳,重启后依旧关闭
adb root && adb shell setprop persist.soc_heartbeat_switch false adb reboot //务必重启,重启后生效心跳关闭 -
执行Fastboot刷机流程
Relase版本
此种场景只介绍如何关闭心跳,以下两种方法可以关闭心跳
组合键进入fastboot/EDL模式
使用心跳功能未使能的MCU版本 @杨诗童
AI801:
[附件: (token=S59pbWFxIoZw3Xxh8tscQ81Inkc)]
XCD其他:
[附件: (token=AidrbQSfNoBedlxUIQxcQ0xanQP)]
常见问题
刷机失败后重启进入recovery模式,无法使用shell指令关闭心跳怎么办?
任何无法使用adb shell的场景,都建议通过MCU串口使用mcu shell指令来进入9008/Fastboot。
Android起不来并且MCU串口也用不了怎么办?
需要重刷没有心跳的MCU 跳转到 解决方案
补充ing…
附录:
设置/获取心跳开关:
SoC侧指令
//关闭心跳:
setprop persist.soc_heartbeat_switch false
//打开心跳
setprop persist.soc_heartbeat_switch true
//重启SoC,配置生效
adb reboot
//获取心跳开关状态
getprop persist.soc_heartbeat_switch
//true 为mcu侧指令
备注:修改MCU侧的心跳开关配置,只在本次SoC运行周期内生效,SoC重启后会下发更改配置,可能会将修改覆盖。
// 1:start 0:stop other:invalid
heartbeat.set.switch $switch
// 打开心跳
heartbeat.set.switch 1
// 关闭心跳
heartbeat.set.switch 0
获取心跳开关状态:
// 1代表打开,0代表关闭修改SoC心跳超时时间:
SoC侧
HAL层已预留SPI设置心跳超时时间接口,暂无shell指令设置方式。
MCU侧
进入MCU shell操作
heartbeat.set.timeout $spi_timeout
//unit:ms
//例如:
// 设置心跳时间为60秒
heartbeat.set.timeout 60000获取SoC心跳超时时间:
heartbeat.get.timeout