简单讲:NAND FLASH相当于计算机的硬盘,适合存储大量数据,但是无法对其进行直接寻址,也就是说,对NAND FLASH的访问需要有专门的NAND FLASH控制器来产生相应的时序;从NAND FLASH启动就相当于从硬盘启动,这里涉及S3S2440内部的Steping Stone的支持,大小4K,上电后会通过硬件逻辑自动复制NAND FLASH前4K的数据到Steping Stone,然后在Steping Stone中执行。通常引导代码会复制 NAND Flash 的内容到 SDRAM 中。通过使用硬件 ECC,有效地检查 NAND Flash 数据。在复制完成的基础上,将在 SDRAM 中执行主程序。
NOR FLASH相当于计算机的内存,但是数据掉电后不丢失,CPU可以对其进行直接寻址,因此可以在NOR FLASH中执行程序。
SDRAM就相当于计算机内存,主要用于执行程序,但是掉电后里面的数据会丢失。NOR FLASH中的数据不会丢失,这是SDRAM与NOR FLASH的主要区别。
启动代码主要是负责对板级硬件的初始化,以及程序代码的搬移等。编写启动代码需要从具体的硬件配置讲起,总结起来主要有中断控制器、内部时钟电路、存储器控制器,一般还需要了解SDRAM的一些参数,此外还需要对NAND FLASH及NAND FLASH控制器有所了解。
S3C2440处理器支持4种启动方式,具体采用哪两种启动方式由系统本身的硬件情况决定,OM1和OM2是S3C2440处理器的两个引脚,可以通过开关来改变引脚的电平值,进而实现不同的启动方式选择。因此,具体启动流程为:上电后检测OM1和OM2的引脚电平,根据不同的电平值来选择具体启动方式,0M[1:0]=01,NOR FLASH启动;0M[1:0]=00 NAND FLASH启动。
启动代码:初学阶段并不需要完完整整地把启动代码写出来,只要能看懂启动代码即可,然后结合自己的理解稍作修改即可。
2440init.s
点击(此处)折叠或打开
- //GET为操作,包含三个文件,这三条语句不能顶头写
- GET option.inc //主要包含栈地址、中断服务程序基地址以及与系统初始化相关的几个常量定义;
- GET memcfg.inc //主要包含了与SDRAM初始化相关的几个参数定义;
- GET 2440addr.inc //S3C2440处理特殊功能寄存器的地址的定义。
- //主要是将当前程序状态寄存器CPSR中模式控制位进行定义。
- USERMODE EQU 0x10
- FIQMODE EQU 0x11
- IRQMODE EQU 0x12
- SVCMODE EQU 0x13
- ABORTMODE EQU 0x17
- UNDEFMODE EQU 0x1b
- MODEMASK EQU 0x1f
- NOINT EQU 0xc0
- //EQU定义常量时,需要顶格书写