CC1310空中升级笔记02 CC26xx_CC13xx_BLE_OAD_例程梳理

2020-04-17 11:56:59 浏览数 (1)

在CC1310空中升级笔记01中,TI员工提到了CC26系列已经有实现的OAD的例程。本文大部分资料参考了《CC2640 Over-the-Air Download User’s Guide.pdf》,就先从这个文档下手,安装了TI协议栈之后就可以看到了。

本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/

一、功能梳理

CC2640的OAD用这站图最能掌握全局。

首先升级类型有两种,一种是片内、一种是外扩Flash。下文就先围绕片内升级方式,即OAD on chip,做了一些梳理。 其次,还能看出另一个信息,TI做了一个很重要的文件分区处理。如Stack Image,是蓝牙协议栈镜像。这一点真的很酷,这样升级只要升级应用程序镜像,而不用整个程序都来升级一遍,大大提高了升级效率。

具体地,可以看这张图,有完整的镜像划分。

另外,下载好镜像之后,就由BIM(Boot Image Manager)来加载处理了。具体可以看这张BIM流程图。

二、OAD Target代码流程梳理

它主要是实现程序文件的空中下载,边下载边写入到指定flash区域。

1. main.c

初始化。

/* Initialize ICall module */ ICall_init();

/* Start tasks of external images - Priority 5 */ ICall_createRemoteTasks();

OadTargetApp_createTask();

2. oad_target_app.c

整体流程是从空中收包,然后经过任务调度,写入flash块。

OadTargetApp_processOadWriteCB -> Queue_put(hOadQ, (Queue_Elem *)oadWriteEvt) -> OadTargetApp_taskFxn中while (!Queue_empty(hOadQ)) -> OAD_imgBlockWrite(oadWriteEvt->connHandle, oadWriteEvt->pData);

3. oad.c

OAD_imgBlockWrite(uint16_t connHandle, uint8_t pValue) -> OADTarget_writeFlash(imagePage, (blkNum OAD_BLOCK_SIZE), pValue 2, OAD_BLOCK_SIZE);

OAD_imgBlockWrite中传递进来的数据为18字节,前面2字节为镜像块的编号,后面16字节为程序文件。

OADTarget_writeFlash有两种方式,一种是写片内flash,一种是外扩flash。下面是片内的flash接口函数。传递进去的参数是page和偏移以及数据缓冲及长度,最终调用了最底层的flash写接口,这就是ti论坛上Siri说的“CC26xx or the CC13xx都支持读写flash”。

代码语言:javascript复制
void OADTarget_writeFlash(uint8_t page, uint32_t offset, uint8_t *pBuf,
                          uint16_t len)
{
  uint8_t cacheState;

  cacheState = OADTarget_disableCache();

  FlashProgram(pBuf, (uint32_t)FLASH_ADDRESS(page, offset), len);

  OADTarget_enableCache(cacheState);
}

FLASH_ADDRESS这个宏就是绝对地址,因为宏中((page) << 12)会将页序号变成该页的绝对地址。

三、OAD BIM代码流程梳理

按照OAD的架构,分析完 OAD target,就到了 boot 部分了。我是拿CC1350的BIM工程来分析的,CC2640目前只有IAR版本,这对我移植到CC1310极不方便,于是就放下了。

这个BIM按照手册上的流程图,需要计算校验,判断最终下载下来的程序文件的合法性,接着进行跳转。但是我在CC1350没找到这个bim,用的是bim_dual_img,这个并没有计算什么校验,只是简单进行了两个镜像的相互跳转。

1. bim_main.c

D:tisimplelinkble_sdk_2_02_01_18srcexamplesutilbimcc1350bim_main.c

// 在这里主要有两个步骤:1.判断flash,挑选镜像A或者B。 2.跳转、复位指针向量等。 疑问的是为什么从1E000开始,这里预留了1K以内做NV存储,不停从末尾取出4字节来判断,一旦ID=0x81则认为镜像B正确,否则就跳转到镜像A。

2. ccfg_app_ble.c

这是CC1350用的,和CC1310不同,因此要重点对比下。

D:tisimplelinkble_sdk_2_02_01_18srcexamplesutilbimcc1350ccfg_app_ble.c D:titirtos_cc13xx_cc26xx_2_20_01_08productscc13xxware_2_04_02_17240startup_filesccfg.c

// 在这个readme中写了CCFG的作用。 customer configuration area (ccfg section) is located at the end of the flash and reflect the hw configuration of the device.

3. cc13xx_bim_dual_img.cmd

D:tisimplelinkble_sdk_2_02_01_18srccommoncc26xxccscc13xx_bim_dual_img.cmd 对比BIM工程(cc13xx_bim_dual_img.cmd)和APP工程(cc13xx_dual_img.cmd),说明BIM工程的cmd文件有做了如下处理。

  • 1.注释掉ResetISR /–entry_point ResetISR /
  • 2.存储映射(System memory map)
代码语言:javascript复制
/* System memory map */
MEMORY
{
    IVEC_FLASH (RX) : origin = FLASH_BASE, length = IVEC_FLASH_LEN  //0 ~ 00C8

    /* BIM stored in and executes from internal flash */
    /* Flash Size 4 KB */
    FLASH (RX) : origin = BIM_BASE, length = FLASH_PAGE_LEN         // 1F000~20000 =2Week

    /* Application uses internal RAM for data */
    /* RAM Size 16 KB */
    SRAM (RWX) : origin = RAM_APP_BASE, length = 0x00002CFF
}

a.增加一个IVEC_FLASH(0x00000000~0x00C8) b.FLASH (RX)修改为(0x0001F000~0x1000) 备注下Image的工程是在 ICALL_STACK0_START阶段结束。(Properties->ARM Linker->Advanced Options->Command File Preprocessing) c.RAM长度缩小。 2CFF

  • 3.sections 这里头不知道什么语法,总之是分配数据存放在flash还是ram。这个是个难点,暂无思路。

四、 总结

CC2640 OAD 资料的学习,虽然不能直接在 CC1310 上使用。但至少我们学会了如何进行片内flash擦写。BIM工程还教会了我们如何进行程序跳转。


0 人点赞