【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工程,芯片中各段程序的大致布局如下:

0 0