IMXRT1176启动过程以及相关配置参数分析
IMXRT1176启动过程以及相关配置参数分析
前言
上一篇讲解了IMXRT1176针对不同NORFLASH的配置以及启动过程分析,这一篇针对IMXRT1176启动过程以及相关配置参数分析
一、FCFB
从可执行的Image或者HEX文件中可以看到,IMXRT1176启动首先加载FCFB
首先加载TAG标志为FCFB的,对应的HEX文件中可以看到在0x3000_0400处为0x42464346,紧接着偏移4个字节,为版本信息0x56010400,对应的ASCII为V1.4.0
在evkmimxrt1170_flexspi_nor_config.c代码中的结构体qspiflash_config 中,对NORFLASH的配置如下
const flexspi_nor_config_t qspiflash_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
.controllerMiscOption = 0x10,
.deviceType = kFlexSpiDeviceType_SerialNOR,
.sflashPadType = kSerialFlash_4Pads,
.serialClkFreq = kFlexSpiSerialClk_80MHz,
.sflashA1Size = 64u * 1024u * 1024u,
.lookupTable =
{
//ISSI NORFLASH配置
// FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
// FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0x00, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
// FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, 0, 0, 0),
//MICRON NORFLASH配置
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEC, RADDR_SDR, FLEXSPI_4PAD, 0x20),
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x0A, READ_SDR, FLEXSPI_4PAD, 0x04),
},
},
.pageSize = 256u,
.sectorSize = 4u * 1024u,
.ipcmdSerialClkFreq = 0x1,
.blockSize = 64u * 1024u,
.isUniformBlockSize = false,
};
#endif /* XIP_BOOT_HEADER_ENABLE */
二、IVT(image_vector_table)
IVT放在地址的0x30001000中,大小为32Byte,编译的linker配置文件中定义为
#define m_ivt_start 0x30001000
#define m_ivt_size 0x00001000
手册中可以看到IVT头格式如下:
TAG为0xD1,Length为0x2000,Verison为41,接着为App 的 entrypointAddress为0x30002415,运行startup_mimxrt1176_cm7.s进入Reset_Handler
Image中IVT Header的配置如下:
fsl_flexspi_nor_boot.h中对IVT_HEADER的配置
#define IVT_MAJOR_VERSION 0x4
#define IVT_MAJOR_VERSION_SHIFT 0x4
#define IVT_MAJOR_VERSION_MASK 0xF
#define IVT_MINOR_VERSION 0x1
#define IVT_MINOR_VERSION_SHIFT 0x0
#define IVT_MINOR_VERSION_MASK 0xF
#define IVT_VERSION(major, minor) \
((((major)&IVT_MAJOR_VERSION_MASK) << IVT_MAJOR_VERSION_SHIFT) | \
(((minor)&IVT_MINOR_VERSION_MASK) << IVT_MINOR_VERSION_SHIFT))
/* IVT header */
#define IVT_TAG_HEADER 0xD1 /**< Image Vector Table */
#define IVT_SIZE 0x2000
#define IVT_PAR IVT_VERSION(IVT_MAJOR_VERSION, IVT_MINOR_VERSION)
#define IVT_HEADER (IVT_TAG_HEADER | (IVT_SIZE << 8) | (IVT_PAR << 24))
fsl_flexspi_nor_boot.c中IVT结构体以及入口地址的描述如下:
/*************************************
* IVT Data
*************************************/
const ivt image_vector_table = {
IVT_HEADER, /* IVT Header */
IMAGE_ENTRY_ADDRESS, /* Image Entry Function */
IVT_RSVD, /* Reserved = 0 */
(uint32_t)DCD_ADDRESS, /* Address where DCD information is stored */
(uint32_t)BOOT_DATA_ADDRESS, /* Address where BOOT Data Structure is stored */
(uint32_t)IVT_ADDRESS, /* Pointer to IVT Self (absolute address) */
(uint32_t)CSF_ADDRESS, /* Address where CSF file is stored */
IVT_RSVD /* Reserved = 0 */
};
三、Boot Date
Boot Date的存放地址为0x30001020,大小为16Byte
手册中Boot Data的格式如下:
Image中Boot Date的配置如下:
开始地址为0x30000000,大小为0x10000000
fsl_flexspi_nor_boot.c中Boot Data的结构体描述如下:
/*************************************
* Boot Data
*************************************/
const BOOT_DATA_T boot_data = {
BOOT_IMAGE_BASE, /* boot start location */
BOOT_IMAGE_SIZE, /* size */
PLUGIN_FLAG, /* Plugin flag*/
0xFFFFFFFFU /* empty - extra data word */
};
总结
以上就是IMXRT1176启动过程以及相关配置参数分析,通过以上配置和参数的读取,读取成功后将正式加载程序的运行,以上是XIP的方式,无需配置DCD参数,DCD参数用于SDRAM的参数配置。