CC2652 on-chip OAD程序升级记录全过程

1 前期准备

参考:设置 BLE OAD 环境

硬件环境

LAUNCHXL-CC26X2R1一块

LAUNCHXL-CC2652RSIP一块

硬件类型

硬件名称

角色

功能

开发板

LAUNCHXL-CC26X2R1

中央设备

通过OAD发送新的固件镜像

开发板

LAUNCHXL-CC2652RSIP

外设

接收中央设备发送过来的固件,进行升级

软件环境

软件类型

软件名称

版本

备注

IDE

Code Composer Studio

10.4.0.00006

SDK

simplelink_cc13x2_26x2_sdk_5_20_00_52

5_20_00_52

BTool

BTool

1.42.19

位置:C:\ti\simplelink_cc13x2_26x2_sdk_5_20_00_52\tools\ble5stack\btool\btool.exe

程序烧写器

UniFlash

7.0.0.3615

串口打印

Xshell

7.0.0012

2 程序升级的一些基本概念

2.1 onchip升级

对于onchip OAD,一共需要3个工程或者镜像文件。分别是persistent_appbim_onchip以及simple_peripheral_oad_onchip

工程

工程名称

角色

功能

bim_onchip

bim_onchip_CC26X2R1_LAUNCHXL_nortos_ticlang

启动管理器

设备启动时决定运行哪个程序。并对程序进行CRC、安全性等验证

persistent_app

persistent_app_CC26X2R1_LAUNCHXL_tirtos_ticlangLAUNCHXL-CC2652RSIP

用于OAD升级的永久应用程序

实现了BLE的OAD配置文件,用于接收升级的镜像包。只有onchip升级才需要此程序

simple_peripheral_oad_onchip

simple_peripheral_oad_onchip_CC26X2R1_LAUNCHXL_tirtos_ticlang

用户应用程序

真正实现业务逻辑的应用程序,还实现了OAD的重置功能

  • bim_onchip

它是一个boot image manger程序,即启动镜像管理器。它常驻MCU的最后一个扇区(对于cc2652R1来说,最后的8KB(起始地址0x56000)),另外CCFG也处于这个扇区。BIM的详细介绍请看:启动映像管理器 (BIM)用于片上 OAD 的 BIM(堆栈库)。只在需要OAD升级的工程中需要BIM程序。

bim_onchip工程有4个bulid选项:

bulid选项

描述

Debug

调试模式,bim启动应用程序时不进行CRC校验

Debug_unsecure

调试模式,bim启动应用程序时不进行安全性(即解密验证)校验

Release

发行模式,bim启动应用程序时进行CRC校验和安全性(即解密验证)校验

Release_unsecure

发行模式,bim启动应用程序时不进行安全性(即解密验证)校验

bim_onchip的源码分析看我在TI论坛发的帖子:CC2652R: onchip 的OAD升级问题

安全验证需要公钥私钥。公钥固化在bim_onchip程序中,待升级镜像的哈希值用私钥签名放入镜像头相应字段中,等升级完成后,bim_onchip程序会用公钥对签名进行解密,与自己计算的镜像哈希值进行比较,如果匹配则安全验证通过。具体看加密和验证过程描述私钥一定要保存好。

安全秘钥的生成是在<SDK_DIR>/tools/common/oad路径下运行python keys/key_generate.py,此路径下会生成新的private.pem、public.pem、key_info.txt3个文件。根据key_info.txt中的内容,替换bim_onchip工程源码(bim_main.c)中相应的内容。具体看生成新的安全秘钥

注意:

1、打开bim_onchip工程时,看到整个Application都是连接的SDK中的文件,包括bim_main.c文件,为了不修改SDK中的内容,将其整个文件夹的所有内容复制到工程中。

2、每次运行python keys/key_generate.py后,都会生成新的公钥私钥对。persistent_appsimple_peripheral_oad_onchip工程按照安全验证build编译(Release)时,需要用到上面生成的私钥(private.pem文件),bim_onchip中用到上面生成的公钥,公钥和私钥一定要配对使用。

