如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78433564
讲完启动模式、烧写更新,接下来我们看一下启动流程。
参看:S5PV210开发 -- 通过 DNW、fastboot 烧写
参看:DM368开发 -- Bootloader 开发(转毕设)
学习S5PV210 启动流程部分,需要查看芯片手册和相关的文档。 下载:相关文档
一、iROM启动方式简介
在讲烧写/启动模式的时候其实已经提到,S5PV210 采用 iROM 启动方式进行启动,支持从MoviNAND/iNand, MMC/SD Card ,pure Nand, eMMC, eSSD, UART and USB等存储设备启动。
我们可以通过外部引脚OM[5:0]来选择相应的启动模式。
下面看一下手册上是怎么说的吧!!
(1)硬件支持需求
使用iROM启动方式有几种硬件需求:
基于CortexA8的S5PV210X微处理器
64KB iROM
96KB iRAM
通用的SDRAM和控制器
4/8 Bit的高速SD/MMC控制器
4-bit SD / 4-bit MMC / 4 or 8-bit eMMC
Nand Flash控制器
OneNand控制器
eSSD控制器
UART/USB控制器
(2)启动模式
OneNand启动(Mux/Demux)
Nand启动(支持8/16-Bit ECC)
SD/MMC启动(MMC4.3标准,兼容eMMC)
eSSD启动
UART/USB启动
安全启动模式支持:对除UART/USB 外的所有启动设备的BootLoader采用整体校验,安全秘钥值写在S5PV210内部,如果安全秘钥值没有写在S5PV210内部,则为非安全启动模式。三星在制造阶段就将安全秘钥值写入到了S5PV210内部。
第二启动模式支持:当第一启动模式(安全启动模式)失败后,就会试图从4 bit的SD/MMC通道2通过SD/MMC启动。
(3)iROM启动方式的优点
降低BOM(材料清单)成本
iROM启动支持从Movinand/iNAND/MMC/eMMC Card, eSSD设备启动,系统无需启动介质就可以启动,不需要像nor flash这样的启动设备。
改善读特性
采用iROM启动方式从nand flash启动时,S5PV210支持8/16-bit H/W ECC。但是16-bit ECC仅支持4KB 5cycle的Nand。
降低生产成本
能从其他启动设备烧录启动设备,无需Gang programmer烧录器。
(4)电路设计
使用OM引脚选择iROM启动设备
所有的S5PV210启动设备都可以从MMC通道2使用SD/MMC设备以第二启动方式启动。
OneNand 启动时,Xm0CSn4/NFCSn2/ONANDXL_CSn0信号必须有效。BL1代码段起始处必须是BL1的校验数据。
Nand启动时,Xm0CSn2/NFCSn0信号必须有效。BL1代码段起始处必须是BL1的校验数据。
SD/MMC/eMMC启动时,MMC通道0分配给第一启动模式使用,通道2分配给第二启动模式使用。BL1代码段起始处必须是BL1的校验数据。
UART启动使用串口端口2
二、iROM启动流程
S5PV210启动过程分为BL0、BL1、BL2三个阶段,S5PV210内部有96Kb的IRAM和64Kb的IROM。S5PV210启动过程如下图:
注释:其中 BL1 最大 16KB,BL2 最大 80KB
第一步:iROM初始化,初始化系统时钟、特殊设备控制寄存器和启动设备
第二步:iROM启动代码加载BL1(bootloader)到iRAM,在安全启动模式下iROM对BL1进行整体校验。
第三步:执行BL1,BL1加载BL2(剩余的bootloader)到iRAM,BL1将会对BL2进行整体校验。
第四步:执行BL2,BL2初始化SDRAM控制器,将OS下载到SDRAM
第五步:跳转到OS起始地址,进入系统
(1)BL0启动阶段
S5PV20 上电从 0 地址(iROM)开始 运行 Samsung 出厂时固化在里面的代码,这部分代码叫做 BL0(boot loader0),BL0 将执行如下操作:
在BL0阶段初始化的内容如下:
1、关闭看门狗
2、初始化icache
3、初始化栈(设置中断栈、SVC栈)
4、初始化堆
5、初始化块设备copy函数
6、初始化PLL和设置系统时钟
7、拷贝BL1到iram
8、校验BL1,如果校验失败,将从SD卡启动。
9、检查是否是安全启动模式
10、跳转到BL1的地址(0xD0020010)
解析:
首先简单的了解一下,iROM和RAM是什么意思?
iROM 是 Internal Read-Only Memory 的缩写,即 内部只读存储器。
RAM 是 Random-Access Memory 的缩写,即 随机存取存储器,数据掉电丢失。
==================================================
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。
RAM有两大类,一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。
DRAM分为很多种,常见的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等。
ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是,PROM是一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了,而EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器。另外一种EEPROM是通过电子擦出,价格很高,写入时间很长,写入很慢。
==================================================
然后,从启动设备中拷贝前16K的代码到IRAM的0xD0020010处,即 BL1 的地址 0xD0020010。
这个地址很熟悉啊,在使用usb烧写的时候,我们用过的,参看:S5PV210开发 -- 通过 DNW、fastboot 烧写
当时有拷贝两个文件 x210_usb.bin 和 uboot.bin 分别拷贝到地址 0xd0020010 和 0x23e00000 处。
你有想过为什么是这个地址吗?
我们看一下 S5PV210 存储空间分配图。(芯片手册29页)
需要关注的是上图标出的两个地址,IRAM起始地址 0xD002_0000 和 DRAM 起始地址 0x2000_0000
然后看上图IRAM开始处包含 Header Info(头信息),所以 BL1开始地址是 0xD002_0010
我们再看 x210_usb.bin 和 uboot.bin 这两个文件大小
即 x210_usb.bin 为 BL1,其小于 16KB。再看 uboot.bin 大小为 300多 KB。如果当做BL2拷贝到 IRAM,很显然空间不够。所以我们实际的流程是:在 BL1 中初始化时钟、DRAM 控制器,拷贝 BL2 到外部 DRAM,跳转到 DRAM 中执行 BL2,BL2 加载 OS 到 OS 的起始地址执行 OS。
然后就有了操作 拷贝文件 uboot.bin 到地址 0x23e00000 处。
我们通过上面的存储空间分配图,可知DRAM 有两个通道的DRAM0起始地址为0x2000_0000,DRAM1起始地址为 0x4000_0000。你怎么知道它选的是哪个?
这个要看原理图了:
Xm1CSn0 和 Xm1CSn1 这两根片选信号线对应两个 DRAM 的地址,开发板的DDR2 SDRAM的片选信号接到了 Xm1CSn0引脚,所以它的访问地址为 0x2000_0000 开始的地址空间。
(2)安全启动模式(第一启动模式)的启动过程
解析:
结合之前将的系统的烧写更新,来看一下这个启动过程。
首先启动固化在IROM里的 BL0,它的作用:关闭看门狗、初始化icache、初始化PLL和设置系统时钟 等等这些上面已经有讲了。接下来通过OM[5:0] 来判断它的启动模式。
我买的开发板是烧写模式是 USB、SD卡烧写,启动模式为从 eMMC 启动。
我简单讲一下烧写更新的过程:
USB烧写:
拷贝 x210_usb.bin 到 0xd0020010 (IRAM)
拷贝 uboot.bin 到地址 0x23e00000 (SDRAM,掉电丢失)
nand更新:
将 uboot.bin 先拷贝到 0x20008000(SDRAM,掉电丢失) 命令: tftp 20008000 u-boot.bin
擦除 nand(nand的特性:要向Nand Flash中写数据之前,必须先擦除) 命令:nand erase 0 200000
最后将 uboot.bin从SDRAM的 0x2008000 烧写到 nand里,命令:nand write 20008000 0 200000
同理更新 内核、根文件系统。
这里就有点意思了,先将uboot拷贝到 0x23e00000,让开发板可以启动进入uboot。
然后再将uboot拷贝到 0x20008000,从这个地址烧写uboot到nand中。
我讲了这么多,就是想说明 SDRAM 是内存,它掉电丢失;nand 是硬盘,最终应将uboot、内核、根文件系统等烧写到这里面。将其复制到内存,最后进入系统。
所以完整的启动顺序应该是:
1.开机启动运行iROM(BL0)的固化代码
这里所做的事情就可以结合上面最左边的图和之前说的BL0做的一些事情,然后接下来程序跳到BL1的起始地址执行。
2.执行BL1代码
从图中可以看出它的主要作用就是将BL2从启动介质内复制到内部的SRAM中,并将程序将要运行的地址转向BL2首地址。
3.执行BL2代码
BL2做的就是先初始化SDRAM/DRAM,也就是内存,并把操作系统程序代码复制到内存中,然后程序调到内存中继续执行,整个过程完成。
(3)第二启动模式启动流程
解析:
举个栗子,SD/MMC/eMMC启动时,MMC通道0分配给第一启动模式使用,通道2分配给第二启动模式使用。
先看下原理图:
根据上图可以看出,MMC通道0分配给第一启动模式(iNand/eMMC)使用,通道2分配给第二启动模式(SD卡)使用。
根据上面的启动流程图,iROM开始;检查启动模式;从第一启动模式(iNand/eMMC)下载BL1;校验和是否0K;成功进入BL1;失败从第二启动模式(SD卡)下载BL1;校验和是否0K;成功进入BL1;失败从UART启动;UART启动再失败,从USB启动;如果USB启动再失败的话,则停止启动。
分析完以后,也就很好的解释了,为什么通过SD烧写时,首先要破坏iNand中的bootloader以从SD2启动了。
三、总结
最后,还是要说一下 BL1、BL2 和 uboot 的关系。
通过USB烧写过程分析,如果说 x210_usb.bin 为 BL1,那么它拷贝到SRAM后,下次再启动就掉电丢失了。
所以它应该是起到一个引导作用,然后可以将 uboot 拷贝到SDRAM 中。
更新的时候是将uboot烧写到nand中,然后将uboot下载到SDRAM中,进入系统。
那么此时的 uboot 的哪部分相当于 BL1,哪部分相当于 BL2呢?
这个等讲到 uboot 再好好研究一下。
参看:x210v3开发板u-boot-2012.10移植之补充篇---uboot启动流程详解
参看:uboot学习之三-----uboot启动第一阶段--start.S之一
参看:S5PV210的启动过程
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78433564