• 578查看
  • 0回复

[网络开发] 基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载

[复制链接]


该用户从未签到

发表于 28-8-2023 09:51:30 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


随着芯片资源的不断扩充,增加了App(Application)升级方式的多样性。比如,本文要讨论的SOTA(Software Updates Over The Air),通过Aurix TC3xx SWAP机制,使得App的升级更加便捷。本文讨论实现SOTA的一些关键性问题:


    Aurix TC3xx的内存映射机制

    SWAP配置及注意事项
1Aurix TC3xx的内存映射机制
如果要支持SWAP功能,首先,硬件的内存资源需要足够。因为SWAP功能需要两个等大小的物理内存空间,用以存储程序。eg:App程序的大小为3Mbyte,如果要支持SWAP功能,至少需要硬件的PFlash空间>6Mbyte。先看一下TC39x手册中的内存空间及映射机制:

一、Standard Address Map

不启用SOTA功能时,App程序可以存在如下所示的PF0(Program Flash0)~ PF5(Program Flash5)中,空间大小共计16Mbyte,16Mbyte的空间划分在Segement A,如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w1.jpg

二、Alternate Address Map
启用SOTA功能时,PFlash被划分为两个Bank Group,即:A-Banks和B-Banks,这也就是我们常说的A/B分区,其中一个Banks被映射到CPU的可执行空间,这个Banks被称为激活区(Active Banks),未被映射到CPU执行空间的Banks被称为非激活区(Inactive Banks)。其中,PF0、PF1、PF4映射到A-Banks,PF2、PF3、PF5映射到B-Banks,如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w2.jpg

对于TC39x,SWAP的空间可以达到7MByte,A/B分区如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w3.jpg

A-Banks和B-Banks各使用7M的物理内存空间,而程序实际运行时,均可以映射到0xA0000000起始的虚拟地址空间,如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w4.jpg

注意:

通过DMU(Data Memory Unit)操作Flash时,需要操作Pflash映射的物理地址空间。即:Active Banks擦除Inactive Banks时,需要按照Inactive Banks映射的地址空间擦/写。

eg:A-Banks(Active Banks)的起始地址0xA0000000,B-Banks(Inactive Banks)的起始地址0xA0600000,A-Banks操作Flash Driver擦/写B-Banks时,操作的起始地址为0xA0600000。
2SWAP配置及注意事项1、SWAP使用的基本流程

对于SWAP功能的使能,包括基本的4个流程:


    调整Linker文件(链接文件);

    软件开发,主要指App程序开发,生成可执行文件(*.bin、*.Hex等);

    将可执行文件烧录到PFlash中;

    配置SWAP,包括:A/B选择配置,SWAP使能。

对应流程如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w5.jpg

注意:这里的Reset,不能是Application Reset,推荐System Reset。
(1)调整Linker文件这里给出一个Linker文件调整的示意(不带HSM(Hardware Security Module)),如下所示:
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w6.jpg

对于TC397,A/B均可以分配7M空间,之后根据调整的链接文件,分别编译Project A和Project B,即:Project A对应A-Banks的Linker A,Project B对应B-Banks的Linker B,一般处理时,Linker A和Linker B共用同一个链接文件。
本文关注的核心点:Configuring SWAP。2、SWAP配置

配置SWAP,需要配置UCB23(ORIG)和UCB31(COPY),选择映射地址。UCB位于DFlash0区域,UCB23(ORIG)和UCB31(COPY)的地址空间范围如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w7.jpg

UCB23的格式固定如下:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w8.jpg

SWAP的实例最多可以配置16个,但是,固件SSW(Startup Software )只选择最后一个有效的执行。(一)UCB_SWAP_ORIG_MARKERLx(x=0~15)SWAP位域设置地址映射方式,即:上述提到的STD(Standard Address Map,0x55),ALT(Alternate Address Map,0xAA),如下所示:
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w9.jpg

(二)UCB_SWAP_ORIG_MARKERHx(x=0~15)

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w10.jpg

MARKERHx中存放对应MARKERLx.SWAP的入口地址。

(三)UCB_SWAP_ORIG_CONFIRMATIONLx(x=0~15)

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w11.jpg

如果要MARKERLx.SWAP有效,需要在UCB_SWAP_ORIG_CONFIRMATIONLx寄存器中写入固定值0x57B5327F。

