《micro2440开发》第一章:S3C2440A地址空间

  首先,说明如下:

ARM按字节寻址,即对存储的最小访问单元是字节;存储单元按字节对齐。

地址空间从高到底分为两部分:主存储区(包括静态存储区(存放img)和动态存储区(就是我们通常说的运行代码的内存))和外设寄存器区。

而主存储区又会分为很多bank,目的是为了让更少的地址总线寻址更多的地址(128MB*8 = 1GB)即片选+地址总线模式。

研究启动过程关心的是主存储区的静态存储区;还有ARM核0x0000 0000处的映射(可能是主存储区的静态存储区(一般是bank0处的nor flash),也可能是核内SRAM(4KB)(nand flash启动时就是这种);由OM[4:0]设置)。

开发外设驱动,我们关心外设寄存器区的地址空间。下面的讲解也都是基于以上分析。

==================================================================================================================================== 

  一、整体图如下:其中白色部分为ARM核内部的寄存器(访问他们,只能使用汇编语言。ARM核=ALU + CU + R + 内部总线);他们通过ALU总线、PC总线、A总线、B总线、增量器总线等与运算器和控制器连接在一起。该部分没有被编入我们通常所说的地址空间、即32位地址之中;通过逻辑电路直接给出操作地址。

    其他为ARM核外空间、他们都挂在AMBA总线上,总共32位(而ARM对存储的访问是按字节的,即地址每挪动一位、传送1字节数据)、即4GB。其中绿色部分为所接外部存储器地址空间(不包括NAND Flash)、0x0000 0000~0x 4000 0000、是由27根地址总线(128M寻址)和8个片选位(BANK)组成黄色部分是外设寄存器地址空间、即0x4000 0000~0xFFFF FFFF,这部分也是我们编写BSP、外设驱动时所需要经常使用的地址;红色部分是外设。

    

    二、S3C2440A的ARM核内有31个通用寄存器和6个程序状态寄存器,如白色部分该部分没有被编入我们通常所说的地址空间、即32位地址之中;通过逻辑电路直接给出操作地址)。

     《micro2440开发》第一章:S3C2440A地址空间_第1张图片

      这些寄存器只有通过汇编语言才可以访问;访问时,直接使用他们的名字即可。

    三、S3C2440A的ARM核外空间地址分配,即32位地址空间(0x0000 0000~0xFFFF FFFF)的所有地址分析

      S3C2440A是32位的(地址总线),2的32次方得知该CPU的地址空间为4GB(ARM按字节寻址),即该CPU可访问4GB大小的范围。

《micro2440开发》第一章:S3C2440A地址空间_第2张图片

      1.上图绿色部分为外部存储器地址空间,0x0000 0000~0x4000 0000、大小为1GB、是由27根地址总线(128MB寻址)和8个片选位(BANK)组成;包括SROM(NOR Flash)、SDRAM(静态内存)和SRAM(4KB内存),不包括NAND Flash。存在于S3C2440A外部,用于存放数据和程序用的,S3C2440A可通过地址线和数据线从中读取数据。

      S3C2440A外部存储设备的访问地址:

《micro2440开发》第一章:S3C2440A地址空间_第3张图片

      2.最上图黄色部分为功能部件寄存器(也叫特殊功能寄存器),0x4000 0000~0xFFFF FFFF、大小3GB;包括存储器控制寄存器、NAND Flash控制器(挂NAND Flash)、中断控制器、IIS控制器、AC97音频编解码接口、IIC控制器、NAND Flash控制器、LCD控制器等等。存在于S3C2440A内部,即在这些寄存器上写入一些数据,则可控制相应功能部件的行为。这部分也是我们编写BSP、外设驱动时所需要经常使用的地址。 

    S3C2440A内部各功能部件的寄存器(也叫特殊功能寄存器)地址:这部分也是我们编写BSP、外设驱动时所需要经常使用的地址)

      

====================================================================================================================================

====================================================================================================================================

====================================================================================================================================

    四、系统从NOR Flash的启动过程比较简单;下面重点从NAND Flash的启析来分析整个过程,涉及S3C2440A外部存储设备的地址(即0x0000 0000~0x4000 0000这1G空间)分配问题:

如下图两种模式是通过硬件拉高拉低电平设置OM[4:0]位决定的!

    《micro2440开发》第一章:S3C2440A地址空间_第4张图片

1. 系统是不能从NAND直接启动的(可以从NOR直接启动),必须把程序读入内存才能运行。把boot loader程序放在NAND Flash的前4kb空间,2440启动后会自动把前4kb的boot程序读入内存SRAM、并通过OM[4:0]把该段SRAM映射进nGDS0(注意这个和BANK片选的区别!)运行,这个过程是自动完成的。

2. 要通过J-Flash ARM烧录NAND Flash,地址须设置为0x3200 0000,这不是SDRAM的地址吗?烧写NAND Flash的过程也必须是先把data写进内存,再由内存烧写进NAND Flash,所以地址要写成内存的地址。

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

    由于 NAND FLASH是接在NAND FLASH控制器上而不是系统总线上,所以没有在S3C2440A的8个BANK中分配地址空间。 如果S3C2440被配置成从Nand Flash启动,在S3C2440上电后,Nand Flash控制器的会自动的把Nand Flash上的前4K数据搬移到内部SRAM中,也就是所谓的”Steppingstone”, 同时把这段片内SRAM映射(OM[4:0]设置,注意跟片选bank没有任何关系!)到nGCS0(即0x0000 0000)。系统会从这个内部SRAM中启动,程序员需要完成的工作,就是把最核心的启动程序放在Nand Flash的前4KB中,也就是说,你需要编写一个长度小于4KB的引导程序,作用是将主程序拷贝到RAM (一般是SDRAM)中运行。而在Nand Flash方式启动的情况下,系统是”看不到”Nor Flash的,因为Nor Flash也是挂在nGCS0上的,而nGCS0的地址空间已经被占用了。

====================================================================================================================================

    移植u-boot时,s3c2440从Nandflash启动的过程:

    大部分ARM9的CPU内部都集成有一个SRAM,SRAM是英文Static RAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用的。在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默认会到0x0000 0000地址处去取指令,而如果我们是从Norflash启动的话(一般Norflash会挂到Bank0,nGCS0上),s3c2440 CPU就会把Norflash的空间挂接到0x0000 0000这段内存空间上。这时CPU就能够直接从Norflash上取指令运行,启动了。而如果是Nandflash, 因为Nandflash他不能直接挂到系统总线上,并且他的读写,擦除操作必须依赖Nandflash控制器,这也就意味着Nandflash的存储空间永远不能映射到0x0000 0000这个地址上去。另外,Nandflash的读写操作也不是这样直接寻址的(可以自己看看Nandlfash的datasheet),写一个RAW的Nandflash 擦除,读写操作程序就明白了。

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

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

    简而言之就是:如果从Nandflash启动,那么CPU内部SRAM被映射到0x0000 0000地址空间上,这时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的代码了。


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

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

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

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

这样,U-boot就启动了。

你可能感兴趣的:(c,linux,汇编,Flash,存储,磁盘)