DM365 NAND启动模式解析

来源:互联网 发布:无限的未知 知乎 编辑:程序博客网 时间:2024/05/29 12:57

首先,读取NAND的ID,可以从RBL的设备信息表中得到一些重要信息,然后,RBL在block1 page0处开始搜索UBL描述符。若没有找到正确的UBL,会继续搜索下面的块,一直到block24结束。这样做是为了跳过坏块,24个块几乎对所有的NAND设备都足够了。当找到UBL标识之后,对应的块号(从1到24)被写到ARM内部RAM(指令RAM)的最后32位(0x7ffc-0x8000),假设通过JTAG通过读取这32位,你能够确定RBL是在哪个块中找到了一个正确的UBL标识。如果搜索完24个块后没有找到正确的UBL标识,RBL会尝试从SD卡启动。

找到正确的UBL之后,读取并且处理UBL描述符,这个描述符提供了加载和控制跳转到UBL的必要信息。然后UBL被读取并且处理。RBL首先可能会使能一些更快的EMIF组合和基于UBL描述符中信息的指令cache操作。通过UBL描述符可以知道在拷贝UBL期间是否使用了DMA。一旦用户指定的启动状态被设置,RBL就复制UBL到ARM内部RAM,并且从地址0x0000 0020处启动。

NOTE:真正的拷贝实际上是从ARM内部数据RAM区0x10020-0x1781F的低30KB的空间。

将UBL读取到ARM IRAM的时候,NAND RBL使用4位的ECC来检测是否发生读错误。若发生了错误,则通过ECC纠正算法来纠正错误。通过冗余(24 blocks)和出错恢复来保证防止读错误。

NAND启动流程如下图所示:

DM365 <wbr>NAND启动模式解析

NAND UBL descriptor格式如下表:

DM365 <wbr>NAND启动模式解析

NOTE:ARM IRAM 的起始32个字节是ARM系统的中断向量表(IVT)(8个向量,每个4字节),复制的UBL从这32个字节的IVT之后开始启动。

在UBL descriptor中,不同的NAND启动模式可以设置不同的MAGIC IDs,下表列出了UBL标识:

DM365 <wbr>NAND启动模式解析

NAND启动详细流程:

1、初始化RAM1的高2K栈空间(0x7800-0x7fff)。不要使用IRAM的最后32个字节(0x7ffc-0x8000),因为它被用来存写入UBL的块号。

2、禁止所有中断,IRQ和FIQ。

3、外部引脚DEEPSLEEPZ/GIO0在芯片为NAND模式启动复位时必须被置高。

4、读NAND的设备ID,获得参数。

5、根据NAND flash的参数初始化NAND区域。

6、搜索UBL设定块号,通常在CIS/IDI page(一般为block 0, page 0)。

7、UBL描述符由以下参数组成(所有UBL参数位宽都是32位):

-入口点地址:加载UBL之后的绝对入口点,必须在0x0020-0x781C之间。

-UBL占用的NAND的页数:必须是相邻的页,可以跨越多个块,总字节数必须小于等于30KB。

-UBL的起始块:可能与UBL描述符在同一个块。

-UBL的起始页:不可能与UBL指示符在同一页,因为加载的都是完整的页。

8、使能硬件ECC错误检测,复制UBL从NAND flash到IRAM,如果检测到一个4位ECC的读错误,UBL将通过ECC纠正算法来纠正错误。如果是由其他的错误导致读失败的,指示符会继续在下一个新的块中搜索直到找到UBL描述符,一直搜索到block 24。没有的话就从SD卡启动。

9、在UBL入口处把控制权移交给UBL。

10、NAND的安全启动模式是在PLL旁通模式中完成的,它不使用快速EMIF,DMA或者I-Cache。在其他模式下,使用以上的一种组合。例如,在UBL_MAGIC_PLL_DMA_IC_FAST模式下激活其他四个设置,它因该是最快的NAND启动模式。

以下是启动流图:

DM365 <wbr>NAND启动模式解析

ARM NAND ROM bootloader实例:

DM365 <wbr>NAND启动模式解析

NAND支持的设备ID:

DM365 <wbr>NAND启动模式解析