ARM的启动方式和bootloader解析(上)

作者:vianowu                                  

本期关键词:    NAND flash启动方式  Romboot  uboot

本期扩展关键词:NOR flash启动方式  emmc  cp15  dataflash

平台: AT91SAM9x25

之前玩的开发板是三星公司的s3c2440,但是对于NAND flashNOR flsah的启动方式也是简单的了解了一下,知道他们大致的启动区别。但是这次对于ATMAL公司的SAM9x25的板子做了一下试验,才知道了具体的一个工作原理。以下是对一段时间前认识的总结。

1.NAND flashNOR flash

相信接触过Flash的人都知道了这两个存储器的,那时候老师还告诉我们可以把NAND flash看成电脑的硬盘,把NOR flash看成电脑的内存。虽然在NAND flashNOR flash的功能支持上是对的,但是容易让我们误解NOR flash在开发板就是RAM的作用,看来断章取义不可取啊,真理果真是有时限的,也好理解牛顿的运动定律不是万能的了。

NOR flashNAND 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会先对硬件环境初始化,把32KSRAM中的最大24K的代码搬运到SDRAM(我们所说的内存)。再启动bootloader对系统进行进一步的初始化。

扩展思维:

1Emmc

Emmc是目前手机运用比较多的的存储设备,Emmc的接口是接cpu的,驱动的实现方式、分区格式化、对cpu接口都和TF卡一样。对于Emmc启动方式,由于将uboot烧录到Emmc比较困难,没有合适对外接口,所以一般采用先启动sd卡再用sd卡里的uboot烧录新的ubootemmc

链接地址:http://baike.baidu.com/view/3509283.htm

2CP15

协处理器CP15总共有c0~c1516个协处理器寄存器,各自具有一定的功能定义。但总的来说,cp15主要跟以下功能有关:
A、获取device idcache type等一些CPU相关信息。
B、MMU操作。包括MMU的使能和禁止,虚拟地址到物理地址的映射机制建立
C、访问权限控制。主要用来实现安全机制和linux的写时复制(copy on write)。
D、设置时钟模式。init.SMMU_SetAsyncBusModeMMU_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的检索过程。其实只是上一幅逻辑图的补充而已。相应的检索顺序是SPI0SD卡,NAND flash SPI1EEPROMSAM-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软件它知道要往第六个向量写入整个NVMnon-volatile memories)程序的大小(其实就是我们接着要说的bootloader映象的大小)。所以我们用SAM-BA烧写程序也方便些。

问题四:我们用RomBoot烧什么程序?那个程序做什么?

我们烧写的程序就是bootloader。但是有的bootloader为了更好的区分引导程序功能,又将bootloader分为一级bootloader(又叫bootstrap)和二级bootloaderU-boot)。第一阶段的bootstrap主要完成的功能是硬件初始化,加载U-bootRAM,设置堆栈,跳到第二段代码入口。第二阶段的U-boot主要完成的功能是初始化要用的硬件设备,内存映射,从Flash读取内核映像和根文件系统,设置内核启动参数,调用内核。

我们用的第一阶段的启动代码bootstrap(支持nandflash启动的)入口是crt0_gnu.s。(下)部分将开始分析crt0_gnu.s的实现功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值