[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
建议参考文档:
S5PV210-iROM-ApplicationNote-Preliminary-20091126
S5PV210_UM_REV1.1
项目介绍参考
[project X] tiny210 操作说明
===================================================================
零、说明
本文主要以友善之臂的tiny210板子作说明,使用的是s5pv210核心。
主要集中于以下几个问题:
* 支持哪些存储介质?
* 上电之后的启动流程?分成了几个阶段?具体负责什么功能?
* 各个阶段使用的存储介质是什么?原因?
* 各个阶段的运行地址是什么?
* 镜像存放可能存放在几种存储介质中,如何判断要从哪种存储介质中获取镜像?(也就是启动模式)
本文只介绍non secure boot的情况。也就是说不是在secure环境下,无需做签名处理。
一、和启动相关的硬件介绍
1、可运行存储介质
要先理解一点,运行介质都会在CPU的地址空间上,占用地址空间的一部分。CPU可以根据寻址地址从运行介质从读取一条指令或者一条数据,而并不是说直接在运行介质上执行。
- IROM
ROM(Read Only Memory),唯读记忆体。ROM数据不能随意更新,但是在任何时候都可以读取。主要用于存放一些固定的不需要修改的代码或者数据。掉电之后,数据还可以保存。
IROM则是指集成于芯片内部的ROM. - SRAM
SRAM(Static Random Access Memory),即静态随机存取存储器。它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。- 优点,速度快,不必配合内存刷新电路,可提高整体的工作效率。初始化简单。
- 缺点,集成度低,掉电不能保存数据,功耗较大,相同的容量体积较大,而且价格较高,少量用于关键性系统以提高效率。
- SDRAM
由General SDRAM and Controller进行控制。
SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。相对于SRAM来说,体积较小且价格偏移。
三者差异简单归纳如下表:
可运行存储介质 | 掉电数据保存情况 | 数据修改 | 访问速度 | 动态刷新电路 | 价格 |
---|---|---|---|---|---|
ROM | 掉电数据保存 | 不易修改 | 最慢 | 不需要 | 最便宜 |
SRAM | 掉电数据丢失 | 可以修改 | 最快 | 不需要 | 最贵 |
SDRAM | 掉电数据丢失 | 可以修改 | 快 | 需要 | 便宜 |
补充说明
综上,因为BL0是上电启动代码,固定不变的,所以将其固化在IROM中运行。
因为SRAM是集成在平台内部,BL0阶段之后可以直接使用,但是size比较小。
而SDRAM需要根据外围DDR进行初始化,BL0之后还无法使用,需要在BL1中进行初始化之后才能使用。
故BL1放在SRAM中运行,BL2放在SDRAM中运行。
后续会继续说明。
2、存储介质
- SD/MMC/eMMC
- nand flash / nor flash / OneNand flash
- eSSD
3、tiny210运行介质和存储介质说明
首先看一下对应s5pv210平台和存储相关的硬件支持
- 64KB的IROM
- 94KB的内部SRAM
- 通用SDRAM控制器,用于控制SDRAM
需要外部实现SDRAM. - 4/8位高速SD/MMC控制器,用于控制4-bit SD / 4-bit MMC / 4 or 8-bit eMMC
需要外部实现SD/MMC/eMMC - Nand Flash控制器,用于控制nand flash
需要外部实现nand flash - OneNand控制器,用于控制OneNand flash。
需要外部实现OneNand flash - eSSD控制器,用于控制eSSD
需要外部实现eSSD - UART/USB控制器
在s5pv210的基础上,对应tiny210板子上有如下外围硬件:
* 512MB的DDR支持
* 1GB的nand flash支持(K9K8G08U0B)
* SD card接口支持,可以直接支持SD card
综上,tiny210板子上有如下存储介质:
- 64KB的IROM
- 94KB的内部SRAM
- 512MB的DDR
- 512MB的nand flash支持
- SD card(自己插了一个4GB的SD卡)
二、s5pv210 上电启动的几个阶段
注意:以下介绍的启动流程和官方给的启动流程《S5PV210-iROM-ApplicationNote-Preliminary》有所差异,是实际上我在项目中使用的启动流程,也是比较通用的启动流程。
和官方文档中比较大的差异在于,BL2在下面介绍是放在SDRAM中运行,而官方文档《S5PV210-iROM-ApplicationNote-Preliminary》中则是放在IRAM中运行,因为编出来的uboot过大,超过了限制,所以官方文档是不可行的。
1、BL0
运行在IROM上!!!
加载说明
上电后启动的第一个阶段。其代码固化在s5pv210的IROM中,也就是出厂后已经完成,无法进行修改。上电后CPU会直接从IROM上的BL0的代码上开始执行。主要工作有:
- 初始化系统时钟、特殊设备的控制器、启动设备、看门狗、堆栈、SRAM等等
- 验证BL1镜像
- 从存储介质上(比如SD\eMMC\nand flash)或者通过USB加载BL1镜像到对应内部SRAM上
- 跳转到BL1镜像所在的地址上
2、BL1
运行在内部SRAM上!!!
- 加载说明
上电后启动的第二个阶段。BL0阶段会将其镜像或者代码从存储介质上(比如SD\eMMC\nand flash)上加载到内部SRAM上. - 主要工作有:
- 初始化部分时钟(和SDRAM相关)
- 初始化DDR(外部SDRAM)
- 从存储介质上(比如SD\eMMC\nand flash)将BL2镜像加载到SDRAM上
- 验证BL2镜像的合法性
- 跳转到BL2镜像所在的地址上
3、BL2
运行在外部SDRAM上!!!
- 加载说明
上电后启动的第三个阶段,BL1阶段会将其镜像或者代码从存储介质上(比如SD\eMMC\nand flash)上加载到外部SDRAM上. - 主要功能
BL2就是指传统意义上的bootloader,也就是我们这里的uboot的主体,负责flash操作、uboot命令操作等等,并且最终目标是加载OS和启动OS,如linux。关于uboot的实现,会在后面具体分析,这里不详细说明。
上电到BL2的流程图如下(略过BL2的流程部分)
三、各个阶段在地址空间上的运行位置
1、s5pv210地址空间
参考《S5PV210_UM_REV1.1》 2.1 MEMORY ADDRESS MAP
s5pv210整体地址空间映射表如下:
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0x0000_0000 | 0x1FFF_FFFF | 512MB | Boot area(取决于启动模式) |
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
0x4000_0000 | 0x7FFF_FFFF | 1024MB | DRAM 1 |
0x8000_0000 | 0x87FF_FFFF | 128MB | SROM Bank 0 |
0x8800_0000 | 0x8FFF_FFFF | 128MB | SROM Bank 1 |
0x9000_0000 | 0x97FF_FFFF | 128MB | SROM Bank 2 |
0x9800_0000 | 0x9FFF_FFFF | 128MB | SROM Bank 3 |
0xA000_0000 | 0xA7FF_FFFF | 128MB | SROM Bank 4 |
0xA800_0000 | 0xAFFF_FFFF | 128MB | SROM Bank 5 |
0xB000_0000 | 0xBFFF_FFFF | 256MB | OneNAND/NAND Controller and SFR |
0xC000_0000 | 0xCFFF_FFFF | 256MB | MP3_SRAM output buffer |
0xD000_0000 | 0xD000_FFFF | 64KB | IROM |
0xD001_0000 | 0xD001_FFFF | 64KB | Reserved |
0xD002_0000 | 0xD003_7FFF | 96KB | IRAM |
0xD800_0000 | 0xDFFF_FFFF | 128MB | DMZ ROM |
0xE000_0000 | 0xFFFF_FFFF | 512MB | SFR region |
重点关注如下几个地址空间:
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0x0000_0000 | 0x1FFF_FFFF | 512MB | Boot area(取决于启动模式) |
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
0x4000_0000 | 0x7FFF_FFFF | 1024MB | DRAM 1 |
0xD000_0000 | 0xD000_FFFF | 64KB | IROM |
0xD002_0000 | 0xD003_7FFF | 96KB | IRAM |
2、BL0的运行地址
通过文档《S5PV210-iROM-ApplicationNote-Preliminary》位于如下区域
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0x0000_0000 | 0x0000_FFFF | 64KB | Internal ROM |
s5pv210上电之后,CPU会直接从0x0地址取指令,也就是直接执行BL0。
3、BL1的运行地址
上述已经说明BL1在IRAM中运行,IRAM空间如下:
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0xD002_0000 | 0xD003_7FFF | 96KB | IRAM |
但是并不是说整个IRAM都是给BL1使用的。
BL1使用的部分如下:
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0xD002_0000 | 0xD003_5400 | - | BL1代码空间 |
BL1镜像最大为16KB。
这里有一个注意事项:
BL1是加载在0xD002_0000的位置上(不包括USB启动的方法),并不是说BL1就是从0xD002_0000开始运行的。0xD002_0000开始的16B是用于作为BL1的header。BL1代码的实际运行地址是0xD002_0010
这部分header是用来给BL0验证BL1的镜像的有效性使用的。16B的header格式如下:
地址 | 数据 |
---|---|
0xD002_0000 | BL1镜像包括header的长度 |
0xD002_0004 | 保留,设置为0 |
0xD002_0008 | BL1镜像除去header的校验和 |
0xD002_000c | 保留,设置为0 |
当从存储介质上加载BL1镜像的时候(非UART/USB模式),需要校验这个header和BL1的镜像是否匹配,后续启动模式中会继续说明。
4、BL2的运行地址
上述已经知道BL2在SDRAM的地址空间中运行,SDRAM空间如下:
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
0x4000_0000 | 0x7FFF_FFFF | 1024MB | DRAM 1 |
tiny210的ddr是512M并且使用的是DRAM0的地址空间,故BL2的运行空间是
起始地址 | 结束地址 | 长度 | 映射区域描述 |
---|---|---|---|
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
但是在实际使用中,我把uboot加载到了ddr上0x23E0_0000(具体参考CONFIG_SYS_TEXT_BASE的定义)的地址上。
===========================================
综上所述,各个阶段的运行地址如下:
阶段 | 运行地址 |
---|---|
BL0 | 0x0000_0000(固定) |
BL1 | 0xD002_0010(固定) |
BL2 | 0x3000_0000(可在代码中进行修改) |
四、启动模式(如何将对应BL1加载到对应RAM上面)
在上述中,我们知道BL0负责将BL1的镜像加载到对应的地址上。
那么,有一个问题,BL1的镜像可能存放在SD卡,eMMC,Nand flash等存储介质上,也有可能是直接通过USB上写入到对应RAM的地址上。那么,BL0如何判断要从哪里去加载BL1的镜像呢,这就取决于启动模式了。
1、s5pv210支持的启动模式
OneNand Boot模式
在这种模式下,BL0会从OneNAND的page0开始加载,先加载16B的header到0xD002_0000,通过header中的size判断需要读取多少page,然后再加载剩余的page到0xD002_0010上。
最后计算除header外的数据的校验和,和header中的校验和比较,一旦匹配,则跳转到0xD002_0010。
因此,当我们选择这种方式的时候,需要给BL1的镜像加上16B的header,然后以OneNand page0位置开始存放整个镜像。Nand Boot (with H/W 8/16-Bit ECC)
在这种模式下,BL0会从NAND的page0开始加载,先加载16B的header到0xD002_0000,通过header中的size判断需要读取多少page,然后再加载剩余的page到0xD002_0010上。
最后计算除header外的数据的校验和,和header中的校验和比较,一旦匹配,则跳转到0xD002_0010。
因此,当我们选择这种方式的时候,需要给BL1的镜像加上16B的header,然后以Nand page0位置开始存放整个镜像。SD / MMC Boot
在这种模式下,BL0会跳过SD的block0,从SD的block1加载,先加载block1到0xD002_0000,通过header中的size判断需要读取多少block,然后再加载剩余的block。
最后计算除header外的数据的校验和,和header中的校验和比较,一旦匹配,则跳转到0xD002_0010。
因此,当我们选择这种方式的时候,需要给BL1的镜像加上16B的header,然后以block1位置开始存放整个镜像。eSSD Boot
在这种模式下,BL0会跳过eSSD的block0,从eSSD的block1加载,先加载block1到0xD002_0000,通过header中的size判断需要读取多少block,然后再加载剩余的block。
最后计算除header外的数据的校验和,和header中的校验和比较,一旦匹配,则跳转到0xD002_0010。
因此,当我们选择这种方式的时候,需要给BL1的镜像加上16B的header,然后以block1位置开始存放整个镜像。eMMC Boot
在这种模式下,BL0会从eMMC的block0加载,先加载block0到0xD002_0000,通过header中的size判断需要读取多少block,然后再加载剩余的block。
最后计算除header外的数据的校验和,和header中的校验和比较,一旦匹配,则跳转到0xD002_0010。
因此,当我们选择这种方式的时候,需要给BL1的镜像加上16B的header,然后以block0位置开始存放整个镜像。UART Boot
在这种模式下,BL0会检测串口数据,并且将其复制到0xD002_0000开始的位置。在PC侧通过DWN软件将镜像通过串口进行写入。
因为这种模式下不需要验证header,一旦下载完成之后,会直接跳转到0xD002_0000进入BL1。USB Boot
在这种模式下,BL0会检测USB数据,并且将其复制到0xD002_0000开始的位置。在PC侧通过DWN软件将镜像通过USB进行写入。
因为这种模式下不需要验证header,一旦下载完成之后,会直接跳转到0xD002_0000进入BL1。
几个模式的差异如下表格
模式 | 硬件支持 | BL1镜像存放起始位置 | BL1镜像是否需要header | 加载位置 | 跳转位置 |
---|---|---|---|---|---|
OneNand Boot | OneNand flash | page0 | 是 | 0xD002_0000 | 0xD002_0010 |
Nand Boot | Nand flash | page0 | 是 | 0xD002_0000 | 0xD002_0010 |
SD / MMC Boot | SD / MMC | block1 | 是 | 0xD002_0000 | 0xD002_0010 |
eSSD Boot | eSSD | block1 | 是 | 0xD002_0000 | 0xD002_0010 |
eMMC Boot | eMMC | block0 | 是 | 0xD002_0000 | 0xD002_0010 |
UART Boot | UART | 无 | 否 | 0xD002_0000 | 0xD002_0000 |
USB Boot | USB | 无 | 否 | 0xD002_0000 | 0xD002_0000 |
2、s5pv210选择启动模式的方法
s5pv210通过OM[5:0]这6个引脚的组合来选择对应的启动模式。
具体查看《S5PV210-iROM-ApplicationNote-Preliminary》表格Table4. iROM OM pin description
以下举几个常见的例子
启动方式 | OM5 | OM4 | OM3 | OM2 | OM1 | OM0 |
---|---|---|---|---|---|---|
SD BOOT | 0 | 0 | 1 | 1 | 0 | 0 |
Nand 2KB 5cycle (Nand 8bit ECC) | 0 | 0 | 0 | 0 | 1 | 0 |
Nand 4KB 5cycle (Nand 8bit ECC) | 0 | 0 | 0 | 1 | 0 | 0 |
Nand 4KB 5cycle (default)(Nand 16bit ECC) | 0 | 0 | 0 | 1 | 1 | 0 |
优先检测UART\USB模式 | 1 | - | - | - | - | - |
注意,当OM5用于决定是否先进入UART\USB模式。如果OM5为0,则直接进入OM[4:0]对应的模式中。
如果OM5为1,则先判断串口是否有响应(因此要进入该模式需要现在DNW软件上打开对应UART下载功能),有响应则进入UART模式,否则,超时,检测是否进入USB模式。
然后判断USB是否有相应(因此要进入该模式需要现在DNW软件上打开对应USB下载功能),有响应则进入USB模式,否则,超时,跳转到OM[4:0]对应的模式中。
3、tiny210支持的启动模式
通过tiny210的原理图《Tiny210-1305-Schematic》上看OM5\OM4\OM0均被拉低为0.而OM[3:1]则有拨码开关S2和反相器来控制其组合。
最终得到tiny210只支持如下两种启动方式
启动方式 | OM5 | OM4 | OM3 | OM2 | OM1 | OM0 |
---|---|---|---|---|---|---|
SD BOOT | 0 | 0 | 1 | 1 | 0 | 0 |
Nand 4KB 5cycle (default)(Nand 16bit ECC) | 0 | 0 | 0 | 1 | 1 | 0 |
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)相关推荐
- 【嵌入式】S5PV210的启动流程
S5PV210的启动流程 S5PV210上电后执行iROM中的固化代码,即BL0(Bootloader0).这个代码是厂家出厂前烧写好的,不提供源代码,但提供相应的功能说明,比如进行一些时钟初始化.设 ...
- ARM芯片上电启动流程
下图是大多数开发板所有的一个存储单元框架,接下来以此图为基础描述ARM芯片的上电启动流程. 我们首先来了解几个关键词: IROM (Internal ROM):芯片内部固化存储代码的存储器 IRAM ...
- S5PV210开发 -- 启动流程
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78433564 讲完启动模式.烧写更新,接下来我们看一下启动流程. 参看:S5 ...
- u-boot2013.01.01 for s5pv210: u-boot启动流程
转载请注明地址:http://blog.csdn.net/zsy2020314/article/details/9824035 1.关于启动流程 1.1 启动阶段分为3个,bl0,bl1,bl2.下面 ...
- Arm芯片上电启动流程剖解
关键字: stepping stone:(可以看做是Internal RAM) IROM (Internal ROM):固化在CPU内部ROM里的一段代码,它的运行叫做BL0. IRAM: 因为IRO ...
- S3C2440上电启动流程概述
一.S3C2440的启动方式 1.启动介质 S3C2440在上电时会通过判断OM0和OM1的信号组合来决定指令开始执行的位置(即引导ROM的位置),同时这两个信号也用于决定BANK0(nGCS0)的总 ...
- uboot流程——uboot启动流程
[uboot] (第五章)uboot流程--uboot启动流程 2016年11月07日 20:12:07 阅读数:2230 以下例子都以project X项目tiny210(s5pv210平台,arm ...
- [uboot] (第五章)uboot流程——uboot启动流程
以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程( ...
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
最新文章
- 人工智能领域的未来和挑战
- linux摄像头 sdl,Linux音视频(SDL与YUV)
- php课程 6-20 字符串基础和去除空格和字符串填补函数
- mysql 递归查找父节点_MYSQL递归查询,根据子类ID查询所有父类(最全)
- 2021宿州市地区高考成绩排名查询,2021年宿州市所有的高中排名,宿州市高中高考成绩排名出炉...
- html页面音乐播放器_Embed代码
- Ubuntu16.04 下 tensorRT安装
- 微信生态下的营销洞察
- 七步走 Angular.js 从菜鸟到专家 (系列列表)
- Ubuntu 无法获得锁
- lora终端连接云服务器_物联网通讯技术三足鼎立形成:NB-IoT、eMTC、LoRa各有千秋...
- 三分钟让面试官满意系列 - Bagging和Boosting 的联系及区别
- matlab sunlink工具箱,FreeBSD handbook Unix Basics
- redis常用操作-键的生存时间
- 4.19计算机网络笔记
- java输出孪生素数对数_最大的孪生素数证明
- cURL(wget)—— 测试 RESTful 接口及模拟 GET/POST/PUT/DELETE/OPTIONS 请求
- java迷题_Java——类谜题
- win7下dynamips类模拟器桥接到本地PC,但是无法ping通的解决办法
- 最优化方法:六、约束最优化方法