通常在实现OAD(on-air-download)功能的过程中,TI会提供标准的示例BIM(Boot Image Manager)代码来进行镜像校验和下载。在TI所提供的示例代码中,BIM代码一般位于内部flash page31,和CCFG相邻。若用户根据自身功能定义不同,需要在BIM代码区域增加更多功能(例如自定义UART / SPI boot, 自定义安全校验功能等等)而导致自定义功能后的BIM代码超出4k byte,又由于BIM区域与CCFG及NV Storage Area相邻,在原有位置不能扩大,只能考虑重新为BIM划定地址空间来满足需求。
本文基于LAUNCHXL-CC2650评估板(http://www.ti.com.cn/tool/cn/launchxl-cc2650) 和BLE-STACK-2-2-1 SDK,详细描述如何将原有的OAD示例代码所包含的BIM起始地址从0x1F000改到0x1000,并且将BIM的地址区间从4k扩到8k。
注:所有不同版本的BLE SDK可以在以下网址找到:http://www.ti.com/tool/BLE-STACK-ARCHIVE
此外本文还会谈到在进行BIM重定位过程中会遇到的以下问题及其解决方案:
- TI RTOS相关Flash区域冲突的规避
- 新的目标Image有效header的产生
- 如何修改python工具的脚本生成新的Image
*****************************************************************************************************************
首先关于BIM起始地址的修改,分以下几步:
- Step1: 修改simple_peripheral project -> cc2650lp_app project的 flash起始地址
- Step2: 重新给bim_extflash project 的BIM代码分配地址空间
- Step3: 使用新的BIM分配方式来实现OAD功能
Step1:修改simple_peripheral project -> cc2650lp_app project的 flash起始地址
在IAR7.70/IAR7.8中导入C:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral 文件夹下的项目如下
1) 修改APP_IMAGE_START
打开cc2650lp_app-FlashOnly_OAD_ExtFlash 工程的option--linker—config,将APP_IMAGE_START从0x1000修改成0x3000
2) 修改RTOS运行方式
从项目中打开打开CC2640.cfg,或者直接在以下地址内找到这个文件: ble_sdk_2_02_01_18\src\common\cc26xx\kernel\cc2640\config)
注释掉下图所示的代码:
原因:当选择“use BIOS in ROM”方式时,RTOS 的ROM指针会被固定的放在0x1500区域。这样就与我们所想要自定义的BIM代码空间冲突了。而选择“use BIOS in Flash”的方式可以让TI-RTOS从FLASH启动,以避免这个问题。当然”use BIOS in Flash”的方式会稍微多占用一些用户的flash区域。
3) 修改reset vector的地址
接上一步,在CC2640.cfg中,将m3Hwi.resetVectorAddress 从0x1010修改为0x3010。
原因:这是reset vector的地址,应该跟在header后面。
step2 :重新给bim_extflash project 的BIM代码分配地址空间
在IAR7.70/IAR7.8中导入C:\ti\simplelink\ble_sdk_2_02_01_18\examples\util\bim_extflash\cc2640文件夹下的项目如下
打开上图所示的cc26xx_bim_extflash.icf文件,重新定义一个FLASHPAGE1,定义其范围为8k,把region BIM定义为PAGE1的区域,并将BIM_START从0x1F000修改到0x1000.
编译通过后,检查生成的bim_extflash.map, 确认之前的改成是否有效。
Step3:使用新的BIM分配方式来实现OAD功能
基于step2中的操作,打开同一个项目中如下图所示的bim_main.c
做如下修改:
重新打开STEP1中修改过的C:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral下的project, 找到
找到图中所示的oad_target_external_flash.c,做如下修改
以上三步完成后,各自重新编译成功,即完成了项目需要的所有改动。
*************************************************************************************
其次,为了配合新的地址分配来实现OAD,我们需要生成新的目标Hex待烧录文件。仍然采用相关的Python工具(这里使用了Python 2.7.10)来生成需要的新的hex文件(新的文件包含正确的metadata Header)。
注:这里重点说明BIM地址修改后,如何对python脚本进行修改。关于提到的Python工具的下载和使用说明可以参见BLE SDK中包含的CC2640 BLE OAD User’s Guide.pdf说明文档中的如下章节,这里不另加赘述。
- 10.1 Installing Python
- 10.2 TI OAD Image Tool (Python)
根据我们之前的修改,已经把simple_peripheral project -> cc2650lp_app project 的代码起始地址改成了0x3000,而原来采用的python工具脚本所生成的hex文件,是配置成将header的imgAddr改成0x1000的,与我们需要把起始代码改成0x3000的需求不符。所以,我们需要对原有python 工具的脚本和相关操作进行修改,分成以下两步:
1) 修改oad image的脚本文件( oad_image_tool.py)
该脚本文件位于:C:\ti\simplelink\ble_examples-ble_examples-2.2\tools\scripts\oad文件夹
用PythonGUI打开该文件,将startAddr赋值为0x3000,如下:
2) 修改python 工具的脚本的相关操作
这里我们会用到两个Python的argument: -m –r, 来完成修改目标Image的metadata header地址 的目的。
在命令行界面输入如下命令:
> set PATH=%PATH%;C:\python27\
> Python C:\ti\simplelink\ble_examples-ble_examples-2.2\tools\scripts\oad\oad_image_tool.py C:\Users\x0269290\Downloads\Desktop\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar\app\FlashOnly_OAD_ExtFlash\Exe\simple_peripheral_cc2650lp_app.hex -o C:\Users\x0269290\Downloads\Desktop\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar\app\FlashOnly_OAD_ExtFlash\Exe\Simple_peripheral_cc2650lp_app.hex -m 0x3000 -r :0xD000
(注:根据python脚本、目标hex、输出hex所在位置及名称的不同需要对命令做出对应的更改。)
如图所示:
得到结果如下:
注:以上例子中的“-m”是用命令给metaAddr赋值。但因为metaAddr(0x3000)大于imgStartAddr(0x1000)导致错误,所以在1)中修改python脚本中的对应代码。
完成上述步骤后,将修改好的APP image用烧写工具(如:flashprogram2)烧写进launchpad(注意:烧写顺序和之前一样,先BIM,再stack,再App)就可以进行OAD操作了。然后照常用BLE device monitor对App进行操作,可以看到如图所示,App的代码段已经下面是烧录完正确image后BLE device monitor参考界面。