本帖最后由 小恩GG 于 2019-11-7 16:15 编辑
【经验分享】RT105X XIP无DCD qspi flash image实例分析 一,文档介绍 前面写了一篇RT105X烧录RAM APP到qspi flash image实例分析的经验分享,讲了RAM执行的APP烧录到外部qspi flash之后的image情况分析, 具体链接如下: 那么,如果是XIP的app,同样无DCD的image情况又是怎样的呢?下面我们以同样的方法看看具体的image 结构,实际上支持XIP的地址情况更加清晰明了。
图1 bootimage 下面我们使用IDE生成一个XIP的代码,然后通过MCUBootUtility工具烧录之后,具体分析相关的内存块以及启动情况,希望能够更加清楚的帮助大家理解RT的外部memory启动。 二,IAR 生成XIP nor flash app代码 这里以官方的SDK代码为例,去生成一个QSPI 的XIP srec代码。 因为是QSPI的flash,而官方RT1050 SDK的默认配置是hyper flash,所以需要修改代码,下面给出具体qspi以及XIP代码需要修改的注意点: 1. evkbimxrt1050_flexspi_nor_config.c 屏蔽之前const flexspi_nor_config_thyperflash_config代码,修改为: const flexspi_nor_config_tqspiflash_config = { .memConfig = { .tag = FLEXSPI_CFG_BLK_TAG, .version = FLEXSPI_CFG_BLK_VERSION, .readSampleClkSrc =kFlexSPIReadSampleClk_LoopbackFromDqsPad, .csHoldTime = 3u, .csSetupTime = 3u, // Enable DDR mode, Wordaddassable,Safe configuration, Differential clock .sflashPadType =kSerialFlash_4Pads, .serialClkFreq =kFlexSpiSerialClk_100MHz, .sflashA1Size = 8u * 1024u * 1024u, .lookupTable = { // Read LUTs FLEXSPI_LUT_SEQ(CMD_SDR,FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18), FLEXSPI_LUT_SEQ(DUMMY_SDR,FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04), }, }, .pageSize = 256u, .sectorSize = 4u * 1024u, .blockSize = 256u *1024u, .isUniformBlockSize = false, }; 2. 选择workspace中flexspi_nor_debug工程,代码放到外部nor
图2 选择nor工程
3. option添加XIP 的宏定义 XIP_EXTERNAL_FLASH=1 XIP_BOOT_HEADER_ENABLE=0 图3 添加XIP宏定义 XIP_BOOT_HEADER_ENABLE=0,MCUBootutility会帮忙添加前面的FDCB的头,即MCUBootutility中Boot Device Configuration配置的FDCB数据。当然,XIP_BOOT_HEADER_ENABLE=1也可以,那么生成的srec本身就会已经加了前面BOOT_HEADER 也就是FCBC的头数据,下面给出加头和不加头的srec对比情况:
图4 有无头srec代码对比 我们实际使用MCUBootUtility烧录,所以直接使用无FDCB头和IVT的srec文件。 4. 修改代码入口地址为Reset_Handler
图5 代码入口地址为reset_handler
5. 生成SREC代码 图6 生成SREC代码
到现在,需要使用的image已经烧写完成,查看下srec的代码:
三,MCUBootUtility烧录的image分析 下面使用MCUBootUtility烧录到MIMXRT1050-EVKB QSPI 版本的nor flash中,然后开始分析相关image分区的代码以及信息。 从第一章的图1,可以看到,普通不带加密的app image烧录到外部norflash后,大致分为7块:FDCB,BLANK,IVT,BOOTDATA,DCD,APP,BLANK. 图8 app image boot数据结图 1:IVT: hdr, IVT的头,具体见hab_hdr 2: IVT: entry, app 的entrypointAddress, 一般设为复位中断地址。图中连线到APP 0x60004c9d即复位中断地址,可以看到数据的确为0x60004c9d. 3: IVT: reserved 4: IVT: DCD, 用于SDRAM SEMC的配置,如果没有用SDRAM,则没有。 5: IVT: BOOT_DATA, 指定BOOT_DATA的起始地址0x60001020 6: IVT: self, ivt本身的起始地址为0x60001010 7: IVT:CSF,指定CSF的起始地址,无加密则无CSF。 8: IVT:reserved 9:BOOT_DATA: start,image的起始地址,由于是外部nor XIP的,所以这里为0X60000000。 10:BOOT_DATA: size, APP的总size大小,可以图7看到,0X5100+0X10=0X5110 11:XIP APP reset handler,和2一致。 12: APP 结尾地址,可以用于算app代码大小。 到这里,可以看到具体的norXIP实例数据对应情况已经非常明显,比RAM的app更加直接,可以结合srec一起看,会发现app以及IVT里面的数据是完全一致的。后续还会推出带有DCD,带有HAB加密的memory分析。
|