三、UBL
UBL对上与RBL交互,对下要加载运行U-Boot,再由U-Boot加载uImage到DDR2中运行,最后将控制权交给操作系统。因此,UBL的重要性不言而喻。
UBL首先完成系统时钟、DDR频率以及运行环境的初始化,然后复制U-Boot到DDR,并转到start_armboot。
具体设置如下:
◎
设置引导配置寄存器BOOTCFG,使BTSEL[1:0]=00,即选择NAND Flash引导启动模式;并根据外部NAND Flash型号设置EM_WIDTH位。在RBL从NAND读数据时要根据BOOTCFG的第5位(EM_WIDTH)的值来判断总线宽度和存取数据的大小,EM_WIDTH=0,数据宽度为8位(Bit);EM_WIDTH=1,数据宽度为16位。
◎
定义NAND UBL描述符,包括魔术数、UBL入口点地址、页面数、起始块号、起始页号等。RBL首先要读取NAND Flash的设备ID以及设备存取信息(即块和页的大小、UBL标识符等,保存在设备信息表中),然后从NAND设备CIS/IDI Block之后(Block1)的第0页开始读取有效的UBL描述符。如果没有找到与默认UBL标识相匹配的UBL,就搜索下一个块,最多连续搜索5个块,以避免NAND设备开始连续的几个块存在坏块的情况(一般不会出现。NAND Flash在出厂前会保证第一块和第二块是好的);如果还是没有适合的UBL,则切换到UART启动模式。
◎
当RBL找到一个有效的UBL时,首先读取并处理UBL描述符,RBL根据描述符信息来决定是否开启EMIF(External Memory Interface)或I-Cache(Instruction-Cache)、是否采用DMA等操作。一旦具备了UBL运行条件,RBL就把UBL拷贝到AIRAM中,并跳转到起始入口地址0x00000020处运行UBL。
◎
UBL将为U-Boot建立运行环境。其主要流程如下:
△
DM644xInit,初始化硬件平台:屏蔽所有中断,电源/休眠管理控制器复位
△
UARTInit,串口初始化设置
△
PLL1Init,系统锁相环PLL1设置
△
PLL2InitDDR,锁相环PLL2设置
△
DDR2Init,DDR2初始化
△
AEMIFInit,AEMIF接口初始化
△
IVTInit,中断向量表初始化
△
NAND_Init,NAND初始化,在读BOOTCFG时,如果BTSEl[1:0]=00就调用
△
NAND_Copy,拷贝U-Boot代码到DDR2中
△
拷贝成功,根据NAND_BOOT::entryPoint跳转到U-Boot入口的运行
四、AIROM NAND启动过程
|