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 */

CC2652 on-chip OAD程序升级记录全过程相关推荐

  1. python爬虫的技能_python-爬虫技能升级记录

    ====== python-爬虫技能升级记录 ====== ===== (一)感知爬虫及爬取流程 ===== 从简单存取一个页面到 爬取到大量的定量数据,对技术要求更高,以百度百科数据爬取为入门练手项 ...

  2. 基于IAP和USB技术的嵌入式系统应用程序升级

    对于内含IAP功能的嵌入式微控制器提出基于IAP和USB技术的系统应用程序升级的新方法.U盘被用作程序代码的存储设备,将微控制器的存储器Flash和SRAM进行有效的区间分配,经外部扩展接口USB,微 ...

  3. 寻找黑匣子--程序行为记录与跟踪

    一. 杀不掉的QQ尾巴 来回跑了几次后,小张不由得感到一阵绝望,楼上宣传部门的一台办公电脑感染了QQ尾巴,时不时就在公司员工交流QQ群里冒出几句色情话语,而这个QQ的使用者很不巧是个年轻女孩,而且机器 ...

  4. DBC2000DB Commander 2000 PRO 升级记录

    打开安装V6.6确定关闭 然后打开注册文件 确定 然后打开DBC2000看看注册是否成功 升级文件说明~6.8 升级之前 请先安装DBC2000V6.6  然后你在用此程序升级6.8 选择目录C:\P ...

  5. 探寻背后的机制化繁为简:网站程序升级不过是文件同步

    苹果落到地上而不是天上,这是重力的作用: 树叶从树枝上飘落的样子谁也无法预测,这是混沌过程: 热恋中的恋人总是难分难舍,这是荷尔蒙等激素作用于下丘脑的结果: ... ... 诸如这些"复杂& ...

  6. 程序升级触发阿里云自身安全机制导致的莫名问题

    最近对放在阿里云的程序作了升级,但在升级的时候却出现了一个莫名其妙的问题,导致整个应用无法使用.这是一个ecshop的程序,程序升级完以后出现莫名其妙的语法错误.然而程序本地测试并无问题. 报错异常 ...

  7. BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图

    BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图 导读 想更好的了解区块链技术?还是用程序猿的方式来加深了解和探索区块链吧!实际案例应用会让我们更加熟悉它的底层技术! ...

  8. 您应该考虑将应用程序升级到Spring 4的5个理由

    Spring Framework于2004年首次发布,是顶级Java框架之一. Spring 4已于2013年12月发布,它是支持Java 8的第一个框架版本.了解为什么应该考虑将应用程序升级到Spr ...

  9. python 程序耗时记录_Python学校的学生身高记录程序

    python 程序耗时记录 A team of 5 people is assigned with a task to record the heights of students in a scho ...

最新文章

  1. opencv 行与列
  2. Java遍历Map对象的四种方法
  3. 看看是否有人用USB偷插你的电脑
  4. 隔离公司各个部门--虚拟路由器(RIP)
  5. boost::adaptors::ref_unwrapped相关的测试程序)
  6. SSM中抛出异常 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoad
  7. C# WPF MVVM模式下在主窗体显示子窗体并获取结果
  8. Java编写简单密码问题
  9. 计算机辅助齿轮图标注,机械CAD齿轮画法
  10. 人脸方向学习(十一):Face Landmark Detection-PFLD解读
  11. 像在K8S集群中一样运行本地程序
  12. eclipse中出现代码覆盖的颜色信息,如何去掉
  13. 美国大学计算机理论专业phd,揭秘美国大学计算机专业PHD申请难度
  14. JAVA程序员的堕落:只知框架不懂底层原理
  15. 看完这个,css中position的绝对定位相对定位就懂了
  16. Homebridge 插件编写
  17. 华大半导体HC32F4A0笔记(四),SPI读写国产128kB EEPROM 上海贝岭BL25CMIA
  18. 如何高效的管理参考文献
  19. SARScape中用sentinel-1数据做SBAS-InSAR完整流程(2/2)
  20. 问题 H: Problematic Public Keys

热门文章

  1. 为什么大企业都要做软文推广?怎么利用时事热点写好软文
  2. 郭明錤:Galaxy Note 10有6.5、6.7英寸两种机型
  3. 广州市黄埔区科技局关于开展区配套科技项目逾期未验收项目清理工作的通知
  4. 景点查询系统c语言程序,《C语言程序设计》课程计报告-景点查询系统.doc
  5. 《惢客创业日记》2021.05.29(周六)怀念儿时的凉拌西红柿
  6. 小程序下拉刷新上拉加载 前台+后台
  7. Android应用开发--MP3音乐播放器滚动歌词实现,flutter跳转动画
  8. Centos7磁盘管理
  9. HTML学生个人网站作业设计 明星易烊千玺介绍(HTML+CSS) web前端开发技术 web课程设计 网页规划与设计
  10. 推荐 | Python机器学习项目实战(附代码 + 可下载)【一】