分类: 嵌入式
2010-06-02 17:41:29
首先,读取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启动流程如下图所示:
NAND UBL descriptor格式如下表:
NOTE:ARM IRAM 的起始32个字节是ARM系统的中断向量表(IVT)(8个向量,每个4字节),复制的UBL从这32个字节的IVT之后开始启动。
在UBL descriptor中,不同的NAND启动模式可以设置不同的MAGIC IDs,下表列出了UBL标识:
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位):
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启动模式。
以下是启动流图:
ARM NAND ROM bootloader实例:
NAND支持的设备ID:
chinaunix网友2011-01-20 17:02:07
SEED-DVS365 Demos的演示, 摄像头通过线连接到板子的 CVBS输入 (video in); 使用串口线将SEED-DVS365与PC机相连,一端接:SEED-DVS365的J3位置,另一端接:PC机的RS232口; 使用网线将SEED-DVS365与PC连接到同一网络中,SEED-DVS365的网络接口位置是T1; 烧写seed_dm365自带的一个demos:encode,出现了问题: 首先 root@SEED_DVS365:~#cd /opt/dm365 ↙ root@SEED_DVS365:/opt/dm365#./loadmodules_hd.sh↙ 通过超级终端显示如下信息: irqk unregistered CMEMK module: built on Nov 30 2010 at 14:33:17 Reference Linux version 2.6.18 File /opt/dvsdk_2_10_00_17/linuxutils_2_24_02/packages/ti/sdo/linuxutils/cmem