分享

Boot开发:App诊断请求($10 02/82)信息"传递"给Boot方式(一)

 开心果NeedCar 2023-06-21 发布于上海

做Bootloader(Boot)开发的小伙伴应该比较关注一个问题:“Application(App)程序升级,需要通过诊断服务($10 02/82),让程序进入编程会话(跳转到Boot),请求Boot升级新的App程序。问题来了:App如何将"请求升级"信息传递给Boot呢?

进入编程会话会涉及一个Action,即:程序从App跳入Boot。因为AppBoot是独立的程序,会共用uC的资源,为了保证Boot使用uC资源的可靠性和安全性,App进入Boot程序之前,需要对App使用的资源进行去初始化(De-Init)操作,程序进入Boot程序之后,再重新初始化软/硬件资源。对于Boot,可以参考前文Bootloader开发:初识Bootloader

既然需要重新初始化软/硬件资源,那么大部分的RAM区会被清零Boot如何知道App有“升级请求”呢其实,方式有多种,根据项目情况,选择适合的方式即可。

本文基于英飞凌tc3xx,分享一种方法:将诊断请求$10 02/82信息存RSTCON2寄存器,该寄存器特点:软复位,USRINFO位域不清零

1
RSTCON2寄存器

使用RSTCON2寄存器,实质是使用RSTCON2寄存器的USRINFO位域。RSTCON2寄存器有什么特点呢?如下所示:

根据手册的说明,USRINFO位域只有冷启动的时候,信息被清除,软复位的时候($10 02/82请求属于软复位),信息不清除。因此,可以利用该特性,在App中,向USRINFO位域写入“升级请求”信息(eg:10 02/82),程序跳转入Boot以后,Boot程序首先读取USRINFO位域信息,如果读取到10 02/82信息,则进入编程会话,执行App程序升级,否则,判断App Flag是否有效,如果有效则跳入App程序。

实现示意如下所示:

代码实现

App中的代码实现如下所示:
#define RSTCON2_ADDRESS  0xF0036064    
if(APP Request Update){ /* App Write $10 02/82 Info to RSTCON2.USRINFO */ *((*uint32)RSTCON2_ADDRESS) |= 0x1002FFFF;}

Boot中的代码实现如下所示:

#define RSTCON2_ADDRESS  0xF0036064    /* Boot Read App diagnostic request($10 02/82) Info */uint16 App_Update_Request = uint16((*((*uint32)RSTCON2_ADDRESS)) >> 16);
if((App_Update_Request == 0x1002) || (App_Update_Request == 0x1082)){ /* Update Application Handle */}else{ /* Jump App Handle */}

参考资料

Infineon-AURIX_TC3xx_Part1-UserManual-v01_00-EN.pdf

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多