找回密码
 立即注册
Qt开源社区 门户 查看内容

嵌入式开发板上电启动过程详解

2019-10-25 16:09| 发布者: admin| 查看: 3764| 评论: 0

摘要: 大家知道S5PV210采用的是ARM CortexTM-A8内核,今天主要聊聊基于S5PV210的开发板上电启动过程。1、启动介质作为嵌入式系统的启动介质,需要满足以下2个条件,① CPU可通过地址总线访问② 上电后CPU可直接使用,无需 ...
大家知道S5PV210采用的是ARM CortexTM-A8内核,今天主要聊聊基于S5PV210的开发板上电启动过程。

1、启动介质

作为嵌入式系统的启动介质,需要满足以下2个条件,

① CPU可通过地址总线访问

② 上电后CPU可直接使用,无需初始化

这是因为ARM在启动后,会将PC置为0,并开始取指运行。

2、启动过程中涉及的存储设备

A. 内存

① SRAM

容量小/价格高;但不需要初始化,上电后可直接使用

② DRAM

容量大/价格低;但上电后不能直接使用,需要软件进行初始化

B. 外存

① NorFlash类

容量小/价格高;但是和CPU总线式连接,上电后CPU可直接读取

补充:目前也有其他接口的NorFlash,比如SPI NorFlash,以此节省引脚

② NandFlash类

类似硬盘,容量大/价格低;但是不能总线式访问,即上电后CPU无法直接读取,需要先对其初始化然后通过时序接口读写。

补充:NandFlash只能将1写为0,不能将0写为1。因此在NandFlash编程之前,必须将对应的块擦除,而擦除的过程就是把所有位都写为1的过程

说明1:根据对启动介质的描述,SRAM和NorFlash可以作为启动介质

说明2:存储设备的使用场景

单片机:内存需求量小,而且希望开发尽量简单,适合全部使用SRAM(e.g. 51单片机)。

PC机:内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部使用DRAM。由BIOS(一般为NorFlash)作为启动介质。

嵌入式系统:内存需求量大,而且出于成本考虑,目前的嵌入式系统大多没有NorFlash等可启动介质。通常使用NandFlash + DRAM,但二者均不能作为启动介质,所以需要SoC内置启动介质。

S5PV210就是采用iROM + iRAM作为启动介质

说明3:为了与启动介质区分,下文中在分析S5PV210启动过程中会采用“启动设备”一词。根据OM拨码管脚选择的启动设备,其实只是用于运行BL1,真正起始的BL0是在启动介质中运行完成。

3、启动设备选择



说明1:S5PV210通过OM拨码开关选择启动设备,我们可以以OK210的启动方式来验证。OK210启动拨码设置如下,



OK210将OM[5]焊接连接低电平,不支持从UART/USB启动。

OM[4 : 1] = 0010对应Nand 4KB,5Cycle

OM[4 : 1] = 0110对应SD/MMC

注意:这里的SD/MMC正常启动必须使用MMC channel 0,如果MMC channel 0已被占用,则实际是使用MMC channel 2实现2nd boot(OK210 & X210的SD卡均使用了channel 2,即均作为second boot使用)

说明2:当OM[5] = 1时,会首先从UART/USB启动,X210就使用这种拨码方式 + dnw进行裸机代码的调试。

4、iROM(BL0)启动流程

注:该流程为三星的推荐流程,Uboot等bootloader并不一定完全遵循





说明1:BL0初始化只涉及SoC的内部资源有2个原因

① 使用S5PV210芯片的板载资源千差万别,BL0只能初始化SoC内部资源

② BL0的目的是加载BL1并运行,所以只需要初始化会使用到的设备

说明2:BL0初始化后的iRAM内存布局



注意上图中的Header Info,后文会详细说明

说明3:BL1的下载地址和运行地址

在非UART/USB启动模式下,BL0会从存储设备中拷贝16KB数据到0xD0020000处,然后进行校验。校验成功后,从0xD0020010处运行。

也就是说从0xD0020000处开始的16B为校验数据,如果从UART/USB启动,因为无需校验数据,所以直接下载到0xD0020010处运行即可。

说明4:关于Block Device Copy Function



性质:由三星提供,相当于硬件附带的库函数

用途:用于从块设备上拷贝数据到内存(e.g. 将BL1 / BL2从eMMC拷贝到内存)

使用方法:直接对函数对应的地址进行类型转换



说明5:BL0初始化后的系统时钟



5、完整启动流程框图



说明1:BL1/BL2大小限制

