作者:vianowu
本期关键词: NAND flash启动方式 Romboot uboot
本期扩展关键词:NOR flash启动方式 emmc cp15 dataflash
平台: AT91SAM9x25
之前玩的开发板是三星公司的s3c2440,但是对于NAND flash和NOR flsah的启动方式也是简单的了解了一下,知道他们大致的启动区别。但是这次对于ATMAL公司的SAM9x25的板子做了一下试验,才知道了具体的一个工作原理。以下是对一段时间前认识的总结。
1.NAND flash和NOR flash
相信接触过Flash的人都知道了这两个存储器的,那时候老师还告诉我们可以把NAND flash看成电脑的硬盘,把NOR flash看成电脑的内存。虽然在NAND flash和NOR flash的功能支持上是对的,但是容易让我们误解NOR flash在开发板就是RAM的作用,看来断章取义不可取啊,真理果真是有时限的,也好理解牛顿的运动定律不是万能的了。
NOR flash与NAND flash相比,进行读操作的效率非常高,但是擦除和写操作的效率很低,容量也比较小。前者的块大小范围为64KB ~ 128KB,而后者的块大小范围为8KB ~ 64KB,擦/写一个NOR flash块需要4s,而擦/写一个NAND flash块需要2ms。
NOR flash的接口和RAM完全相同(即命令和数据都是采用统一的IO口),可以随意访问任意地址的数据,支持XIP,即代码可以直接NOR flash 上执行,无需复杂到内存中。而NAND flash的接口仅仅包含几个I/O引脚,需要串行访问。
2.两种Flash的启动方式
三星的s3c2440主要有两种启动方式:NAND flash启动和NOR flash 启动方式。其中,采用NAND flash启动,cpu会通过内部的硬件将NAND flash开始的4KB数据复制到称为“stepingstone”的4KB的内部SRAM中(起始地址为0),然后再跳到地址0开始执行。
而SAM9x25的以上两种方式,启动过程基本和s3c2440相同。不同的是,SAM9x25在内部的ROM中固化了RomBoot的程序,在选择采用NAND flash启动时,RomBoot会先对硬件环境初始化,把32K的SRAM中的最大24K的代码搬运到SDRAM(我们所说的内存)。再启动bootloader对系统进行进一步的初始化。
扩展思维:
(1)Emmc
Emmc是目前手机运用比较多的的存储设备,Emmc的接口是接cpu的,驱动的实现方式、分区格式化、对cpu接口都和TF卡一样。对于Emmc启动方式,由于将uboot烧录到Emmc比较困难,没有合适对外接口,所以一般采用先启动sd卡再用sd卡里的uboot烧录新的uboot到emmc。
链接地址:http://baike.baidu.com/view/3509283.htm
(2)CP15
协处理器CP15总共有c0~c15这16个协处理器寄存器,各自具有一定的功能定义。但总的来说,cp15主要跟以下功能有关:
A、获取device id和cache type等一些CPU相关信息。
B、MMU操作。包括MMU的使能和禁止,虚拟地址到物理地址的映射机制建立。
C、访问权限控制。主要用来实现安全机制和linux的写时复制(copy on write)。
D、设置时钟模式。init.S中MMU_SetAsyncBusMode和MMU_SetFastBusMode这两个函数。
链接地址:http://blog.chinaunix.net/uid-14114479-id-3110951.html
3.AT91SAM9X25启动流程
讲到整块板的启动流程的话,那么我们就从裸板如何烧写bootloader开始说起吧。根据AT91SAM9x25 datasheet第十一章Boot Strategies可知:其引导策略主要用板上的BMS管脚脚来选择的。
如果BMS管脚电平为0,那么选择了缺省参数的启动方式,所有寄存器都处于重置状态,此引导方式多大用于以烧录bootloader程序的NOR Flash 启动。
如果BMS管脚电平为1,那么将采用固化在Rom内部的ROMBoot程序来启动,此引导方式多用于未烧录任何程序或NAND Flash启动方式。
问题一:那么Romboot做了些什么工作呢?
1.基础芯片初始化:XTal或者外部时钟频率检测;
2.尝试从外部非易失存储器检索可用代码;
3.如果没有找到可用的程序,将执行供应商提供的SAM-BA监控器(软件)。
上面的逻辑图在描述了Romboot基本功能的同时,也同时解释了开发商提供的用户手册的操作步骤了。具体的烧录步骤请查照“SAM9X5用户使用手册v1.3.pdf”。
问题二:那么具体的Romboot检索过程是怎么样的呢?是否可以支持从SD卡启动呢?
答案是可以的,以下是Romboot的检索过程。其实只是上一幅逻辑图的补充而已。相应的检索顺序是SPI0,SD卡,NAND flash ,SPI1,EEPROM,SAM-BA。此时的SAM-BA是通过USB接口连接的,相当于U盘里的程序。
问题三:我们烧写程序进nandflash的时候,一定要用供应商提供的SAM-BA工具吗?或者是说我们自己用自己的程序烧写有什么要注意的呢?
仔细看datasheet可以发现,第11.4.3.1说到我们要注意地方:前面的28个字节必须是中断向量(共七个中断向量,每个指令四个字节),而且第六个向量是PC下载的偏移地址,其实就是我们要下载的程序大小(This size is the internal SRAM size minus the stack size used by the ROM Code at the end of the internal SRAM)。尽管我们可以从datasheet的首页“features”看到了“one 32-Kbyte internal SRAM”这句话,但是11.4.3.1也说了程序要小于24Kbuytes。 SAM-BA软件它知道要往第六个向量写入整个NVM(non-volatile memories)程序的大小(其实就是我们接着要说的bootloader映象的大小)。所以我们用SAM-BA烧写程序也方便些。
问题四:我们用RomBoot烧什么程序?那个程序做什么?
我们烧写的程序就是bootloader。但是有的bootloader为了更好的区分引导程序功能,又将bootloader分为一级bootloader(又叫bootstrap)和二级bootloader(U-boot)。第一阶段的bootstrap主要完成的功能是硬件初始化,加载U-boot到RAM,设置堆栈,跳到第二段代码入口。第二阶段的U-boot主要完成的功能是初始化要用的硬件设备,内存映射,从Flash读取内核映像和根文件系统,设置内核启动参数,调用内核。
我们用的第一阶段的启动代码bootstrap(支持nandflash启动的)入口是crt0_gnu.s。(下)部分将开始分析crt0_gnu.s的实现功能。