为了让将来的 Nor Flash 兼容性更好,引进了 CFI (Common Flash Interface)接口,将芯片有关的信息都写入芯片内部,通过 CFI 命令就可以获取这些信息。
Nor Flash上电后处于数据读取状态(Reading Array Data)。此状态可以进行正常的读。这和读取SDRAM/SRAM/ROM一样。在完成信息获取后一般就要擦除数据。 Nor Flash支持扇区擦(Sector Erase)除和整片擦除(Chip Erase)。
DQ7:Data# Polling bit,DQ7在编程时的状态变化。
-----------------------------------------------------------------------------------------------------------------
启动时读取的第一条指令是在0x00上,分为nand flash和nor flash上启动。
Nor flash的有自己的地址线和数据线,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x00上。
Nand flash是IO设备,数据、地址、控制线都是共用的,需要软件去控制读取时序,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。
Mini2440把Bootloader烧到nand flash上启动,因为在mini2440里有一个内置的SRAM,叫做stepping stone(垫脚石,很形象…),系统启动加电后,会把nand flash上的起始4KB的内容拷贝到SRAM里执行,这样就实现了从nand flash启动。如果bootloader小于4KB的话(像vboot),在SRAM里就能boot,大于4KB的话(u-boot,vivi),在SRAM里做一些基本初始化后,再把bootloader的剩余部分拷贝到SDRAM里(>0x30000000)。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
一:地址空间的分配
1:s3c2440是32位的,所以可以寻址4GB空间,内存(SDRAM)和端口(特殊寄存器),还有ROM都映射到同一个4G空间里.
2:开发板上一般都用SDRAM做内存,flash(nor、nand)来当做ROM。其中nand flash没有地址线,一次至少要读一页(512B).其他两个有地址线
3:nandflash不用来运行代码,只用来存储代码,NORflash,SDRAM可以直接运行代码)
4:s3c2440总共有8个内存banks
6个内存bank可以当作ROM或者SRAM来使用
留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM(各种内存的读写方式不一样)
7个bank的起始地址是固定的
还有一个灵活的bank的内存地址,并且bank大小也可以改变
5:s3c2440支持两种启动模式:NAND和非NAND(这里是nor flash)。
具体采用的方式取决于OM0、OM1两个引脚
OM[1:0所决定的启动方式
OM[1:0]=00时,处理器从NAND Flash启动
OM[1:0]=01时,处理器从16位宽度的ROM启动
OM[1:0]=10时,处理器从32位宽度的ROM启动。
OM[1:0]=11时,处理器从Test Mode启动。
当从NAND启动时
cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行。
当从非NAND flash启动时
nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。
总结:
Arm的启动都是从0地址开始,所不同的是地址的映射不一样。在arm开电的时候,要想让arm知道以某种方式(地址映射方式)运行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候arm会通过引脚的电平来判断。
1当引脚OM0跟OM1有一个是高电平时,这时地址0会映射到外部nGCS0片选的空间,也就是Norflash,程序就会从Norflash中启动,arm直接取Norflash中的指令运行。
2当OM0跟OM1都为低电平,则0地址内部bootbuf(一段4k的SRAM)开始。系统上电,arm会自动把NANDflash中的前4K内容考到bootbuf(也就是0地址),然后从0地址运行。
这时NANDFlash中的前4K就是启动代码(他的功能就是初始化硬件然后在把NANDFlash中的代码复制到RAM中,再把相应的指针指向该运行的地方)
为什么会有这两种启动方式,关键还是两种flash的不同特点造成,NOR FLASH容量小,速度快,稳定性好,输入地址,然后给出读写信号即可从数据口得到数据,适合做程序存储器。NAND FLASH 总容量大,但是读写都需要复杂的时序,更适合做数据存储器。这种不同就造成了NORflash可以直接连接到arm的总线并且可以运行程序,而NANDflash必须搬移到内存(SDRAM)中运行。
在实际的开发中,一般可以把bootloader烧入到Norflash,程序运行可以通过串口交互,进行一定的操作,比如下载,调试。这样就很可以很方便的调试你的一些代码。Norflash中的Bootloader还可以烧录内核到Norflash等等功能
--------------------------------------------------------------------------------------------------------------------------------------
1)接口区别: NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。 NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。 通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。而且都是在一个总线完成的。 结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash.
2)性能区别
NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理和需要特殊的系统接口。
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5s快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ARM是统一编址的,也就是外设和内存进行统一的编址,共同形成了4G物理地址空间(32位为例子)。
大家知道操作外设时,实际上操作的是读写设备相关的寄存器,这些与外设相关的寄存器与不同操作模式下R0-R15那些寄存器是不同的,这些寄存器并不是所谓的物理上的寄存器,实际上是所谓的IO端口,通常会有控制、状态、数据的分类。他们被连续地编址,对于其编址的方式有两种一种是IO映射、一种是内存映射。IO映射是对x86为例的复杂指令集来说的,需要专门的IO控制指令,不详谈。
内存映射是对于统一编址的精简指令集计算机ARM等来说的。具体的方法就是将IO端口映射成和内存一样的物理地址,然后与内存一起进行统一编址,或者说成为了内存的一部分,当然还可以理解内存映射的意思是可以用访问内存的方式进行IO地址的访问,内存和IO地址一起编码为cpu识别的地址哦。然后内存+IO端口地址=4GB的寻址空间。
那么接下来还有个问题就是这种编址的硬件实现?这就要详见arm的AMBA(Advanced Microcontroller BusArchitecture)了,这是目前芯片总线的主流标准。共定义了3组总线:高性能总线(Advanced High Performance Bus,AHB)、系统总线(Advanced System Bus,ASB)和外设总线(Advanced Peripheral Bus,APB)。不同的总线上挂接着不同的外设和存储器,大部分由三态门控制。比如,当AHB总线上的主设备读写从设备时,发出的地址经过AHB总线的译码器产生该地址所对应从设备的选择信号,选中从设备;这样就可以对从设备进行读写啦。或者可以这样想AHB总线上的译码器根据地址产生相应的片选信号,选中对应的设备。对于硬件的实现我们这是简单地理解以便更好地体会上述编址。涉及到具体的硬件读写操作,地址的硬件实现会提到很多的译码器、三态门、总线、还有时序等等具体情况具体分析,在此不做详述。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
必须要知道的是,所有的处理器PC指针复位值都会是0,所以一定会在0地址开始执行代码。??????????
这个0地址是个很讲究的东西。可以出现在0地址的东西通常有下面几种:
1. 片内的SRAM
2. 外部总线上的NOR FLASH
3. 片内固化的ROM CODE。每个厂家都会给ROM CODE起个名字,比如三星管这个叫IROM
那么怎么知道map哪个呢,这种情况下CPU还没开始跑,所以只能依赖于硬件逻辑。一般的做法是通过一些外部的管脚来配置,三星平台管这个叫OM。通过这部分的配置,芯片内部逻辑确定将什么东东map过去。
将SRAM map到0地址是ARM9时代的做法,那时候天是那么的蓝,水是那么的清,NAND FLASH启动扇区不需要ECC。复位起来的第一件事情就是NAND CONTROLLER将启动扇区COPY到SRAM内,然后CPU开始执行。
其它两种方式没有这种COPY的动作。 然后,CPU从0地址开始执行代码。 因为NAND是个很容易丢数据的东西,NAND启动方式有很大的问题。因为NAND CONTROLLER在COPY启动代码时不带ECC,常见的问题是数据异常导致启动失败。
所以现在这种方法不再使用了。 NOR启动,没什么好说了,大家都很了解。
引入ROM CODE启动方式主要是为了支持各种启动设备,包括各种ECC的NAND,各种串口,各种USB口,各种SD卡,各种拍脑袋想到的东东。有了ROM CODE作为跳板,就很容易发挥想象力了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.1 上电后的第一条指令在哪里?
首先明确:对于ARM芯片,启动时pc值由CPU设计者规定,不同的ARM CPU有不同的值,例如S3C2440芯片上电后PC值被硬件设计者规定为0x0;其他ARM芯片不一定是0x0。?????????
第一章讲述的上电取第一条指令过程以S3C2440为例,该芯片是ARMv4T架构,其他芯片在原理上类似。
S3C2440的启动时读取的第一条指令是在内存0x00地址处,不管是从nand flash还是nor flash启动。
但是上电后内存中是没有数据的,那么0x00地址处的指令是如何放进去的?针对不同的flash(nandflash、norflash),操作方式是不同的,下面讲述从nandflash和norflash启动的不同流程。
1.1.1 norflash和nandflash的异同
nandflash:价格低,容量大,适合大容量数据存储,地址线和数据线共用I/O线,所有信息都通过一条线传送,类比于PC的硬盘,
norflash:价格贵,容量小,适合小容量的程序或数据存储,类似硬盘,但是能在其中运行程序;有独立地址线、数据线
sdram:主要用于程序执行时的程序存储、执行或计算,类比于PC的内存;
综上:norflash比较适合频繁随即读写的场合,通常用于存储代码并直接在其中运行。nandflash用于存储资料。
只要知道以上大概区别就行。以下说明ARM从两种flash启动方式的异同。
1.1.1.1 ARM从nandFlash启动
若从nandflash启动,上电后nandflash控制器自动把nandflash存储器中的0——4K内容加载到芯片内的起步石(Steppingstone,起步石这个机制是处理器中集成的功能,对程序员透明),即内部SRAM缓冲器中,同时把内部SRAM的起始地址设置为0x0(不同的CPU上电后的PC值不尽相同,对不同的CPU该值也不尽相同),然后把这段片内SRAM映射到nGCS0片选的空间,进而CPU开始从内部SRAM的0x0处开始取得第一条指令,该过程全部是硬件自动完成,不需要程序代码控制。
或许你有个疑问,为什么不能直接把nandflash映射到0x0地址处?非要经过内部SRAM缓冲?
答案是,nandflash根本没有地址线,没法直接映射,必须使用SRAM做一个载体,通过SRAM把剩余的nandflash代码(即剩余的uboot启动代码)复制到SDRAM中运行。
若想从nandflash启动,那么uboot最核心的代码必须放在前4k完成。这4k代码要完成ARM CPU的核心配置以及将剩余的代码拷贝到SDRAM中(若从norflash启动则没有4k这个大小的限制,但是还会在完成最主要的设置后进入SDRAM中运行)。
1.1.1.2 ARM从norflash启动
若从norflash启动,则norflash直接被映射到内存的0x0地址处(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址不变,还是0x40000000),然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。
需要说明的是,uboot代码段(.text段)起始位置必须是与上电后PC值一致,即编译uboot时,TEXT_BASE宏必须设置成0x0 ,反汇编uboot文件后,文本段第一条指令的地址也是0.
总结:
1、从norflash还是从nandflash启动,是由ARM的OM1和OM0引脚组合决定
2、不管从norflash还是nandflash启动,S3C2440上电后的pc值为0x0
3、如果某芯片上电后PC值不是0x0,假如是0x38ff0000,那么从norflash启动时,硬件就要自动将其映射到0x38ff00