BL1最大16KB

BL2最大80KB

说明2:BL1的Header Info



根据整体启动流程,BL0会检查BL1的checksum。注意检查checksum与Secure Boot是两回事,Secure Boot会使用到signature区域。而且BL1加载BL2后不会检查checksum。



因为有了16B的Header Info,BL1代码的实际起始地址为0xd0020010

说明3:checksum的计算方式



说明4:在启动的各个阶段,都会判断系统是启动过程还是从睡眠中被唤醒。如果是从睡眠中被唤醒,将跳过本阶段直接跳转到下个阶段。

6、S5PV210加头文件说明

mkv210_image.c核心步骤如下:



① 分配16KB的buffer

② 将源文件(e.g. led.bin)读到buffer的第16B开始处

③ 计算校验和并将校验和保存在buffer的8 ~ 11B处

④ 将16KB的buffer拷贝到目标文件(e.g. 210.bin)

说明1:BL1的长度不能超过16KB - 16B,如果超出将被截断

说明2:虽然读取到Buf中的BL1可能不足16KB - 16B,但是计算checksum时是按照16KB -16B进行计算,计算的素材就是Buf中的内容。而且在构造Header info时也只写入了checksum字段,并没有设置BL1 size字段。



由此可以推断,S5PV210在启动阶段加载BL1时,默认就是加载16KB。

7、关于Second Boot support



说明1:S5PV210为所有启动设备都提供了2nd boot device,该设备指定为SD/MMC channel 2 with 4-bit data

说明2:何时进入2nd boot

只在BL1 checksum校验失败时进入

说明3:x210 SD卡启动说明

x210开发板板载inand使用SD/MMC channel 0启动,所以要想从SD卡启动需要满足2个条件,

① SD卡接在SD/MMC channel 2

② SD/MMC channel 0上的inand中的BL1必须被破坏,使其checksum校验不通过



说明4:SD卡启动的通常用途

SD卡启动一般用于开发板的出厂烧写eMMC。此时板载eMMC为空,通过从SD卡启动(实际时通过SD/MMC channel 2启动)可以实现对eMMC的烧写。

8、关于UART/USB启动

说明1:启动的先后顺序

当OM[5] = 1时,S5PV210会从UART/USB启动,但这是有先后顺序的。S5PV210会先尝试从UART启动,当UART启动超时时,才会从USB启动。

说明2:无需Header Info

从UART/USB启动时,无需Header Info

特别注意:使用dnw下载裸机代码时,地址为0xD0020010,且代码无需加头。

实际测试:USB/UART启动时程序直接从0xD0020010开始运行;使用其他存储设备启动时其实也是从0xD0020010运行,只不过运行前需要先对0xD0020000起始的16B进行校验。

也就是说x210使用的dnw工具的行为是,可下载到指定地址,但均从0xD0020010开始运行

已上机验证,下面记录验证过程(该验证基于Linux版本dnw):

step 1:点灯原始代码测试

点灯原始代码如下,



① 当程序下载到0xD0020010时,可以将LED点亮

② 当程序下载到0xD0020000时,LED无法点亮

解释:程序下载到0xD0020000,但运行从0xD0020010开始(到此步骤,仍为假说~~)所以会越过4条ARM指令,即不会对GPJ进行设置。而这些管脚的默认值为Input模式,所以无法点亮LED。

step 2:点灯修改代码测试

点灯修改代码如下,



① 当程序下载到0xD0020000时,LED可以点亮

解释:人为在GPIO配置代码前添加4条ARM指令,正好16B。所以从0xD0020010开始运行时,可以执行到GPIO配置代码。

实验结果说明,USB/UART启动并不需要checksum,而且直接从0xD0020010开始运行。

9、启动设备布局要求



可见当启动设备为SD/MMC/eSSD时只能从第1个扇区开始烧写BL1;而Nand和eMMC可以直接使用第0个扇区。

补充:SD卡启动时烧写程序命令说明

sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1

① dsync是指定读写文件时采用同步方式,不使用缓存/缓冲

② /dev/sdb就是SD卡的设备文件名

③ seek=1是指SD卡的第一个扇区

SD卡的起始扇区为0,一个扇区的大小为512B。从SD卡启动时,iROM中固化的代码会从扇区1开始拷贝16KB数据到iRAM中并校验运行。

*本文涉及参考文档:

S5PV210_iROM_ApplicationNote

欢迎扫码关注,一起学习Linux




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:嵌入式Linux技术分享,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了