最近在使用三星S3C2416这个处理器,须要在EBOOT 上实现SD卡文件系统,并从SD卡中烧写wince系统,与S3C2416的从SD卡启动不一样。我用的BSP是 SMDK2416_WinCE50_PM_REL_0.01_080611的,Bootloader文件夹中包含了三个文件 夹:Eboot.Whimory、NBL1.LSB、NBL2,先前不太明白这三个Boot到底有什么用,因而从网上找到了下面一篇文件,是以 S3C6410为例做的介绍。 函数
目前的ARM处理器都支持多种启动模式,S3C6410和之前的 Samsung的ARM处理器同样,经过外部管脚OM[4:0]的拉高拉低来决定是从哪一个存储设备上启动。我认为S3C6410的User Manual并无说的很清楚,因此我在最开始使用的时候,也对其启动模式有一些误解,下面就我我的的理解,介绍一下S3C6410的启动。 spa
先读一下S3C6410 User Manual的第3章 System Controller,在123页列了一张表,如图: 接口
这章表列出了S3C6410所支持的几种启动模式。首先介绍一下和启动模式相关的硬件管脚: flash
OM[4:0]:选择启动设备及时钟源。OM[0]为0选择XXTlpll,为1选择XEXTCLK。 it
GPN[15:13]:用于识别所支持的Nandflash的类型,包括Page的类型和地址周期。 硬件
XSELNAND:选择Nand启动或者是OneNand启动。0为OneNand,1为Nand。 下载
从表中能够看出,S3C6410好像并不支持Nandflash启动,由于Boot Device中没有Nandflash设备。当OM[4:0]为0000x/0001x/0010x/0011x的时候,Boot Device是Reserved,我想这里是Samsung在6410中有意要隐瞒什么。若是你用过S3C6400,你应该知道在S3C6400 User Manual中也有这么一张表,描述了s3c6400的启动模式,具体S3C6400的启动模式也是在第3章 System Controller,在第107页的表,如图: 程序
我想和S3C6410的表对照一下就会发现,两个处理器的启动模式是兼容的,我认为S3C6410应该兼容S3C6400的启动模式,只不过Samsung在S3C6410 User Manual中隐藏了S3C6400中所支持Nandflash启动模式,目的多是Samsung不但愿在S3C6410中使用Nandflash启动,而要推崇IROM的启动模式。我的理解啊! im
下面来总结一下S3C6410所支持的启动模式: 总结
1. NORFlash启动
经过Nor Flash启动,此时OM[4:1]为0100或0101,对应8bit和16bit。
2. NandFlash启动
虽然在S3C6410 User Manual中没有提到,可是也是支持的,从S3C6400 User Manual能够找到。OM[4:1]四个硬件管脚决定了Nandflash启动,以及支持的Nandflash的类型,包括大Page和小Page,地址周期为3,4,5。固然,XSELNAND管脚也要为1。
3. OneNAND启动
首先XSELNAND管脚为0,其次OM[4:1]为0110,为OneNand启动模式。
4. MODEM启动
当OM[4:1]为0111的时候,为MODEM启动。S3C6410经过MODEM接口下载boot代码到内部RAM中,而后进行引导。
5. IROM启动
当OM[4:1]为1111的时候,从Internal ROM中启动,此时GPN[15:13]用于识别设备的类型。这种模式之前没见过,这里具体介绍一下。
IROM模式能够支持MoviNand,SD/MMC,iNand,OneNand和Nand等。关于IROM的引导,具体过程如图:
1. 处理器上电后,当OM[4:1]=1111时,运行iROM中的程序,这个程序被称为Bootloader0(BL0),它会作一些初始化的工做。
2. 而后根据GPN[15:13]的管脚设置,选择从相应的设备(SD/MMC/OneNand/Nand)中的指定区域读取4KB的程序到SteppingStone中运行,这段代码被称为Bootloader1(BL1)。
3. BL1能够初始化系统时钟,UART,SDRAM等设备,而后拷贝Bootloader2(BL2)到SDRAM中。
4. 跳转到SDRAM中的BL2,继续运行,BL2能够支持更强大的功能,能够将OS加载到SDRAM中,而后运行OS。
整个过程当中,IROM是最早被运行的,它会首先作一些初始化,具体IROM的流程以下:
1. 禁用Watch-dog
2. 初始化TCM
3. 初始化设备拷贝函数,用于拷贝BL1到SteppingStone中
4. 初始化栈区域
5. 初始化PLL
6. 初始化指令Cache
7. 初始化堆区域
8. 拷贝BL1到SteppingStone中
9. 验证BL1
10. 跳转到SteppingStone中运行
仍是看一下流程图吧,理解起来会更直观一些,IROM启动流程如图: