查看: 6119|回复: 0

[原创] 【经验分享】RT105X XIP无DCD qspi flash image实例分析

[复制链接]

该用户从未签到

715

主题

6374

帖子

0

超级版主

Rank: 8Rank: 8

积分
25213
最后登录
2025-8-18
发表于 2019-11-7 14:33:27 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2019-11-7 16:15 编辑

【经验分享】RT105X XIPDCD qspi flash image实例分析
一,文档介绍
        前面写了一篇RT105X烧录RAM APP到qspi flash image实例分析的经验分享,讲了RAM执行的APP烧录到外部qspi flash之后的image情况分析, 具体链接如下:
  那么,如果是XIP的app,同样无DCD的image情况又是怎样的呢?下面我们以同样的方法看看具体的image 结构,实际上支持XIP的地址情况更加清晰明了。

1.jpg
图1 bootimage
   下面我们使用IDE生成一个XIP的代码,然后通过MCUBootUtility工具烧录之后,具体分析相关的内存块以及启动情况,希望能够更加清楚的帮助大家理解RT的外部memory启动。
    本文使用涉及到的工具有:MCUBootUtility,SRecordizer
二,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.jpg
图2 选择nor工程

3.     option添加XIP 的宏定义
XIP_EXTERNAL_FLASH=1
XIP_BOOT_HEADER_ENABLE=0
3.jpg
图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.jpg
图4 有无头srec代码对比
我们实际使用MCUBootUtility烧录,所以直接使用无FDCB头和IVT的srec文件。
4.     修改代码入口地址为Reset_Handler

5.jpg
图5 代码入口地址为reset_handler

5.     生成SREC代码
6.jpg
图6 生成SREC代码

   到现在,需要使用的image已经烧写完成,查看下srec的代码:

7.jpg
7 srec image
查看
三,MCUBootUtility烧录的image分析
下面使用MCUBootUtility烧录到MIMXRT1050-EVKB QSPI 版本的nor flash中,然后开始分析相关image分区的代码以及信息。
从第一章的图1,可以看到,普通不带加密的app image烧录到外部norflash后,大致分为7块:FDCB,BLANK,IVT,BOOTDATA,DCD,APP,BLANK.
8.jpg
8 app image boot数据结图
1IVT: 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: startimage的起始地址,由于是外部nor XIP的,所以这里为0X60000000
10:BOOT_DATA: size, APP的总size大小,可以图7看到,0X5100+0X10=0X5110
11XIP APP reset handler,和2一致。
12: APP 结尾地址,可以用于算app代码大小。
到这里,可以看到具体的norXIP实例数据对应情况已经非常明显,RAMapp更加直接,可以结合srec一起看,会发现app以及IVT里面的数据是完全一致的。后续还会推出带有DCD,带有HAB加密的memory分析。

rt1050_iled_blinky_qspi_no header.rar (11.3 KB, 下载次数: 9)
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-8-20 03:48 , Processed in 0.082118 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表