Mini2440 存储器地址映射

Mini2440 存储器地址映射  

在介绍内存工作原理之前有必要了解下存储设备的存储方式:ROM,RAM

l ROM(Read-Only Memory):只读存储器,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,资料并且不会因为电源关闭而消失。如:PC里面的BIOS。在制造ROM的时候,信息(数据或程序)就被存入并永久保存。这些信息只能读出,一般不能写入,即使机器掉电,这些数据也不会丢失。

2 RAM(Random Access Memory) :随机访问存储器,存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。可以理解为,当你给定一个随机有效的访问地址,RAM会返回其存储内容(随机寻址),它访问速度与地址的无关。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间内随机访问使用的程序。计算机系统里内存地址是一个四字节对齐的地址(32位机),CPU的取指,执行,存储都是通过地址进行的,因此它可以用来做内存

电脑硬盘是磁盘,是磁记录的一种,是外置存储器, 不是ROM也不算RAM;ROM是固化系统基本程序,如电脑的BIOS;RAM是电脑的内存,平常说几个G内存就是指的RAM。

RAM按照硬件设计的不同,随机存储器又分为DRAM(Dynamic RAM)动态随机存储器和SRAM(Static RAM) 静态随机存储器。

l DRAM:它的基本原件是小电容,电容可以在两个极板上短时间内保留电荷,可以通过两极之间有无电压差代表计算机里的0和1,由于电容的物理特性,要定期的为其充电,否则数据会丢失。对电容的充电过程叫做刷新,但是制作工艺较简单,体积小,便于集成化,经常做为计算机里内存制作原件。比如:PC的内存,SDRAM, DDR, DDR2, DDR3等,缺点:由于要定期刷新存储介质,存取速度较慢。

2 SRAM:它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。因此其存取速度快,但是体积较大,功耗大,成本高,常用作存储容量不高,但存取速度快的场合,比如CPU的L1 cache,L2cache(一级,二级缓存) ,寄存器。

 

为了满足开发的需要MINI2440在出厂时搭载了三种存储介质(外设):

(1)NOR FLASH(2M):ROM存储器,通常用来保存BootLoader,引导系统启动(可擦除)

(2)NAND FLASH(256M,型号不一样,Nandflash大小不一样):保存操作系统映像文件和文件系统

