本章的内容为《嵌入式Linux>【第二期】手把手教你学Linux之ARM(MX6U)裸机篇》中6.5、7.1、7.2、7.3讲的内容。
1.5下载程序
续前一天的内容,烧写Bin文件。
i.Mx6ull支持SD卡、EMMC、NAND、Nor、SPI flash等启动方式,该系列裸机例程选择烧写到SD卡里面。
连接SD卡到Ubuntu上,烧写bin文件到SD卡的绝对地址下,同时需在bin文件前添加头部信息。
在/dev/中查找SD卡,最终生成一个imx文件。
??在视频中的烧录方式为用SD卡烧录程序,并且视频的作者说只能用SD卡烧录程序,但是平常没有见Linux研发的同事们有谁这么烧过程序,此处存疑
2 IMX启动方式
2.1启动方式选择
1、官方文档中对启动方式的说明如下:
The boot ROM supports the following boot devices:
• NOR Flash
• NAND Flash
• OneNAND Flash
• SD/MMC
• Serial (SPI) NOR Flash and EEPROM
• QuadSPI (QSPI) Flash
通过BOOT_MODE的两个引脚设置启动方式:
即分别为从熔丝下载(一般应用于生产模式)、串行下载、内置Boot启动。
当烧写系统到开发板时可使用串行下载(采用NXP提供的下载工具),裸机程序时选用从内置BOOT中启动,然后下载。
2.2 启动设备选择
The Chip supports the following boot Flash devices:
• NOR Flash with External Interface Module (EIM), located on CS0, 16-bit bus width.
• OneNAND Flash with EIM interface, located on CS0, 16-bits bus width.
• Raw NAND (MLC and SLC), and Toggle-mode NAND flash through GPMI-2 interface. Page sizes of 2 Kbyte, 4 Kbyte and 8 Kbyte. Bus widths of 8-bit with 2 through 40-bit BCH Hardware ECC (Error Correction) are supported.
• Quad SPI Flash.
• SD/MMC/eSD/SDXC/eMMC4.4 via USDHC interface, supporting high capacity cards
• EEPROM boot via SPI (serial flash)
在Boot Devices中有相关说明,配置见下:
上表中的BOOT_CFG1[7:4]即为配置启动方式最常用得到4个引脚,在正点原子的开发板中有提供24个引脚全部的配置方式,针对不同的启动方式,在参考手册中有相关的配置说明,通过配置相对应的24个IO口的电平高低电平设置。
2.3 启动头部文件
2.3.1 IVT数据
在选好了BOOT设备的启动类型之后,需要对设备进行初始化,例如包括分配对应的内存,设置对应的时钟,中断处理和异常处理等。在《IMX6ULL Reference manual》中8.4 Device initialization有说明,具体内容如下:
This section describes the details of the ROM and provides the initialization details.
This includes details on:
• The ROM memory map
• The RAM memory map
• On-chip blocks that the ROM must use or change the POR register default values
• Clock initialization
• Enabling the MMU/L2 cache
• Exception handling and interrupt handling
1、首先对时钟进行设置:默认为396MHz;
2、使能MMU和caches,使能L1、L2、MMU加速启动
3、从BOOT_CFG设置的外置存储中,读取相对应的镜像。
在8.7 program image中烧写镜像中,配置中断向量表、程序地址映射表(有点类似单片机中的icf文件)、芯片配置数据、用户代码。
load.imx文件在SD卡中的起始地址为0x400,即偏移了1K,即IVT表的起始地址,同时整个初始化下载区域Data 数据长度为4K,因此IVT实际的最大大小为3K。那么IVT的格式应该怎么写呢,官方的参考手册给出了相应的信息格式如下(u-boot.imx):
其中Header的格式要求见下,在这当中采用大端模式,其中Length说明了IVT的总长度为32字节,
Entry表示其入口地址:在本例中设置为0x87800000。
Reversed1保留默认为0;
dcd:此处官方的解释为The DCD is a configuration information contained in the program image (external to the ROM) that the ROM interprets to configure various peripherals on the chip,即DCD是包含在程序映像(ROM外部)中的配置信息,ROM将其解释为配置芯片上的各种外围设备。0x877FF400为.imx的首地址,依次为IVT、BOOT data、DCD,因此,在这里,DCD的地址为0x877FF42C。
boot data:长度为12字节,起始地址为0X877FF420
self:VT复制到 DDR中以后的首地址。设置为0X877FF400
csf:CSF地址、0X00000000
reserve2:保留默认全为0.
2.3.1 BootData数据
BootData的内容如下:
2.3.3 DCD数据
Device configuration data,为寄存器配置默认的数据,最大1768字节。
将CCGR0——CCGR6的全部写为0xFFFFFFFF,表示打开全部外设时钟
将DDR设置初始化参数0X020E02B4——0X020E0248地址
配置DDR寄存器。
还包括其他内容,例如Check data command、NOP command、 unlock command。
上述文件可以从NXP的官方u_boot.imx中找到。