初中生
最后登录1970-1-1
在线时间 小时
注册时间2018-11-23
|
楼主 |
发表于 2018-11-30 15:50:34
|
显示全部楼层
哈哈哈,我自研究了一下芯片的Flashloader、BootROM、Bootable Image这些东西,大了解一个大概,后面做完实验,会整理一篇博客贴出来,谢谢。
这里我对自己的三个问题做一个解释
第一个和第二个问题:从程序编译出来的.map文件里,关于.intvec段:
"A0": 0x400
.intvec ro code 0x6000'2000 0x400 startup_MIMXRT1052.o [1]
- 0x6000'2400 0x400
应该是独自占据了,0x6000'2000——0x6000'2400一共0x400大小存储,至于IAR软件手册中的.intvec的描述,就不清楚了,难道特指中断向量表的大小?不包括后面汇编定义的复位中断函数等定义吗?
第三个问题:先说一下这里的ivt,是Image vector table的缩写,这几个文件是为了XIP启动自己配置的段,也是Bootable Image的头
具体定义XIP文件中可以找到:
下面是.boot_hdr.conf的段定义,通过#progra location定义的变量数组段,
定义一个section则是通过 :#pragma section = “MYSECTION”
具体定义一个段的介绍,下面这篇文章有介绍:https://blog.csdn.net/huan447882949/article/details/79535653
[mw_shl_code=c,true]#pragma location = ".boot_hdr.conf"
const flexspi_nor_config_t spiflash_config = {
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,/*标志:FCFB*/
.version = FLEXSPI_CFG_BLK_VERSION,/*版本:V1.4.0*/
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,/*内部环回*/
.csHoldTime = 3u, /*保持时间*/
.csSetupTime = 3u,/*建立时间*/
.columnAddressWidth = 0u,/*列地址宽度*/
.deviceModeCfgEnable = 1u,/*设备模式配置使能*/
.deviceModeType = 1u,/*Quad 使能命令*/
.deviceModeSeq.seqNum = 1u,/*LUT序列号*/
.deviceModeSeq.seqId = 4u, /*LUT序列索引*/
.deviceModeArg = 0x000200,/*设置 QE=1(S9)*/
.deviceType = kFlexSpiDeviceType_SerialNOR,/*设备类型为nor flash*/
.sflashPadType = kSerialFlash_4Pads,/*设备数据总线为4*/
.serialClkFreq = kFlexSpiSerialClk_133MHz,/*flash 时钟*/
.sflashA1Size = 32u * 1024u * 1024u, /*flash 大小32MBytes*/
//.dataValidTime = {16u, 16u},
.lookupTable =
{
/*快速读命令(四线)*/
[0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
[1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
/*读状态命令*/
[1*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),
/*写使能命令*/
[3*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
/*擦除扇区命令*/
[5*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x04),
/*页编程命令(四线)*/
[9*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
[9*4+1] = FLEXSPI_LUT_SEQ(WRITE_SDR,FLEXSPI_4PAD , 0x04, STOP, FLEXSPI_1PAD, 0),
/*整片擦除*/
[11*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xc7, STOP, FLEXSPI_1PAD, 0),
},
},
.pageSize = 256u,/*页大小为256字节*/
.sectorSize = 4u * 1024u,/*扇区大小为4k字节*/
};[/mw_shl_code]
其余三个段类似。
至于每个段的作用这里做一个大致介绍,这些是RT1052芯片内部BootLoader(就是集成在片上ROM的那段程序,这里姑且这么称呼)外部串行NorFlash启动所需要的Image头,
分别是FDCB(Flash Device Configuration Block)、IVT(Image Vector Table)、BD(Boot Data)、DCD(Device Configuration Data)。
下面的部分来自痞子衡的博客:
偏移0x0000: FDCB(Flash Device Configuration Block)
第一个组成部分叫FDCB,是个可选组成,目前只用于Serial/Parallel NOR FLASH。FDCB是从FLASH的起始地址处开始存放的,也是Bootable image最开始部分。
FDCB最大4KB,其本身没有统一的与FLASH无关的structure,具体structure根据启动FLASH的接口类型(Serial / Parallel)而定,其一般是用来存储当前连接的FLASH的具体特性参数,BootROM上电会使用通用且可靠的FLASH接口控制器配置(即BootROM中默认参数配置,一般是比较低速的配置)去访问外接FLASH并获取FDCB,然后根据FDCB存储的参数去重新配置FLASH接口控制器,再去进一步访问FLASH。
偏移0x0400/0x1000: IVT(Image Vector Table)
第二个组成部分叫IVT,是个必备组成,也是6类信息数据里的最核心数据,IVT是一个统一的与FLASH无关的structure,其原型如下面结构体所示,从结构体定义我们得知,IVT中记录了应用程序、DCD、BD、CSF的位置信息,这些信息对BootROM加载启动至关重要。IVT大小固定为32byte,其在Bootable image中的偏移位置也是固定的(对于XIP FLASH而言偏移是0x1000,对于Non-XIP FLASH而言偏移是0x400)。
偏移0x0420/0x1020: BD(Boot Data)
第三个组成部分叫BD,是个必备组成,是仅次于IVT的核心数据,BD也是一个统一的与FLASH无关的structure,其原型如下面结构体所示,BD中记录了Bootable image的起始地址与总长度。
BD大小固定为16字节,BD信息虽然记录在了IVT中,但其在Bootable image中的偏移位置并不是任意的,BD是紧挨着IVT的。
DCD(Device Configuration Data)
第四个组成部分叫DCD,是个可选组成,目前主要用于SDRAM接口控制器(SEMC)的配置。由于i.MX RT内部SRAM的大小通常是够用的,且访问速度也很快,所以SDRAM并不一定要被使能,Bootable image常常不会包含DCD,所以痞子衡在这里先不做展开,后续有必要会再介绍。下面是SDK_2.3.1_EVKB-IMXRT1050包里hello_world工程(flexspi_nor)所使用DCD示例:
接着下面一部分就是我们的应用程序了,
偏移0x2000: Application Binary
第五个组成部分是你最熟悉的应用程序代码,当然是个必备组成,其在Bootable image中的偏移位置是固定的(0x2000),关于应用本身这里就不再赘述了。只特别提一点,那就是i.MX RT的应用程序只读段(主要指ARM中断向量表),并不可以从任意地址开始链接,有一个小小的限制,必须从选定的存储器地址空间偏移0x2000之后开始链接(如选中ITCM,则必须要链接在0x00002000之后;如选中DTCM,则必须链接在0x20002000之后...),因为要预留至少8KB空间给IVT、BD、DCD等数据,这个限制是BootROM自身决定的,务必要注意。
当然这里还有两个和安全启动相关的CSF、KeyBlob粘贴了。感谢一下痞子衡,写这么好的文章。 |
|