02. IMX启动方式
启动方式的选择 BOOT_MODE[1:0]
6ULL是怎么支持从多种外置flash启动程序的?
BOOT_MODE0和BOOT_MODE1,这两个IO控制的,选择从USB启动还是从内部BOOT启动。如果要烧写系统到开发板中可以选择从USB下载到SD卡、EMMC等外置存储中。烧写完成后从内部BOOT启动,然后从相应的外置存储中启动。
上表中的四个方式,一般只用到2和3
串行下载
01时,表示可以通过USB或者UART将代码下载到板子的外置存储设备中,可以使用OTG1向SD、EMMC、NAND等存储设备下载代码
内部BOOT模式
10时,表示芯片会执行内部的boot ROM代码,这段代码会进行硬件初始化,然后从boot设备(就是存放代码的设备,如SD)中将代码拷贝到指定的RAM中,一般是DDR。
初始化时,会将主频设置为396MHz。内部boot ROM为了加快执行速度会打开MMU和cache,下载镜像时 L1 ICache 会打开,验证镜像的时候 L1 DCache、 L2 Cache 和 MMU 都会打开。一旦镜像验证完成, boot ROM就会关闭 L1 DCache、 L2 Cache 和 MMU。
中断向量偏移会被设置到boot ROM起始位置,当boot ROM启动了用户代码后就可以重新设置中断向量偏移了。一般是重新设置到用户代码开始的地方。
启动设备的选择 BOOT_CFGx[7:0]
当BOOT_MODE设置为内部BOOT 模式后,可以通过 BOOT_CFGx[7:0] 从以下设备中启动:
- 接到 EIM 接口的 CS0 上的 16 位 NOR Flash
- 接到 EIM 接口的 CS0 上的 16 位 OneNAND Flash
- 接到GPMI上的MLC/SLC NAND Flash, NAND Flash 页支持2k,4k和8k,8位宽
- Quad SPI Flash
- 接到 USDHC 接口上的 SD/MMC/等
- SPI接口的EEPROM
对于ALPHA开发板也就这8个需要设置
启动头文件
BOOT ROM做的事情
设置内核时钟为396MHz,使能MMU和cache,使能L1cache L2cache MMU,目的就是加速启动。从BOOT_CFG设置的外置存储中,读取image,然后做相应的处理
IVT和BOOT Data数据
bin文件前面需要添加头部,我们烧写到SD卡中的imx文件在SD卡中的起始地址是0x400,也就是1024。头部大小为3k,加上偏移地址,因此在SD卡中bin文件的起始地址是4096
DCD数据
DCD数据就是配置6ULL内部寄存器的。首先,将CCGR0~CCGR6全部写为0xFFFFFFFF,表示打开所有外设时钟,然后就是DDR初始化参数,设置DDR控制器,也就是初始化DDR。
其他的数据
检查数据命令、NOP命令、解锁命令。这些数据也都属于DCD数据