====================================================================================================================================
一、S3C6410地址空间整体说明
S3C6410基于32位的ARM11内核(ARM是按字节(每一个字节都有地址)寻址,即地址总线每挪动一位、就是1个字节的存储空间;参看计算机组成原理可知:还有按字(两字节,每两个字节有地址)、按位(每一位都有地址)等寻址的),理论寻址空间为4GB;对于6410来说,高2GB保留,低2GB(0x0000 0000~0x7FFF FFFF)可分为2部分:主存储区和外设区。
写BSP更多的关心外设区域,我们首先看看启动相关的主存储区。
二、S3C6410启动相关主存储区(0x0000 0000~0x6FFF FFFF)说明
Boot镜像区位于6410寻址空间的0x0000 0000~0x07FF FFFF(128MB)位置,这段区域并没有真正的存储设备,实际运行过程中是映射到内部存储区(内部SRAM)或静态存储区(外部SROM或SDRAM),Boot镜像区固定起始地址为0x0000 0000。
基于以上;所以,S3C6410和前面介绍的S3C2440A《micro2440开发》第一章:S3C2440A地址空间 一样,通过外部管脚OM[4:0]的拉高拉低来决定是从哪个存储设备上启动。
OM[4:1]为0100或0101,(SROM的片选为默认,即nor flash):从Nor Flash启动(外部SROM启动,0x0000 0000为外部SROM)。(tiny6410没有Nor Flash,所以、不支持该种模式。)系统上电之后,Boot 镜像区为SROM控制器的第0个bank(128MB),即0x1000 0000~0x17FF FFFF地址的映射,内核PC从0x0000 0000开始取指令实际是从SROM的bank0开始取指令运行。
OM[4:1]为0110,XSELNAND = 1(SROM的片选为oneNand,即oneNand):oneNand启动(外部SROM启动,0x0000 0000为外部SROM的片选XSELNAND = 1处)。此时整个Boot镜像区0x0000 0000~0x07FF FFFF全部为静态存储器0x2000 0000~0x27FF FFFF地址镜像,128MB一一对应,静态存储器0x2000 0000~0x27FF FFFF地址刚好是ONENAND Flash Bank0地址域,内核PC从0x0000 0000开始取指令实际是从ONENAND Flash Bank0开始取指令运行。
OM[4:1]为0111:MODEM启动(内部I_ROM启动,0x0000 0000为内部I_ROM)。在6410上电之后,ARM内核PC从地址0x0000 0000开始取指令,此时Boot镜像区(内部I_ROM)0x0000 0000开始的32KB为6410内部I_ROM地址 0x0800 0000~0x0800 7FFF的32KB数据的镜像,所以当PC从0x0000 0000开始取指令执行,实际是从I_ROM 0x0800 0000处开始执行代码,而I_ROM区32KB存放的是6410出厂固化的一段启动代码,这段代码会自动根据是MODEM Boot启动配置,初始化MEDEM 主机接口,从HOST处接收固件到8KB stepping stone(内部SRAM)区域,直至HOST激活MEODOM booting功能,ARM内核PC跳转到stepping stone(内部SRAM)开始处执行代码。
OM[4:1]为1111:IROM启动(内部I_ROM启动,0x0000 0000为内部I_ROM),可以支持MoviNand,SD/MMC,iNand,OneNand和Nand等。首先上电之后Boot镜像区(内部I_ROM)地址为0x0000 0000~0x0000 7FFF 的32KB区域为6410内部的I_ROM区低32KB字节0x0800 0000~0x0800 7FFF区域数据的镜像,ARM 内核从0x0000 0000取指令实际是从已经存储6410出厂固化代码的I_ROM区低32KB。其次是I_ROM 32KB会根据GPN[15:13]的不同设定,执行不同的代码搬移工作,比如当为NAND Flash启动设定,I_ROM 32KB会初始化NAND Flash控制器,搬移NAND Flash 的低8KB数据到6410内部的8k stepping stone(内部SRAM)区域,然后跳转到8k stepping stone(内部SRAM)处运行代码。
IROM启动具体步骤如下:
1. 处理器上电后,当OM[4:1]=1111时,运行iROM中的程序,这个程序被称为Bootloader0(BL0),它会做一些初始化的工作。
2. 然后根据GPN[15:13]的管脚设置,选择从相应的设备(SD/MMC/OneNand/Nand)中的指定区域读取4KB的程序到SteppingStone(内部SRAM)中运行,这段代码被称Bootloader1(BL1)。
3. BL1可以初始化系统时钟,UART,SDRAM等设备,然后拷贝Bootloader2(BL2)到SDRAM中。
4. 跳转到SDRAM中的BL2,继续运行,BL2可以支持更强大的功能,可以将OS加载到SDRAM中,然后运行OS。