CC1310空中升级笔记02 CC26xx_CC13xx_BLE_OAD_例程
[复制链接]
一,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”。
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:\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。
2. ccfg_app_ble.c
这是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.
3. cc13xx_bim_dual_img.cmd
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
3.sections
这里头不知道什么语法,总之是分配数据存放在flash还是ram。这个是个难点,暂无思路。