3、bim_onchip工程的Release版本默认开启了AUTHENTICATE_PERSISTENT_IMG,即运行永久应用程序时也进行CRC和安全性验证,这个没有必要。所以在工程 -> TOOLS -> defines -> cc26x2r1lp_bim_onchip_Release.opt中,取消其定义重新编译(将

-DAUTHENTICATE_PERSISTENT_IMG改为-DxAUTHENTICATE_PERSISTENT_IMG即可)

  • persistent_app

永久应用程序也常驻MCU,也需要手动刷,它在flash中的默认起始地址是0x38000。此工程有2个bulid选项:

bulid选项

描述

Debug

调试模式,bim启动应用程序时不进行CRC校验

Release

发行模式,bim启动应用程序时进行CRC校验和安全性(即解密验证)校验

其本身也是一个完整的应用程序,专门用于程序的OAD升级。其实现了GATT的OAD配置文件。

  • simple_peripheral_oad_onchip

它是真正的用户应用程序,实现完整的业务逻辑。另外还需要实现GATT的OAD复位配置文件。它在运行时,接收到中央设备发送过来的OAD复位特征值,则它修改其镜像头中的镜像验证字段为奇数个0,然后重启设备,这样bim_onchip程序运行时,它会检测到其镜像验证字段为奇数个0,然后跳过用户应用程序,继续寻找永久应用程序,用于真正的OAD升级。此工程有2个bulid选项:

bulid选项

描述

Debug

调试模式,bim启动应用程序时不进行CRC校验

Release

发行模式,bim启动应用程序时进行CRC校验和安全性(即解密验证)校验

3 注意事项

首先,bim_onchip、persistent_appsimple_peripheral_oad_onchip工程的构建选项必须一致,比如都选择Release构建模式。因为它们的运行是相互关联的,比如是否进行CRC校验和安全性验证等。

含有OAD功能的工程,包括上面描述的persistent_appsimple_peripheral_oad_onchip工程,编译完成后,会调用oad_image_tool 程序,从而得到的生成的hex文件和*_oad.bin文件。此时的hex文件和*_oad.bin文件除了包含镜像文件外,还会在镜像文件前面包含镜像头,其中含有很多升级、校验相关的重要字段,详细内容请看官方用户向导中的OAD镜像头或者我提炼的OAD镜像头

实际操作注意事项

  1. 烧写这3个镜像时,persistent_app和bim_onchip可以用CCS烧写,但simple_peripheral_oad_onchip必须用uniflash进行烧写。原因是uniflash在烧写时会给simple_peripheral_oad_onchip添加crc校验,而CCS不会。如果没有crc校验部分,BIM会认为此镜像是无效的。实际操作时为了方便,3个镜像都可以用uniflash烧录。
  2. 烧写时,persistent_app和bim_onchip用的是hex文件,而simple_peripheral_oad_onchip则必须使用添加了crc校验的bin文件。bin文件的文件名末尾会有_oad.bin。
  3. 烧录时3个镜像必须遵循persistent_app -> simple_peripheral_oad_onchip -> bim_onchip的顺序。在uniflash中,可以按顺序添加这3个镜像,然后点击LOAD一键烧录。

注意

如果bim_onchip工程的Release版本开启了AUTHENTICATE_PERSISTENT_IMG,则必须使用Uniflash来刷新persistent_app工程的_oad.bin(该_oad.bin文件包含有关镜像的 CRC 和(如果适用)安全信息)由oad_image_tool生成的永久镜像,否则设备在重置后将无法启动。刷永久镜像.bin文件时,必须将二进制加载地址指定为永久应用程序项目的链接器文件中指定的起始地址。默认情况下,它位于地址:0x00038000

 

 更改工程名字后如下

 烧写完成之后,用putty打开CC26x2 LaunchPad对应的COM口,可以看到串口打印信息,用LightBlue也可以搜到广播“SP OAD on-chip”,说明烧写正常。

4 分发OAD镜像

