# Off-Chip OAD #
本节描述了分离镜像的片外OAD(Split Image Off-Chip OAD)和片外OAD库(Library off-chip OAD)之间的差异。片外OAD利用一个外部的flash储存新的镜像在下载和镜像选择/更新期间。
以下处理过程是片外OAD独有的:
- 片外OAD的限制和要求
- 片外OAD内存布局
- BIM用于片外OAD
- 开箱即用(仅适用于分离镜像的片外OAD)
- 将片外OAD添加到现有项目中
## 支持协议栈镜像 ##
片外OAD支持分离镜像和协议栈库编译配置。这意味着用户可以在一个OAD期间更新应用程序和协议栈。Stack和stack_library镜像类型由片外OAD支持,有关每个OAD的优点的说明,请参见以下部分。
>**注意**:外OAD分为了 Split Image Off-Chip OAD和Library Off-Chip OAD。前者是协议栈和应用程序有固定的flash边界。后者没有固定这个边界,Stack的大小是在编译之后确定的。了解TI在存储架构的设计参考存储架构
## Split Image Off-Chip OAD ##
Split Image Off-Chip OAD具有以下优点:
- **OAD镜像的传输时间和灵活性**。
开发人员可以选择使用哪种类型的OAD镜像来执行OAD。如果希望减少OAD传输时间,开发人员可以选择生成仅应用程序的OAD镜像。如果开发人员希望以额外的传输时间为代价升级应用程序以及协议栈,则可以选择生成App + Stack OAD镜像。
- **SimpleLink CC2640R2 SDK参考示例**
在SimpleLink CC2640R2 SDK中提供了simple_peripheral_oad_offchip项目用于片外OAD的实现,以供参考。
Split Image Off-Chip OAD具有以下缺点:
- **增加Flash使用量**
镜像边界的引入可能会删除多达几页的flash,因为它是按页对齐。Split Image Off-Chip OAD也会禁用应用程序和堆栈的全局链接,进一步降低闪存可用性。
## Library Off-Chip OAD ##
Library Off-Chip OAD库具有以下优点:
- **减少flash使用量**
Library Off-Chip OAD库具有以下缺点:
- **OAD传输时间长和镜像文件过大**
- **没有参考示例**
虽然没有参考示例,但是后面文档中将会提供使用 Library Off-Chip OAD详细的步骤。
## Library Off-Chip OAD的限制和要求 ##
为了能正常执行片外OAD,目标系统必须包含以下几点:
需要一个额外的存储设备,至少需要128K的容量。支持多个OAD镜像文件存储,容量为n*128+(n*EXT_FL_PAGE_SIZE),n>=1。
空闲的GPIO口连接外部存储器(例如SPI)
足够的空间来保存BIM的第31页(4K)的全部内容(即Metadata)。
### 片外OAD内存布局如下 ###
![](http://www.leconiot.com/md_res/cc2640r2f/oad/off_chip/image/OADStore.png)
如图所示,片外OAD升级使用内部flash和外部flash共同完成。内部FLASH包含中断向量,嵌入了OAD配置文件的应用程序,BLE堆栈镜像,NV存储区域,BIM和CCFG。
外部存储使用的是512KB的flash。最多能保存3个OAD镜像和3个与OAD镜像相对应的元数据。这部分代码可以在ext_flash_layout.h中看见。每个image占位大小为128KB,每一个镜像(仅限APP或APP+Stack)必须支持OAD配置文件,也就是必须支持OAD功能,以便在复制到片内flash上后进一步启用OAD。
红色区域是永久驻留在flash上的,不会通过OAD进行升级。通过BIM进行镜像选择。防止升级失败后使用一个错误的OAD升级文件。
## BIM用于片外OAD ##
>**警告**BIM将链接CCFG,CCFG用户可以配置,通过写入IMAGE_VALID_CONF为0x1F000,意味着程序启动后自动执行BIM部分代码而不是应用程序代码。BIM将会启动应用程序代码,OAD应用程序部分不需要包含CCFG,这是CC2640R2F的特性,也是也CC2650的区别。
BIM要求在OAD升级中驻留在FLASH中,以便提供一个故障检测机制,用于确定时候运行现有的应用程序镜像还是从外部flash中拷贝新的镜像到内部flash中。当有新的镜像存在在外部FLASH中,BIM对镜像进行CRC校验,如果CRC校验通过,并且没有定义NO_COPY宏,BIM将新的镜像复制到内部flash中,如果定义了NO_COPY宏,BIM将不会加载任何新镜像。
![](http://www.leconiot.com/md_res/cc2640r2f/oad/off_chip/image/BIM.png)
## 开箱即用(仅适用于分离镜像的Split Image Off-Chip OAD) ##
本节使用IAR进行开箱即用的演示
1. 打开bim_oad_offchip项目, 编译并下载到开发板上。
2. 打开simple_peripheral_oad_offchip工程,编译下载协议栈,然后编译下载应用程序。
3. 打开BTool可以发现设备正在广播。
4. 按照 BToll OAD Procedure中详细步骤进行OAD升级。
按照上面步骤即可进行Split Image Off-Chip OAD升级,如果有疑问可以参考附录部分。
>**注意**:在BTool选升级文件的时候确保选在*_oad.bin文件,因为此文件包含元数据。默认情况下,这些文件可以在\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral_oad_offchip\tirtos\iar\app\FlashROM_OAD_Offchip\Exe下找到。
>**注意**:OAD成功后,可能需要重启设备才能再次广播。
## 将OAD添加在现有项目中(Peripheral) ##
本节演示如何通过修改Simple_Peripheral添加OAD功能,并且Simple_Peripheral是一个典型的Library Off-Chip程序。
1. bim_oad_offchip依旧作为BIM程序,不需要修改, 下载进开发板。
2. 将OAD配置文件添加到Simple_Peripheral程序中。分别是:oad.c、oad.h、oad_target.h、oad_target_external_flash.c。这些文件在原始的Simple_Peripheral工程中是从编译中排出了的,将它添加进来。右键对应要添加的文件,取消掉Exclude from build。如下图所示。
![](http://www.leconiot.com/md_res/cc2640r2f/oad/off_chip/image/fileadd.png)
>注意:可以在 \source\ti\ble5stack\profiles\oad\cc26xx中找到这些文件。
3. 将外部Flash中间件添加到应用程序项目,分别是ExtFlash.c、ExtFlash.h。按照上图中同样的方法进行添加。
4. 添加include路径。OAD配置文件路径在 \source\ti\ble5stack\profiles\oad\cc26xx。
5. 使用适当的片外OAD连接器文件。按照步骤2中的方法取消掉排出编译选项。
- IAR使用 cc26xx_app_oad.icf 仅适用于App App,App + Stack
- CCS使用 cc26xx_app_oad.cmd 适用于App App,App + Stack,Library
![](http://www.leconiot.com/md_res/cc2640r2f/oad/off_chip/image/icf.png)
6. 在C/C++ Compiler中添加下面宏定义。
- FEATURE_OAD
- HAL_IMAGE_A
7. 添加OAD_IMG_A=1到您的pre-build。
![](http://www.leconiot.com/md_res/cc2640r2f/oad/off_chip/image/imga.jpg)
8. 修改Post_build命令行为:
$TOOLS_BLE_DIR$\oad\oad_image_tool.exe $PROJ_DIR$\FlashROM_StackLibrary\Exe\ble5_simple_peripheral_cc2640r2lp_app_FlashROM_StackLibrary.hex -t offchip -i app --imgVer 0 -ob $PROJ_DIR$\FlashROM_StackLibrary\Exe\hid_adv_remote_cc2640r2rc_app.bin -m 0x0000 --r 0x0000。
该命令在编译后执行,生成bin文件,也就是OAD升级中需要的文件。经过以上步骤即可完成在现有项目中添加OAD功能。编译通过后可直接下载进入开发板,然后修改步骤6和步骤7中的HAL_IMAGE_A为HAL_IMAGE_B,OAD_IMG_A=1为OAD_IMG_B=1。生成对应的镜像文件之后使用BTool工具下载最新的固件。下载步骤参考
© Copyright 2017, 成都乐控畅联科技有限公司.