【CC2541】BLE空中升级——新旧固件(imagA与imageB)的链接文件分析
来源:互联网 发布:北京理工大学网络 编辑:程序博客网 时间:2024/05/16 15:07
参考链接:BLE空中升级-新旧固件(imagA与imageB)的链接文件分析
一、cc254x_f256_imgA.xcl分析
1、段的定义
(1)IDATA段空间范围定义
a.定义IDATA的起始地址为0x0A
-D_IDATA_BEG=0x0A
b.定义IDATA的结束地址为0xFF
-D_IDATA_END=0xFF
注意:跟bim_cc254x.xcl相比,IDATA的起始地址变成了0x0A,将0x08-0x09空间保留给BIM工程的中断向量重定向。
(2)代码运行空间范围定义
a.第一段空间
-D_CODE_BEG=0x0830-D_CODE_END=0x3FFF
这是Bank0的一段空间,紧接着BIM工程代码的page0(0x0000-0x07FF)之后。imageA占用的空间是从0x8000开始的,而真正程序是从0x08030开始执行的。所以imageA的第一段空间从0x0800-0x3FFF,占用bank0的page1-page7这7个页空间。
b.第二段空间
-D_BANK5_BEG=0x59800 -D_BANK5_END=0x5FFFF
c.第三段空间
-D_BANK6_BEG=0x68000-D_BANK6_END=0x6FFFF
d.第四段空间
-D_BANK7_BEG=0x78000-D_BANK7_END=0x7D7FF //old value :0x7E7FF
保留Bank7的最后五个页。保留的最后三个页中,前两个页page125、page126被OSAL用作存储管理页NV page,而最后一个页作为位锁页lock-bits page。(还有前两个page,page123,page124被保留,用于存储自己的一些自定义的信息)。
2、ROM空间布局
之前讲过,imageA占用的空间从0x0800地址,而实际的代码是从0x0830开始运行,其中的0x0800-0x082F地址用于保存imageA文件相关的信息。
(1)0x0800-0x0801这两个字节空间用于保存imageA文件的计算出来的校验和。
-Z(CODE)CHECKSUM=0x0800-0x0801
(2)0x0802-0x080F这段空间用于保存imageA的首部信息。
-Z(CODE)IMAGE_HEADER=0x802-0x80F
image的首部格式如下:
typedef struct {#if defined FEATURE_OAD_SECURE // Secure OAD uses the Signature for image validation instead of calculating a CRC, but the use // of CRC==CRC-Shadow for quick boot-up determination of a validated image is still used. uint16 crc0; // CRC must not be 0x0000 or 0xFFFF.#endif uint16 crc1; // CRC-shadow must be 0xFFFF. // User-defined Image Version Number - default logic uses simple a '!=' comparison to start an OAD. uint16 ver; uint16 len; // Image length in 4-byte blocks (i.e. HAL_FLASH_WORD_SIZE blocks). uint8 uid[4]; // User-defined Image Identification bytes. uint8 res[4]; // Reserved space for future use.} img_hdr_t;
这个首部的大小为14字节,放到0x0802-0x080F这段空间(不算CRC0)。
(3)0x0810-0x0820这段地址空间存放AES的首部。
-Z(CODE)AES_HEADER=0x810-0x82F
(4)设置代码睡眠代码的区域
-D_SLEEP_CODE_SPACE_START=(_CODE_END-7) //-D_CODE_END=0x3FFF -D_SLEEP_CODE_SPACE_END=(_CODE_END) //-D_CODE_END=0x3FFF-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END
将睡眠的代码布局到(_CODE_END-7)~(_CODE_END)这7个字节区域中。
(5)设置一些常量在code段的位置
-Z(CODE)CODE_C=_CODE_BEG-_CODE_END //-D_CODE_BEG=0x0830 -D_CODE_END=0x3FFF
(6)设置常量数据在flash中的位置
a.将flash空间映射到XDATA的高32K字节
-P(CONST)XDATA_ROM_C=0x8000-0xFFFF
b.将flash的Bank5用作存储常量数据段映射到CODE段中
//-D_BANK5_BEG=0x59800 -D_BANK5_END=0x5FFFF-P(CODE)XDATA_ROM_C_FLASH=_BANK5_BEG-_BANK5_END
c.拷贝flash的Bank5数据传输到XDATA的区域中去
-QXDATA_ROM_C=XDATA_ROM_C_FLASH
通过链接器命令-Q将XDATA_ROM_C_FLASH空间即flash的Bank5映射到XDATA_ROM_C即XDATA空间中区,如下:
(7)设置几段空间4字节空间
#if 0-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END#else-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK5_BEG-_BANK5_END,\_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END#endif
(8)设置几个可分区的区域
#if 0-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,\_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END#else-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK5_BEG-_BANK5_END,\_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END#endif
3、杂项
(1)定义第一个非常规的Bank区的地址,也就是Bank1的地址。
-D_FIRST_BANK_ADDR=0x10000
(2)将各个Bank区的逻辑地址转换成物理地址
-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000
(3)关闭警告69
-ww69=i
当使用链接器命令-M时,XLINK会产生一个[w69]的警告,这个警告是可以忽略的,所以这里将这个警告关闭。
(4)关闭警告18
-we18=i
当中断向量重新布局时,会产生[e18]警告,可以忽略这个警告。
(5)设置CRC检验
-J2,crc=8005,=0804-_BANK7_END
CRC检验的起始地址是0x0804,跳过0x0800-0x0801的检验和checksum和0x0802-0x0803的crc shadow。-J2表示checksum的大小为2个字节,crc=8005表示使用生成多项式为:x16+x15+x2+1的CRC16检验
当链接器生成”intel_extended”HEX文件格式时,需要这么做。
二、cc254x_f256_imgB.xcl分析
1、段的定义
(1)、代码运行空间范围定义
a.第一段空间
//-D_CODE_BEG=0x4030 // Last 10 pages of Bank 0.-D_CODE_END=0x7FFF
这是的Bank0的一段空间,紧接着imageA第一段空间(0x8030-0x3FFF)之后。imageB占用的空间从x04000开始,而真正程序是从0x4030开始执行的。所以imageB的第一段空间从0x4000–0x7FFF,占Bank0的后8页空间。
b.第二段空间
-D_BANK1_BEG=0x18000-D_BANK1_END=0x1FFFF
分配给imageB的第二段空间占用整个Bank1(0x18000-0x1FFFF)空间。
c.第三段空间
-D_BANK2_BEG=0x28000-D_BANK2_END=0x2FFFF
分别配给imageB的第三段空间占整个Bank2(0x28000-0x2FFFF)空间。
d.第四段空间
-D_BANK3_BEG=0x38000-D_BANK3_END=0x3FFFF
分配给imageB的第四段空间占整个Bank3(0x38000-0x3FFFF)空间。
e.第五段空间
-D_BANK4_BEG=0x48000-D_BANK4_END=0x4FFFF
分配给imageB的第五段空间占整个Bank(0x48000-0x5FFFF)空间。
f.第六段空间
//-D_BANK5_BEG=0x58000 // First 5 pages of 5-D_BANK5_END=0x597FF //0x5A7FF
分配给imageB的第六段空间占0x58000-0x597FF空间。
2、ROM空间布局
imageB占用的空间从0x4000开始,而实际的代码是从0x4030开始,其中0x4000-0x402F地址用于保存imageB文件相关信息。
(1)0x4000-0x4001这两个字节空间用于保存imageB文件计算出来的校验和。
-Z(CODE)CHECKSUM=0x4000-0x4001
(2)0x4002-0x400F这段空间用于保存imageB的首部信息。
-Z(CODE)IMAGE_HEADER=0x4002-0x400F
(3)0x4010-0x402F这段地址空间存放AES的首部。
-Z(CODE)AES_HEADER=0x4010-0x402F
(4)设置睡眠代码的区域
-D_SLEEP_CODE_SPACE_START=(_CODE_END-7)-D_SLEEP_CODE_SPACE_END=(_CODE_END)-Z(CODE)SLEEP_CODE=_SLEEP_CODE_SPACE_START-_SLEEP_CODE_SPACE_END
将睡眠的代码布局到(_CODE_END-7)~(_CODE_END)这7个字节区域。
(5)设置一些常量在code段的位置
-Z(CODE)CODE_C=_CODE_BEG-_CODE_END
(6)设置常量数据在flash中的位置
a.将flash空间映射到XDATA的高32K字节
-P(CONST)XDATA_ROM_C=0x8000-0xFFFF
b.将flash的Bank4用作存储常量数据段映射到CODE段中
-P(CODE)XDATA_ROM_C_FLASH=_BANK4_BEG-_BANK4_END
c.拷贝flash的Bank4数据传输到XDATA的区域中去
-QXDATA_ROM_C=XDATA_ROM_C_FLASH
通过链接器命令-Q将XDATA_ROM_C_FLASH空间即flash的Bank4映射到XDATA_ROM_C即XDATA空间中区,如下:
(7)设置几段空间4字节空间
#if 0-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END#else-Z(CODE)ALIGNED_CODE|2=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END#endif
(8)设置几个可分区的区域
#if 0-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END#else-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK1_BEG-_BANK1_END,_BANK2_BEG-_BANK2_END,\_BANK3_BEG-_BANK3_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END#endif
3、杂项
(1)定义第一个非常规的Bank区的地址,也就是Bank1的地址。
-D_FIRST_BANK_ADDR=0x10000
(2)将各个Bank区的逻辑地址转换成物理地址
-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000
当链接器生成”intel_extended”HEX文件格式时,需要这么做。
(3)关闭警告69
-ww69=i
当使用链接器命令-M时,XLINK会产生一个[w69]的警告,这个警告是可以忽略的,所以这里将这个警告关闭。
(4)关闭警告18
-we18=i
当中断向量重新布局时,会产生[e18]警告,可以忽略这个警告。
(5)设置CRC检验
-J2,crc=8005,=4004-_BANK4_END
CRC检验的起始地址是0x4004,跳过0x4000-0x4001的检验和checksum和0x4002-0x4003的crc shadow。-J2表示checksum的大小为2个字节,crc=8005表示使用生成多项式为:x16+x15+x2+1的CRC16检验。
三、总结
结合之前的的BIM工程,芯片中各段程序的大致布局如下:
- 【CC2541】BLE空中升级——新旧固件(imagA与imageB)的链接文件分析
- 蓝牙4.0BLE cc2540 cc2541 ios OAD教程(空中更新固件)[原创,多图]
- 蓝牙4.0BLE cc2540 cc2541 ios OAD教程(空中更新固件)[原创,多图]
- 蓝牙4.0BLE cc2540 cc2541 ios OAD教程(空中更新固件)[原创,多图]
- 固件空中升级(OTA)与固件二次引导的原理和设计
- CC2541 空中升级(OAD)
- Android,BLE,OAD,空中升级
- 【BLE】CC2541与CC2540的区别
- CC2541 Large OAD 空中升级方式
- CC2640之OAD固件升级(内置Flash)手动配置ImageB
- CC2640之OAD固件升级(内置Flash)手动配置ImageB
- CC2541关于OAD空中升级(安卓客户端收不到服务的)
- 蓝牙ble实现空中升级功能
- OTA空中升级的难点与解决方案
- 【BLE】CC2541之配对密码的读取与修改
- [BLE] CC2541 BLE Peripheral工程的建立
- 【BLE】CC2541之发现服务与特征值
- <蓝牙BLE>cc2541发现服务与特征值
- android ERR:stack=java.lang.StackOverflowError:stack size 8MB
- Matlab与线性代数 -- 稀疏矩阵的创建
- 关于arch/arm/kernel/return_address.c:66:7: error: redefinition of ‘return_address'的错误解决方案
- 第15周OJ实践12 字符串替换
- 虚拟化I/O qos——mClock算法介绍
- 【CC2541】BLE空中升级——新旧固件(imagA与imageB)的链接文件分析
- 编写Darwin的Module来支持新的流媒体文件格式
- docker容器修改并保存
- Leetcode 132,Palindrome Partitioning 2
- Android 开源框架Universal-Image-Loader解析 基本介绍及使用
- 在Fedora24/25中轻松安装gcc 4.9
- Darwin中RTSP协议的实现
- iOS_为数字键盘增加完成按钮即ToolBar
- 枚举法、穷举法