在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”。

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。这个是个难点,暂无思路。

四、 总结

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


CC1310空中升级笔记02 CC26xx_CC13xx_BLE_OAD_例程梳理相关推荐

  1. CC1310空中升级笔记05 BIM适配工程处理

    前言 在学习OAD例程时,才真正明白CC1350 project0的用处.对一个待增加OAD的工程,需要学习它的操作方法.另外我还结合自己淌过的几个坑,总结了这个操作记录.希望能对一些做CC1310 ...

  2. CC1310空中升级笔记03 CC1350_BLE_OAD_Project0

    这是一个官方指南,关于如何对CC1350工程修改,从而利用BLE来无线升级. Getting Started Build your own application image and use BLE ...

  3. 乐鑫esp8266学习rtos3.0笔记第6篇:esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网之上增加dns域名解析!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  4. 如何实现蓝牙空中升级BLE OTA

    如何实现BLE OTA?什么叫DFU?如何通过UART实现固件升级?又如何通过USB实现固件升级?怎么保证升级的安全性?什么叫双备份(dual bank)DFU?什么叫单备份(single bank) ...

  5. Unity 入门笔记 - 02 - 各种动画

    Unity 入门笔记 - 02 - 各种动画 前言:上一篇笔记记录了从零开始安装软件,到搭建最基本的游戏场景和角色,最后开始接触了脚本代码.对unity游戏引擎的工作方式有了基本的认知.接下来开始进一 ...

  6. 大数据之路读书笔记-02日志采集

    大数据之路读书笔记-02日志采集 数据采集作为阿里大数据系统体系的第 环尤为重要.因此阿里巴巴建立了一套标准的数据采集体系方案,致力全面.高性能.规范地完成海量数据的采集,并将其传输到大数据平台.本章 ...

  7. 图文手把手教程--ESP32 OTA空中升级(阿里云物联网平台)

    本文内容 1)使用ota_example_mqtt例程,通过阿里云物联网平台,进行OTA升级. 2)将例程编译成两个版本,版本1.0.0下载至ESP32开发板,版本2.0.0上传至阿里云物联网平台. ...

  8. 图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)

    本文内容 1)使用hello_world例程,编译生成hello_world.bin文件,并且开启HTTP本地服务器. 2)使用simple_ota_example例程,通过HTTP服务器访问hell ...

  9. python学习笔记02

    python学习笔记02 面向对象Object Oriented 概述 类和对象 封装 继承 多态 类与类的关系 设计原则 总结 python学习笔记03 面向对象Object Oriented 概述 ...

  10. 大数据Hadoop教程-学习笔记02【Apache Hadoop、HDFS】

    视频教程:哔哩哔哩网站:黑马大数据Hadoop入门视频教程 教程资源:https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666 [P001-P ...

最新文章

  1. fx-4500科学计算机用法,应用CASIOfx-4500PA计算器计算LC50的方法
  2. android字体行距,android textview设置字体的行距和字间距
  3. CentOS常用环境配置(MySQL、jdk、Redis、Nginx)
  4. 《剑指offer》从上往下打印二叉树
  5. On branch master nothing to commit, working tree clean
  6. linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)
  7. hadoop 常用hdfs命令
  8. jquery 序列化表格内容为字符串(serialize)
  9. 25 条 SSH 命令和技巧
  10. 局域网SDN技术硬核内幕 二 从局域网到互联网
  11. 夜神模拟器adb找不到
  12. 巴斯大学计算机世界专业排名,巴斯大学有哪些专业_专业排名(上交世界排名)...
  13. .net C# asp.net SMTP 匿名发邮件完整解决方案,有源码.
  14. 怎么把一些文件的打开方式变成未知应用程序
  15. 微信小程序——三角形面积计算
  16. php x63 157 162,浙江理工大学 我的编程之路 零基础学C/C++ 200题 标程/题解
  17. Win10问题篇之——WIN2016和WIN10关闭同步主机服务,节省磁盘频繁读取,并关闭自动维护
  18. 使用IDEA 进行 安卓开发
  19. GitHub 热点速览 Vol.16:化身蒙娜丽莎和乔布斯对话
  20. 使用Vue表单时输入框无法输入文字

热门文章

  1. ios代码拨打电话时,电话号码格式兼容性处理问题:
  2. 2011广告联盟排名,最好的广告联盟推荐
  3. Mplayer SMplayer 软件配置
  4. 为什么牙齿上有白白的东西?
  5. 唐威:用rust写椭圆曲线算法
  6. python赋值01_少说话多写代码之Python学习022——赋值语句的用户01(序列解包)...
  7. 2021年网络安全省赛--web隐藏信息探索解析(中职组)
  8. 快速查看网页元素的CSS样式
  9. VMWare虚拟机启动img文件
  10. ie浏览器的标准模式与怪异模式的设置与区分方法