DM368 nand flash 启动过程揭秘

来源:互联网 发布:淘宝站外推广定义 编辑:程序博客网 时间:2024/06/06 21:04

转载:http://blog.csdn.net/maopig/article/details/7029930  

转载文章讲的有点乱。以下是自己根据所看到的资料总结的。


以德州仪器的多媒体处理芯片TMS320DM368为例,介绍它的NAND Flash启动原理以及实现。

 

 


1. RBL阶段

DM368芯片上有一块ROM的区域(地址从0x00008000到 0x0000 BFFF),这块区域就是存放RBL代码的地方。首先,保存在片内ROMRBL程序开始运行,RBL程序根据BTSEL[0~3]引脚的电位来判断相应的启动方式。ROM上的代码是在芯片出厂前就烧写好的,用户是不能修改的。DM368上,除了AEMIF Nor Flash)启动,其他的启动方式都需要运行RBL。如果发现BTSEL的状态是000,就会得知配置的是NAND Flash启动,NAND启动模式开始执行。注意:为了保证NAND启动正常运行,需要保证在复位的时候DEEPSLEEPZ/GIO0引脚拉高。RBL程序便从NAND上读取UBLuser boot loader)并且复制到ARM的内存RAM中,并转到执行UBL代码。

2. UBL阶段

UBL运行在ARM的内存里,主要完成系统时钟、DDR频率的初始化。然后UBLNAND Flash里读取U-Boot的内容并且复制到DDR里运行。

3. U-Boot阶段

DDR里面运行的U-Boot又从NAND Flash里面读取Linux内核代码,并且复制到DDR上,然后启动内核。

U-Boot代码中首先设置最基本的系统硬件环境,包括系统PLLDDR2的初始化、PSC的配置及使能UART0AMEIF等硬件模块。

配置系统的内存,包括NAND FlashDDR2

Flash中加载内核到指定的存储地址,并在Flash中加载RAM Disk或通过NFS加载文件系统。

初始化传递到内核的引导参数(EMAC地址、串口、控制台、视频格式等)。

获得ARM Linux基类型值。

设置Kernel tagged list

用初始值设置ARM的寄存器。

调用内核。

4. Linux内核启动阶段

Linux内核从U-Boot中得到参数并初始化相关硬件。

内核中的head.s代码开始运行,对压缩的内核进行解压。

start_kernel()运行。对内核中的MMU等进行初始化。

Linux的第一个进程init() 运行,该进程根据系统的配置文件初始化系统。

shell启动,用户开始进入登录系统。

 

 

 

 

 

 

 

 

0 0