可以使用安卓、ios等移动端发送镜像给cc2652进行OAD升级,也可以用PC端软件BTool(C:\ti\simplelink_cc13x2_26x2_sdk_5_20_00_52\tools\ble5stack\btool\btool.exe)配合刷有host_test固件的LAUNCHXL-CC26X2R1开发板。host_test固件在C:\ti\simplelink_cc13x2_26x2_sdk_5_20_00_52\examples\rtos\CC26X2R1_LAUNCHXL\ble5stack\hexfiles中,名为host_test_app.hex。使用UNIFlash将其刷入开发板。通过USB连接到BTool,选择串口进行连接。如下图所示

 默认设备操作选择Discover Connect,点击Scan,扫描发送广播的BLE设备,右侧输出扫描到的BLE设备信息,如图

 扫描完成后,在Slave BDAd 下列列表中选择待升级的蓝牙设备的MAC地址,然后点击Establish,进行连接

 连接成功后,选择Over The Air Download,点击Read Image File按钮,选择要升级的固件镜像(此处的镜像要选择*_oad.bin),然后点击Send按钮等待升级完成

 发送过程中

 如上图,总共553个包,当前发送第101个包,更新完成后

5 OAD应用程序启动流程

查看官网的BLE5-Stack用户向导的BIM for On-Chip OAD (Stack Library)章节,然后又查看了SDK(simplelink_cc13x2_26x2_sdk_5_20_00_52)中bim_onchip_CC26X2R1_LAUNCHXL_nortos_ticlang的工程,发现其main()中的实现与用户向导中的描述有许多不符,猜测可能SDK的工程中改写了算法,而用户向导未改,bim_onchip工程的主要内容如下:

  1. 首先bim会调用Bim_findImage函数,在flash的第0页搜索用户应用程序(镜像类型OAD_IMG_TYPE_APPSTACKLIB),如果成功(即镜像头中的镜像类型正确、镜像验证字段0的个数为偶数、CRC和安全验证都通过),则调用用户应用程序而不返回main()函数
  2. 如果上述的操作失败,则返回到bim_main()函数,再次调用Bim_findImage函数,从flash的第1页开始搜索持久应用程序(镜像类型OAD_IMG_TYPE_PERSISTENT_APP),如果第1页没有找到,则继续寻找第2页,直到结束。如果成功(即镜像头中的镜像类型正确、镜像验证字段0的个数为偶数、CRC和安全验证都通过),则调用持久应用程序而不返回main()函数,从而下载新的用户程序镜像。如果失败则返回main()函数,调用setLowPowerMode()函数进入低功耗。
  • 总结1:bim选择运行用户应用程序还是持久应用程序时,是通过第0页的用户应用程序的镜像头中的镜像验证字段的0的个数的奇偶数判断的,而持久应用程序的镜像验证字段的0的个数一直为偶数,永远不会改变。
  • 总结2:bim总是先从flash的第0页搜索用户应用程序,如果失败(包括镜像验证字段0的个数不为偶数),会再从第2个扇区开始寻找持久应用程序

推断:用户应用程序接收到中央设备的OAD重置服务后,会将自己的镜像验证字段0的个数改为不是偶数(反转一个位),然后重启设备,这样设备重启之后,搜索用户应用程序会失败(因为镜像验证字段0的个数不为偶数),则继续寻找持久应用程序进行下载镜像

  • 总结3:在用户向导中介绍图211的流程说明中的第7步中有提到复制新的用户镜像。但通过分析bim_onchip工程,并未找到相应的代码,因此有个疑问:复制新的用户镜像到什么地方?因此推测,在通过持久应用程序OAD升级新的程序时,直接复制到原有的用户应用程序的地址,即从flash的第0页开始。这样如果在升级过程中断电,则用户应用程序不能够运行,一致停留在持久应用程序中等待升级

下面代码即我删掉不必要的条件编译后的bim_onchip工程中的main函数

int main(void)
{
    /* Read and populate the static variable intFlashPageSize */
    intFlashPageSize = FlashSectorSizeGet();

    uint8_t imgType;
    uint8_t flashPgNum;

    /*
     * First look for an application image
     */
    imgType = OAD_IMG_TYPE_APPSTACKLIB;

    flashPgNum = 0x00;

    Bim_findImage(flashPgNum, imgType);

    /*
     * If the application image isn't found, look for a persistent image
     */
    imgType = OAD_IMG_TYPE_PERSISTENT_APP;

    flashPgNum++;

    while(flashPgNum < MAX_ONCHIP_FLASH_PAGES)
    {
        Bim_findImage(flashPgNum, imgType);
        flashPgNum++;
    }

    /* If we get here, that means there is an Issue: No valid image found */
    
    /* Set the device to the lowest power state. Does not return. */
    setLowPowerMode();

    return(0);
} /* end of main function */
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值