(3)SDRAM(64M):内存,执行程序

 NORFLASH:它的特点是支持XIP芯片内执行(eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中,也就是说可以随机寻址。NOR FLASH的成本较高。

 NAND FLASH:它能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。其成本较低,不支持XIP。可做嵌入式里的数据存储介质。如:手机存储卡,SD卡等。

 

如果大家写过S3C2440的ARM裸机程序都应该知道通常SDRAM的起始地址是0X30000000,但是大家有没有想过为什么呢?下面我将给大家做一个简要的介绍。

查S3C2440的手册可知S3C2440可寻址1G的地址范围,但是S3C2440的地址线只有27,理论上只能寻址2的27次方等于128M的地址范围。于是S3C2440通过一个叫BANK的东东解决了这个问题。S3C2440引出了8根BANK线(对应nGCS0~ nGCS7),通过这个8根线来选通和关闭不同的存储器,这样S3C2440最多就可以连接8个128M的存储器,只要在某一时刻只选通一个BANK就可以实现1G的寻址空间每个BANK有个地址,对该BANK地址的访问实际上就是选通该BANK。

而作为32位的CPU,可以使用的地址范围理论上可以达到2的32次方等于4G,除去上述的1G地址空间,还有一部分是CPU内部寄存器的地址,剩下的地址空间没有使用。可以把4G的地址解释成三部分:一部分是外接设备的地址,一部分是内部寄存器地址,还有一部分是未定义空间

下面我们来看到S3C2440存储器(外设)的地址空间分布图


左边的是表示CPUNORFLASH启动时的地址空间图,右边是CPUNANDFLASH启动时的地址空间图。

前6个内存bank可以当作ROM或者SRAM来使用,既nGCS0~nGCS5。

后2个bank除了当作ROM 或者SRAM,还可以用SDRAM(各种内存的读写方式不一样) 并且bank大小也可以改变。

8个bank的起始地址是固定的;nGCS0默认映射2M的Norflash上。而nGCS1到nGCS5挂载其它芯片或悬空,只有当程序用到该段地址时CPU才为它映射到物理地址。两片32M,16Bit位宽SDRAM内存上用于存放系统引导程序Bootloader,并联形成64M,32位内存映射到nGCS6。而nGCS7也是挂载其它芯片或悬空。由于Nandflash的数据总线与系统的数据总线不一样,所以没办法直接挂载到系统总线上。

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启动。

系统上电后,CPU从Bank0的开始地址0x00000000开始取指运行。选择Norflash启动时,系统从Norflash上开始运行(一般是系统引导程序Bootloader)。选择Nandflash启动时由于NAND FLASH是接在NAND FLASH控制器上而不是系统总线上,所以没有在S3C2440A的8个BANK中分配地址空间(而是映射)。如果S3C2440被配置成从Nand Flash启动,在S3C2440上电后,Nand Flash控制器的会自动的把Nand Flash上的前4K数据搬移到内部SRAM中,也就是所谓的”Steppingstone”, 同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。系统会从这个内部SRAM中启动,程序员需要完成的工作,就是把最核心的启动程序放在Nand Flash的前4K中,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序(Nandflash中存放的程序)拷贝到RAM(一般是SDRAM)中运行。而在Nand Flash方式启动的情况下,系统是”看不到”Nor Flash的,因为Nor Flash也是挂在nGCS0上的,而nGCS0的地址空间已经被占用了。从Norflash启动时,Steppingstone将被映射到0x40000000地址上,由上边的图可知。

有很多同学在移植u-boot时,都会对s3c2440从Nandflash启动的过程非常迷惑。这里发这个帖子给大家介绍一下它的启动流程。

   大部分ARM9的CPU内部都集成有一个SRAM,SRAM是英文StaticRAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用的,这点大家务必要搞清楚。这点在我做过移植的处理器:s3c2410(arm920t),s3c2440(arm920t),at91rm9200(arm920t),at91sam9260(arm926t)上都是这样的。在s3c2440这颗CPU上这个SRAM大小为4KB,datasheet里把它叫做Stepping Stone,江湖人称“垫脚石”。

   Nandflash和Norflash是不同的:Norflash像内存一样是直接挂在系统总线上的,这样有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问Norflash上存储的内容,同时他还支持XIP(即片上执行,不用将代码搬到内存中,直接在Norflash上就能运行)。 而Nandflash它并不是直接挂载系统总线上,而是通过Nandflash控制器(这个一般集成在CPU内部)来完成读写操作的。如果我们把Norflash的那种寻址方式叫直接寻址的话(不是汇编里的那个直接寻址,这里指CPU能够直接通过地址线访问存储器的存储单元),那么这里的Nandflash就是间接寻址(这里需要Nandflash控制器来寻址)。所以我们在使用Nandflash之前,一定要初始化Nandflash控制器。

   理解上面的这点后,就不难理解,为什么系统能够从Norflash直接启动,而不能直接从Nandflash启动。这是因为,ARM在CPU复位时,CPU默认会到0x00000000地址处去取指令,而如果我们是从Norflash启动的话(一般Norflash会挂到Bank0,nGCS0上),s3c2440CPU就会把Norflash的空间挂接到0x0000 0000这段内存空间上。这时CPU就能够直接从Norflash上取指令运行,启动了。而如果是Nandflash, 因为Nandflash他不能直接挂到系统总线上,并且他的读写,擦除操作必须依赖Nandflash控制器,这也就意味着Nandflash的存储空间永远不能映射到0x0000 0000这个地址上去。另外,Nandflash的读写操作也不是这样直接寻址的,有兴趣的同学可以自己看看Nandlfash的datasheet,写一个RAW的Nandflash 擦除,读写操作程序就明白了。我就写过这么一个程序,对理解Nandflash究竟是怎么操作的非常有帮助。

   而如果这些CPU要从Nandflash上启动,那该怎么办呢?这就要用到我之前提到的CPU的内部SRAM了。

   在S3C2440的datasheet里有提到,如果我们配置从Nandflash启动的话,那么CPU会自动将内部SRAM的地址映射到0x0000 0000这个地址空间上了,而如果不是从Nandflash启动,那么挂载Bank0(nGCS0)上的设备就会被映射到0x0000 0000地址空间上,如我们之前提到的Norflash。

   简而言之就是:如果从Nandflash启动,那么CPU内部SRAM被映射到0x00000000地址空间上,这时Norflash就不可用了。而如果是从Norflash启动的话,那么Norflash被映射到0x0000 0000地址空间上。我们之前提到ARM CPU在复位时,会默认到0x0000 0000地址上取指令。这样也就是如果从Nandflash启动的话,那么CPU默认会从内部SRAM中取第一条指令;而如果从Norflash启动的话,那么CPU默认从Norflash中取第一条指令。

  那如果从SRAM启动的话,那么SRAM中的指令(也就是代码)从哪里来的呢?在s3c2440处理器(arm920t和arm926t的核应该都是这样的,另外我看S3C6410也是如此)上电时,CPU会自动将Nandflash的前4K代码(或叫指令)拷贝到内部SRAM中,这是由CPU自动完成的,不需要我们干预。这也就意味着,SRAM中的内容就是我们Nandflash上前4K的代码了。

  这样,如果是在我们的bootloader如u-boot中就要确保,我们编译出來的前4K代码完成以下功能:

1, 初始化CPU,外部SDRAM,Nandflash控制器等基本功能;

2, 将Nandflash上剩余的u-boot代码拷贝到外部的SDRAM中

3, 调到外部的SDRAM中来运行u-boot代码。

这样,U-boot就启动了。

 

4G的地址空间分配

NOR FLASH(2M)地址 0X0000_0000--0X000F_FFFF;

或者SRAM(4K)  地址 0X0000_0000--0X0000_0FFF;

0X3000_0000--0X3100_0000,作为程序代码区,文字常量区;

0X33ff_0000--0X33ff_4800,作为堆区;

0X33ff_4800--0X33ff_8000作为栈区;

0X33ff_ff00--0X3ff_ffff,作为偏移中断向量表。

(SDRAM (64M)地址分配)

0x4000 0FFF——0x4800 0000           保留

0x4800 0000——0x6000 0000           特殊功能寄存器的地址

0x6000 0000——0xFFFF FFFF            未定义

注:从NOR Flash启动时片内4KB SRAM映射在这个0x4000 0000——0x4000 0FFF地址范围,而从NAND启动时片内4KB SRAM映射在0x00000000地址,则这个地址范围是保留的。

 

S3C2440特殊功能寄存器的地址空间

外接设备

起始地址

结束地址

存储控制器

0x48000000

0x48000030

USB Host控制器

0x49000000

0x49000058

中断控制器

0x4A000000

0x4A00001C

DMA

0x4B000000

0x4B0000E0

时钟和电源管理

0x4C000000

0x4C000014

LCD控制器

0x4D000000

0x4D000060

NAND FLASH控制器

0x4E000000

0x4E000014

摄像头接口

0x4F000000

0x4F0000A0

UART

0x50000000

0x50008028

脉宽调制计时器

0x51000000

0x51000040

USB设备

0x52000140

0x5200026F

WATCHDOG计时器

0x53000000

0x53000008

IIC控制器

0x54000000

0x5400000C

IIS控制器

0x55000000

0x55000012

I/O端口

0x56000000

0x560000B0

实时时钟RTC

0x57000040

0x5700008B

A/D转换器

0x58000000

0x58000010

SPI

0x59000000

0x59000034

SD接口

0x5A000000

0x5A000040

AC97音频编码接口

0x5B000000

0x5B00001C

 

小结:

1. 系统是不能直接从NAND直接启动的(可以从NOR直接启动),因为程序从零地址处开始运行。只能把Nand flash的前4kb的程序拷贝到“垫脚石石中,”借助“垫脚石”运行,再将Nandflash中剩下的所有程序拷贝到内存中运行。

2. 要烧进flash,地址须设置为0x30000000,这不是SDRAM的地址吗?烧写flash的过程也必须是先把data写进内存,再由内存烧写进flash,所以地址要写成内存的地址。

在LINUX内核注释中,内存分为内核区(内核专用);高速缓存区(为磁盘或软盘交换数据准备的);用户申请区(这才是我们常说的内存)。而硬盘的读写必须经过内存的高速缓存区才能传输。


注:修正了之前的nGCS0-7默认映射地址、NandFlash挂载到系统总线上的错误,对之前看过本篇的同学深感抱歉!

你可能感兴趣的:(Mini2440 存储器地址映射)