×
嵌入式 > 嵌入式开发 > 详情

S3C2440地址空间的分配及启动过程

发布时间:2020-08-17 发布时间:
|

一、S3C2440地址空间的分配

1.s3c2440A的存储器控制器有以下特性:

l大小端(通过软件选择)

l地址空间:每个bank有128M的字节(总共1G字节/8个banks)

l可编程的访问位宽,bank0(16/32位),其他bank(8/16/32位)

l共8个存储器banks

l6个是ROM,SRAM等类型存储器bank

l2个是可以作为ROM、SRAM、SDRAM等存储器bank

l7个固定的存储器bank起始地址

l最后一个bank的起始地址可调整

l最后两个bank大小可编程

l所有存储器bank的访问周期可编程

l总线访问周期可通过插入外部wait来延长

l支持SDRAM的自刷新和掉电模式

2.寻址空间

s3c2440是32位的,所以理论上可以寻址4GB空间,内存(SDRAM)和端口(特殊寄存器),还有ROM都映射到同一个4G空间里。但是,芯片引脚上只给出了27根地址(ADDR[26:0]),单靠芯片上的27根引脚,它只能控制128M的空间,剩下的在哪里?

在cpu芯片手册上,查它的内部寄存器的地址,我们可以找到一部分答案。比如这次总结笔记要讲的存储器控制寄存器,13个寄存器,每个寄存器的地址,都大于0X4000 0000的地址。而0x4000 0000(1G)是1G空间的分界线,也就是说,1G~3G之间的空间,实际上都是被芯片自己占用了。实际上,给用户的使用的空间,只有1G。

我们刚才说了,我们使用了128M,用了27根地址线。而1G空间,需要30根地址线。剩下的3根用在什么地方?查了资料,突然明白了。这三根被三星公司偷偷地用在了3-8译码器的输入端去了。而这个3-8译码器的输出端,就是对应这nGCS0~7,对应着8个bank。很明显了,三星的2440留给用户使用的这1G空间,27根线用于芯片引脚来控制具体的bank了,剩下的三根,用于选择当前处于哪个bank。

二、S3C2440系统启动

手册里说,2440启动方式决定于bank0,以及OM[1:0]。

Arm的启动都是从0地址开始,所不同的是地址的映射不一样。在arm开电的时候,要想让arm知道以某种方式(地址映射方式)运行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候arm会通过引脚的电平来判断。

S3C2440支持两种启动方式:NandFlash和非NandFlash(例NorFlash)启动。

从NorFlash启动时,与nGCS0相连的NorFlash就被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;

从NandFlash启动时,S3C2440芯片内部自带的一块容量为4K的被称为“Steppingstone”(起步石)的BootRAM被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000。当系统上电或复位时,程序会从0x0地址处开始执行,因此我们编写的启动代码要确保存储在0地址处。在实际的开发中,一般可以把bootloader烧入到Norflash,程序运行可以通过串口交互,进行一定的操作,比如下载,调试。这样就很可以很方便的调试你的一些代码。Norflash中的Bootloader还可以烧录内核到Norflash等等功能。

NorFlash启动时,没有额外需要考虑的问题,因为这种情况下程序在系统启动前就存储在NorFlash中,我们只要保证将启动代码保存在NorFlash开始的位置即可,系统上电或复位时,0地址处的启动代码就会被执行。

NandFlash启动时,系统启动前所有的程序存储在NandFlash中,系统的启动过程稍微有点复杂:系统上电或复位时,0地址处为S3C2440内部自带的BootSRAM,启动前里面没有任何存储内容,启动后S3C2440先通过硬件机制将NandFlash前4k的内容拷贝到BootSRAM中,然后再运行里面的程序(从0地址处开始)。这种情况下我们需要保证将启动代码保存在NandFlash开始的位置,并且启动代码的大小要小于4K。

如果系统的所有程序在编译链接后的大小小于4K,那在系统的启动代码中无需考虑将程序从NandFlash搬运到SDRAM这个问题,因为所有的程序在启动时即全部由NandFlash拷贝至BootSRAM,程序在BootSRAM中运行即可;如果系统的所有程序在编译链接后的大小大于4K,那在系统的启动代码中就需要包含一段将系统的全部程序从NandFlash搬运到SDRAM的代码,因为系统启动时只将NandFlash的前4K拷贝到了BootSRAM中,还有部分程序在NandFlash中,而程序在NandFlash中是无法运行的,需要将所有程序拷贝至SDRAM并在其中运行,所以系统的启动代码中要包含这段有关程序拷贝的代码,并在所有程序拷贝完成后使程序跳转到SDRAM中运行。也就是说NandFlash启动时需要考虑到涉及的两次搬移,第一次搬运是S3C2440硬件机制自动实现的,无需干预,第二次搬运需要程序员来实现,搬运程序量大小是系统的所有程序。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
一只老鸟的嵌入式ARM学习心得