1、启动方式
s3c2440:可以从Nor flash启动,Nor flash一般是2MB;也可以从Nandflash启动,它一般是256MB,我们习惯上把我们的uboot,内核以及文件系统都放到Nandflash里面去,选择开发板从nandflash启动。
当2440从nandflash启动的时候,其地址布局是怎样的呢?
打开芯片手册
当处理器上电之后,它会从哪儿去取它的第一条指令呢,会从0地址处去取它的第一条指令。如果说是从nor flash来启动,0地址处应该安排我们的nor flash,然后编写的代码应该放在nor flash的最前端,否则cpu去取指令会取不到。如果说从nandflash启动的话,上图右面看不到nandflash,由于我们的nandflash是不能直接访问的,它必须通过相应寄存器才能访问到,所以它不能直接 参与arm处理器的统一编址,那么nandflash没有参与统一编址,那么0地址处又是安排的什么呢,是bootsram,它是片内的sram,其大小为4kb,那么到底bootsram和nandflash是什么样的关系呢,实际上bootsram还有一个名称称为steppingstone;实际上我们选择从nandflash启动后,一上电我们的处理器会首先自动从nandflash中把最前端的4kB复制到steppingstone里面去,换句话说,就是处理器就间接取到了nandflash里面的内容。由于我们的bootloader一般不止4KB,那么nandflash后面的字节该怎么办呢,那么剩下的就要复制到内存里面去了,那么谁来做复制这个工作呢,就是前面的4KB里面的代码会做这个工作,那么到底是不是这样子操作的呢,到芯片手册里去搜索steppingstone关键词
s3c6410:打开芯片手册S3C6410X,搜寻一个关键词booting,
首先,它支持SROM启动(也就是NOR flash启动),在我们的6410当中没有必要采用NOR flash启动,并不是说它不支持nor flash启动;然后,支持onenand方式启动,它是一种特殊的nandflash,它既具有nor flash的特性,也具有nandflash的特性;然后是支持从MODEM启动;最后是支持IROM启动,实际上SD卡启动和nandflash启动都是划归在IROM下面的;IROM是我们处理器内部的部件或者说存储器,IROM并不是2440里面的垫脚石,
到底从什么地方启动,我们可以设置前面的引脚来决定到底从哪儿启动,
s5pv210:首先打开一个文档,S5PV210_UM,找到523页
从上图可以清晰地看到210的启动模式,支持IROM启动(其中包括SD卡启动,NAND FLASH启动)、支持USB、串口等启动方式。
2、地址布局
s3c2440:那么它从nandflash启动,那么我们芯片的地址布局是怎样的呢,打开芯片手册S3C2440这个文档,搜寻一个关键词MAPPING,找到如下:
上面有两个表,左边表示我们选择从Nor flash启动时,地址的布局,右边表示我们从Nandflash启动时,地址的布局。那么当处理器上电后,它会从哪儿去取它的第一条指令呢,它会从0地址处去取第一条指令;如果我们是从nor flash启动,那么0地址处应该安排我们的nor flash,那么我们的代码应该放在nor flash的最前端,否则,cpu去取指令,发现没有指令或者错误指令,那么cpu 也没有办法继续运行了。如果我们从nandflash启动,从右边表中没有看到nandflash,而且nandflash它不能直接访问,也就是说不能像内存一样直接去访问它,它必须通过一些寄存器才能访问到,所以说它不能直接参与arm处理器的统一编址,也就在上面右边看不到了,那么nandflash没有参与统一编址,那么0地址处安排的是什么呢?0地址处排布的是BootSRAM,它实际上是处理器片内的一个RAM,它有4kb的大小,它还有一个名字叫做stepping stone,“垫脚石”。那么它是没有统一编址的nandflash是什么关系呢?实际上,我们一旦上电之后,且选择从nandflash启动之后,我们的处理器首先会自动地把nandflash最前端的4kb数据复制到stepping stone里面去,那么我们的处理器就间接地取到了nandflash里面的内容,然后cpu再去运行stepping stone里面的代码,实际上cpu就是运行的nandflash里面最前端的4kb的内容,那么硬件自动复制了nandflash前面的4kb过来,通过我们的bootloader不只有4kb,那剩下的bootloader怎么办呢?那么剩下的部分就要复制到内存里面来了,因为stepping stone已经存不下了,那么谁来做复制这个工作呢?当然就是前面的4kb的bootloader,它除了做一些硬件上的初始化,它还必须把剩下的代码复制到内存,且运行完stepping stone里面的4kb程序之后,然后跳转到内存里面去执行下面的代码。
那么我们还得关心我们的内存,那么内存在什么地方呢?
这个内存起始地址是处理器要求这么安排的!
s3c6410:
在地址布局当中我们首先还是关心的以下几个部件:
1、IROM在那个位置?
2、stepping stone?
3、内存是DRAM,在0x5000 0000地址开始的位置。
还要注意,因为我们的ARM处理器一上电,它是从我们的0地址处开始执行代码,那么我们就很关心,在我们6410的0地址处究竟放的是什么东西呢, 该地址处是Booting Device Region by XOM Setting,这是一个启动区域,靠XOM来设置,它是一个Mirrored region,镜像区域。它的性质是不放任何设备,是用来映射的。如果我们选择从IROM启动,那么会把IROM映射到我们的镜像区域里面来,可以把IROM理解为0地址,那么一旦上电就可以从IROM里面取内容来运行。如果选择其他方式启动,也是同样映射到镜像区域里面来;
s5pv210:
IROM大小为64KB,地址在0XD000 0000开始;有没有垫脚石呢?其实在地址0xD002 0000开始的位置96KB的IRAM就是我们的垫脚石;
对于0地址处,是启动区域,也是采用的映射方式,与6410一样。
内存:在0x2000 0000开始的地址处,
3、启动流程
s3c6410:如果选择从nandflash来启动,那么它的启动流程是怎样子的呢?
打开另外一个文档S3CJ6410_Internel_ROM_Booting,
我们已经知道nandflash启动是属于IROM启动当中的一种,我们上电之后,我们选择从IROM启动,我们IROM映射到0地址处,所以我们的处理器首先是从IROM当中去取第一条指令,IROM里面存放的是什么东西呢?其实IROM里面存放的是芯片厂商给我们固化好了的一些程序,这个程序通常称为BL0,即bootloader的第0阶段。这段代码除了做一些硬件的初始化外,它还会做一些工作,把我们nandflash里面的bootloader1,BL1,是nandflash最前面的8KB,拷贝到我们的stepping stone里面来运行,那么我们的BL1就到我们的stepping stone里面来运行了,在运行的过程当中,我们的bootloader不止8KB还有一段程序留在nandflash里面,那么我们的BL1就会把nandflash剩余的bootloader,即BL2拷贝到SDRAM里面来运行,
s5pv210:打开文档S5PV210_iROM_ApplicationNote_Preliminary_20091126,
我们主要考虑它从nandflash来启动,又由于nandflash是IROM的一个分支,所以他是从IROM方式来启动的,处理器上电后,因为IROM被映射到了0地址处,所以说我们的处理器会从IROM当中去取到第一条指令,IROM当中的代码是芯片厂商已经固化好了的程序,其作用在于初始化一些硬件,然后拷贝nandflash里面的bootloader1即,BL1,的内容到芯片内部的IRAM(SRAM,也就是垫脚石),它的大小为96kb,由于垫脚石比较大,所以我们把nandflash里面的BL2拷贝到垫脚石里面来,如果说nandflash里面还有bootloader,那么就把它拷贝到内存SDRAM里面去,注意对于BL1的大小为16KB,那么BL2最大为80KB,即如果BL2的内容超过了80kb,就要往内存里面复制了。最后我们的bootloader要么在IRAM中运行,要么在内存中运行。