参考链接:BLE空中升级-新旧固件(imagA与imageB)的链接文件分析
-D_IDATA_BEG=0x0A
-D_IDATA_END=0xFF
注意:跟bim_cc254x.xcl相比,IDATA的起始地址变成了0x0A,将0x08-0x09空间保留给BIM工程的中断向量重定向。
-D_CODE_BEG=0x0830
-D_CODE_END=0x3FFF
这是Bank0的一段空间,紧接着BIM工程代码的page0(0x0000-0x07FF)之后。imageA占用的空间是从0x8000开始的,而真正程序是从0x08030开始执行的。所以imageA的第一段空间从0x0800-0x3FFF,占用bank0的page1-page7这7个页空间。
-D_BANK5_BEG=0x59800
-D_BANK5_END=0x5FFFF
-D_BANK6_BEG=0x68000
-D_BANK6_END=0x6FFFF
-D_BANK7_BEG=0x78000
-D_BANK7_END=0x7D7FF //old value :0x7E7FF
保留Bank7的最后五个页。保留的最后三个页中,前两个页page125、page126被OSAL用作存储管理页NV page,而最后一个页作为位锁页lock-bits page。(还有前两个page,page123,page124被保留,用于存储自己的一些自定义的信息)。
之前讲过,imageA占用的空间从0x0800地址,而实际的代码是从0x0830开始运行,其中的0x0800-0x082F地址用于保存imageA文件相关的信息。
-Z(CODE)CHECKSUM=0x0800-0x0801
-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)。
-Z(CODE)AES_HEADER=0x810-0x82F
-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个字节区域中。
-Z(CODE)CODE_C=_CODE_BEG-_CODE_END //-D_CODE_BEG=0x0830 -D_CODE_END=0x3FFF
-P(CONST)XDATA_ROM_C=0x8000-0xFFFF
//-D_BANK5_BEG=0x59800 -D_BANK5_END=0x5FFFF
-P(CODE)XDATA_ROM_C_FLASH=_BANK5_BEG-_BANK5_END
-QXDATA_ROM_C=XDATA_ROM_C_FLASH
通过链接器命令-Q将XDATA_ROM_C_FLASH空间即flash的Bank5映射到XDATA_ROM_C即XDATA空间中区,如下:
#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
#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
-D_FIRST_BANK_ADDR=0x10000
-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000
-ww69=i
当使用链接器命令-M时,XLINK会产生一个[w69]的警告,这个警告是可以忽略的,所以这里将这个警告关闭。
-we18=i
当中断向量重新布局时,会产生[e18]警告,可以忽略这个警告。
-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文件格式时,需要这么做。
//
-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页空间。
-D_BANK1_BEG=0x18000
-D_BANK1_END=0x1FFFF
分配给imageB的第二段空间占用整个Bank1(0x18000-0x1FFFF)空间。
-D_BANK2_BEG=0x28000
-D_BANK2_END=0x2FFFF
分别配给imageB的第三段空间占整个Bank2(0x28000-0x2FFFF)空间。
-D_BANK3_BEG=0x38000
-D_BANK3_END=0x3FFFF
分配给imageB的第四段空间占整个Bank3(0x38000-0x3FFFF)空间。
-D_BANK4_BEG=0x48000
-D_BANK4_END=0x4FFFF
分配给imageB的第五段空间占整个Bank(0x48000-0x5FFFF)空间。
//
-D_BANK5_BEG=0x58000 // First 5 pages of 5
-D_BANK5_END=0x597FF //0x5A7FF
分配给imageB的第六段空间占0x58000-0x597FF空间。
imageB占用的空间从0x4000开始,而实际的代码是从0x4030开始,其中0x4000-0x402F地址用于保存imageB文件相关信息。
-Z(CODE)CHECKSUM=0x4000-0x4001
-Z(CODE)IMAGE_HEADER=0x4002-0x400F
-Z(CODE)AES_HEADER=0x4010-0x402F
-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个字节区域。
-Z(CODE)CODE_C=_CODE_BEG-_CODE_END
-P(CONST)XDATA_ROM_C=0x8000-0xFFFF
-P(CODE)XDATA_ROM_C_FLASH=_BANK4_BEG-_BANK4_END
-QXDATA_ROM_C=XDATA_ROM_C_FLASH
通过链接器命令-Q将XDATA_ROM_C_FLASH空间即flash的Bank4映射到XDATA_ROM_C即XDATA空间中区,如下:
#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
#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
-D_FIRST_BANK_ADDR=0x10000
-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*_NR_OF_BANKS+0x10000=0x8000
当链接器生成”intel_extended”HEX文件格式时,需要这么做。
-ww69=i
当使用链接器命令-M时,XLINK会产生一个[w69]的警告,这个警告是可以忽略的,所以这里将这个警告关闭。
-we18=i
当中断向量重新布局时,会产生[e18]警告,可以忽略这个警告。
-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工程,芯片中各段程序的大致布局如下: