在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流程图。
它主要是实现程序文件的空中下载,边下载边写入到指定flash区域。
初始化。
/* Initialize ICall module */
ICall_init();
/* Start tasks of external images - Priority 5 */
ICall_createRemoteTasks();
OadTargetApp_createTask();
整体流程是从空中收包,然后经过任务调度,写入flash块。
OadTargetApp_processOadWriteCB -> Queue_put(hOadQ, (Queue_Elem *)oadWriteEvt) -> OadTargetApp_taskFxn中while (!Queue_empty(hOadQ)) -> OAD_imgBlockWrite(oadWriteEvt->connHandle, oadWriteEvt->pData);
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”。
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的架构,分析完 OAD target,就到了 boot 部分了。我是拿CC1350的BIM工程来分析的,CC2640目前只有IAR版本,这对我移植到CC1310极不方便,于是就放下了。
这个BIM按照手册上的流程图,需要计算校验,判断最终下载下来的程序文件的合法性,接着进行跳转。但是我在CC1350没找到这个bim,用的是bim_dual_img,这个并没有计算什么校验,只是简单进行了两个镜像的相互跳转。
D:\ti\simplelink\ble_sdk_2_02_01_18\src\examples\util\bim\cc1350\bim_main.c
// 在这里主要有两个步骤:1.判断flash,挑选镜像A或者B。 2.跳转、复位指针向量等。
疑问的是为什么从1E000开始,这里预留了1K以内做NV存储,不停从末尾取出4字节来判断,一旦ID=0x81则认为镜像B正确,否则就跳转到镜像A。
这是CC1350用的,和CC1310不同,因此要重点对比下。
D:\ti\simplelink\ble_sdk_2_02_01_18\src\examples\util\bim\cc1350\ccfg_app_ble.c
D:\ti\tirtos_cc13xx_cc26xx_2_20_01_08\products\cc13xxware_2_04_02_17240\startup_files\ccfg.c
// 在这个readme中写了CCFG的作用。
customer configuration area (ccfg section) is located at the end of the flash and reflect the hw configuration of the device.
D:\ti\simplelink\ble_sdk_2_02_01_18\src\common\cc26xx\ccs\cc13xx_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)
/* 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
CC2640 OAD 资料的学习,虽然不能直接在 CC1310 上使用。但至少我们学会了如何进行片内flash擦写。BIM工程还教会了我们如何进行程序跳转。