XCD SoC功能安全心跳开启后刷机指导

背景:

XCD 将在E4U2阶段开启功能安全SoC心跳监控功能,旨在能够在SoC系统异常场景下MCU根据SoC心跳监控策略重启SoC,实现功能安全要求。此前DCD平台可通过金手指设备将心跳关闭,XCD硬件变更后没有金手指可用,功能安全心跳打开后,会对Fastboot刷机及EDL刷机造成影响**,**MCU会在SoC执行刷机过程中重启SoC(第一次心跳喂狗之前的超时时间是120秒,超过120秒没有喂心跳),进而造成SoC刷机失败,需在刷机前关闭心跳/通过MCU指令进入刷机模式,以下对各种刷机场景进行说明。(更多心跳使能场景说明:XCD SoC心跳使能说明 )

前置说明

心跳使能策略

  1. SoC下电后重新启动(包括STR)后的心跳超时时间是120秒,MCU收到第一包心跳后将超时时间改为60秒。
  2. SoC开机后会下发心跳开关配置到MCU,在此之前MCU会持久化保存此前SoC下发的配置。

注意事项:

对于在实车刷写用于集成测试的SoC版本如采用adb shell指令将心跳关闭,刷写成功后需将心跳开关再次打开,让功能安全心跳正常使能,以覆盖功能安全SoC心跳的测试用例。(跳转到心跳开关配置指令,打开心跳)

DEBUG版本

EDL刷机

1. 利用MCU shell指令强制进入 9008 (推荐)

  1. 进入MCU shell方法参考:mcu shell命令参考文档

    1. adb 登录进MCU shell
    adb root && adb shell
    stop mculog
    microcom /dev/ttyHS4
    1. 接入MCU串口线
  2. 进入MCU shell后执行下面指令即可通过设置pin脚强制进入9008模式,此种情况心跳自动关闭,进入后即可刷机

pm.soc.edl.ctrl 1
  1. 利用一键刷机/MiFlash刷机

2. 利用上电短接/MCU调试工具miniwigger进入 9008

  1. 关闭SoC心跳使能

    1. 通过SoC侧关闭心跳,重启后依旧关闭。
    adb root && adb shell setprop persist.soc_heartbeat_switch false
    adb reboot //重启生效心跳关闭
  2. 进入9008模式刷机

    1. 上电用镊子短接
    2. MCU调试工具miniwigger进入9008模式。详见硬件老师文档:N801调试说明——P1阶段
  3. 利用一键刷机/MiFlash刷机

Fastboot刷机

1. 利用MCU shell指令强制进入 fastboot(推荐)

  1. 进入MCU shell方法参考:mcu shell命令参考文档

    1. adb 登录进MCU shell
    adb root && adb shell
    stop mculog
    microcom /dev/ttyHS4
    1. 接入MCU串口线
  2. 进入MCU shell后执行下面指令即可通过设置pin脚强制进入fastboot,此种情况心跳自动关闭,进入后即可刷机

pm.soc.fastboot.ctrl 1
  1. 执行Fastboot刷机流程

2. 利用adb指令关闭心跳后再进入fastboot

  1. 关闭SoC心跳使能

    1. 通过SoC侧关闭心跳,重启后依旧关闭
    adb root && adb shell setprop persist.soc_heartbeat_switch false
    adb reboot //务必重启,重启后生效心跳关闭
  2. 执行Fastboot刷机流程

Relase版本

此种场景只介绍如何关闭心跳,以下两种方法可以关闭心跳

组合键进入fastboot/EDL模式

N801 进入 Fastboot/EDL/900E/Recovery 操作步骤

xCD方向盘组合按键功能定义和使用说明

使用心跳功能未使能的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