(四)UCB_SWAP_ORIG_CONFIRMATIONHx(x=0~15)

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w12.jpg

存放CONFIRMATIONLx.CODE的入口地址。

(五)SWAP配置的代码实现

SWAP的配置是SWAP使能的前提,如上的(1)~(4)的代码实现示意如下:
/* Memory A/B SWAP */void Swap_ConfigAndEnable(uint32 map){    /* UCB_SWAP_COPY */    ucb_erase(UCB_SWAP_COPY);    ucb_write(UCB_SWAP_COPY, map, UCB_SWAP_COPY);    ucb_write(UCB_SWAP_COPY + 8, CONFIRMEDCODE, UCB_SWAP_COPY + 8);    ucb_write(UCB_SWAP_COPY + 0x1F0, UNLOCKCODE, 0x00000000);    /* UCB_SWAP_ORIG */    ucb_erase(UCB_SWAP_ORIG);    ucb_write(UCB_SWAP_ORIG, map, UCB_SWAP_ORIG);    ucb_write(UCB_SWAP_ORIG + 8, CONFIRMEDCODE, UCB_SWAP_ORIG + 8);    ucb_write(UCB_SWAP_ORIG + 0x1F0, UNLOCKCODE, 0x00000000);
    /* Enable SWAP */    ucb_write(UCB_OTP0_COPY + 0x1E8, 0x00030000, 0x00000000);    ucb_write(UCB_OTP0_ORIG + 0x1E8, 0x00030000, 0x00000000);}
SWAP的禁用代码示意如下:
/* SWAP Disable */void swap_disable(void){// Erase UCB31(UCB_SWAP_COPY)    ucb_erase(UCB_SWAP_COPY);// Write Confirmation Code into UCB31    ucb_write(UCB_SWAP_COPY + 0x1F0, UNLOCKCODE, (uint32)0x00000000);
// Delete UCB23(UCB_SWAP_ORIG)    ucb_erase(UCB_SWAP_ORIG);// Write Confirmation Code into UCB23    ucb_write(UCB_SWAP_ORIG + 0x1F0, UNLOCKCODE, (uint32)0x00000000);
// Erase UCB40(UCB_OTP0_COPY)    ucb_erase(UCB_OTP0_COPY);// Write Confirmation Code into UCB40    ucb_write(UCB_OTP0_COPY + 0x1F0, UNLOCKCODE, (uint32)0x00000000);
// Erase UCB32(UCB_OTP0_ORIG)    ucb_erase(UCB_OTP0_ORIG);// Write Confirmation Code into UCB32    ucb_write(UCB_OTP0_ORIG + 0x1F0, UNLOCKCODE, (uint32)0x00000000);}
提示:


    这里的map = 0x55或者0xAA;

    UCB23对应的CONFIRMATION寄存器配置成UNLOCKCODE模式(0x43211234)。

3、SWAP使能

SWAP的使能需要配置UCB_OTPx_ORIG(x = 0~7),如下所示:
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w13.jpg

启动阶段,SSW会校验UCB_OTP0~7:

    默认校验UCB_OTP0(在CONFIRMED或者UNLOCKED状态下均会校验);对于UCB_OTP1~7,只有在CONFIRMED状态下才会校验;如果ORIG区无效,会校验对应的COPY区。
使能SWAP,需要配置UCB32的PROCONTP寄存器(Offset = 41E8H),即:向0xAF4041E8地址写入0x00030000。
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w14.jpg

SWAP的初始化流程如下所示:

基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w15.jpg

注意:使能SWAP功能之前,需要确保UCB_SWAP_ORIG和UCB_SWAP_COPY已完成配置。SWAPEN配置使能以后,执行System Reset生效。当UCB32的PROCONTP寄存器配置使能以后,可以通过读取HF_PROCONTP的SWAPEN位域确认SOTA的使能情况,如下所示:
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w16.jpg

软件可以通过读取SCU_STMEM1寄存器的SWAP_CFG位域确认当前激活的Banks,如下所示:
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w17.jpg

4、SWAP配置不当导致的锁板风险

对于SWAP的使用,要特别的注意,否则就会导致板子锁死,且不可不恢复,如下所示:
基于Aurix TC3xx SWAP机制的SOTA实现 | 附demo下载w18.jpg

后台回复ECU025 获取TC387的demo工程

End

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 13:58 , Processed in 0.244943 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.