博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第0部分:S5PV210_大概的启动过程_1
阅读量:5338 次
发布时间:2019-06-15

本文共 2192 字,大约阅读时间需要 7 分钟。

S5PV210大概的启动过程

1.大体的启动过程如下:

第零步:设置OM PIN引脚,就可以选择启动方式了,譬如从SD卡启动,emmc启动,norflash启动等等,我们这里假设从SD卡启动。

第一步:IROM内的代码(BL0)对SOC进行初步的初始化工作

第二步:从SD卡中复制BL1到SOC内的SRAM,执行BL1内的代码

第三步:从SD卡中复制BL2到SOC内的SRAM,执行BL2内的代码(作用:初始化SDRAM控制器,那样我们就可以用DDR内存了)

第四步:把我们的操作系统OS复制到SDRAM中

第五步:我们在BL2中进行一个长跳转,跳转到SDRAM中去执行程序,这样我们整个启动过程就完成了。

2.大体流程的具体实现过程

(0)设置OM PIN引脚,选择启动的介质(图为部分截取)

  从图上我们可以看到,只要我们的OM[0-5]设置为:100000或000000(1代表的就是供电,0代表接地)的时候,我们就选择了essd介质的启动方式

当我们OM[0-5]设置为:001100或者101100的时候,我们选择的就是SD/MMC的模式。这就看你需要什么启动方式了。

  我的开发板(九鼎X210)支持SD卡启动和USB启动:

  SD卡启动:001100或者101100

  USB启动:1XXXX1(x表示没有)

  所以,我们在切换的时候,只需要在SD卡的基础上进行改动(因为OM[1-4]位为什么并不影响USB启动的),拨动引脚OM5就可以了,OM为1就是USB启动,OM为0就是SD卡启动。

(1)IROM代码所做的工作

第一步:关看门狗

第二步:初始化iCache

第三步:初始化栈区域

第四步:初始化堆区域

第五步:初始化块设备拷贝功能

第六步:初始化PLL并设置系统时钟

第七步:检查OM PIN引脚,看看从哪种介质(如SD/MMC)中复制BL1到SRAM,这里就和第零步的工作相照应了,选择了启动方式了

第八步:检查BL1中的checksum,如果checksum失败,就尝试以第二种启动方式启动(SD/MMC 通道2)

第九步:检查是不是安全模式启动(这步比较少应用)

第十步:跳到BL1的起始地址去执行程序

以上就是IROM所做的工作。具体的图示如下:

  从上图我们可以看到,我们的启动凡事可以有6种,找到启动方式后,就从那介质中复制BL1到SDRAM中,然后执行BL1,,执行完BL1之后,查看它是不是唤醒状态,不是就载入BL2到SRAM中,然后就不是安全模式,就跳转到BL2执行,然后判断是不是唤醒状态,不是就开始初始化DRAM了,然后就把操作系统OS载入到DRAM中,之后就跳转到DRAM中去了,然后就是操作系统启动了。(这里就是后面步骤的示意图了)

第二种情况:我们的第一种启动方式不成功,进入到第二种启动方式去执行程序的过程。

  从上图我们可以看到:第一种启动方式失败之后,就会跳转到第二种启动方式,然后检查checkSum(校验和),如果正常的话,就跳转到从第二种启动介质里面复制过来的BL1去执行,如果不正常,就跳转到了串口启动的方式去执行,串口成功的话,那就跳转到串口上传过来的BL1去执行,还是不行的话,就跳转到USB启动的方式去执行,可以就跳转到USB下载下来的BL1执行,还是不行的话就是启动失败了。

最后:我们的文档还涉及了一些其他的具体的内容,如:USB/UART启动模式(注意:UART模式启动的时候,只是支持UART2这个接口,我们不要接错了)的设置的一些内容,还有SRAM内存映射的区域,还有从SD卡等内存介质中复制BL1到SRAM中需要用到的一些函数,还有一些时钟设置的内容。

因为进行裸机实验的时候,需要用到USB启动的方式,还有后面的SRAM内存映射的一些内容,所以下面就顺带介绍一下这些内容。

首先是:USB启动模式

1.我们可以使用DNW工具,看看我们的USB是否接好(看到上面的USB:OK字样)

2.设置好具体的值:波特率是115200,你用的是哪个COM端口,就设哪个COM端口,具体的COM端口可以看右键我的电脑->管理->设备管理器->usbdnw处

3.下载具体的程序就好了

注意:因为我们的UART/USB启动模式都不需要头校验的,所以,我们的下载地址是:0xD0020000,像SD卡那些的,需要头校验和的,他们的下载地址就是:0xD0020010

接下来就是:SRAM的内存映像了

看着这个图:我们就知道了我们的下载地址为什么是0xD0020000和0xD0020010了,因为SRAM的头地址就是这些。

Exception Vector Table:中断异常向量表

Heap:堆,申请堆的时候,在这里申请

Global Variable:全局变量放在这里

IRQ stack:中断模式下的栈

SVC stack:SVC模式下的栈,我们平时就是SVC模式下的,所以我们说的设置栈的时候,就是设置这里的栈

参考资料:朱老师物联网大教程

参考的IROM数据手册的翻译博客:http://blog.csdn.net/a627088424/article/details/9149671

转载于:https://www.cnblogs.com/nibuyaoni/p/5723634.html

你可能感兴趣的文章
struts2.1笔记05:struts2开发环境的搭建
查看>>
GUI编程笔记(java)11:使用Netbeans工具进行GUI编程
查看>>
函数名可以作为函数的返回值
查看>>
C代码中如何调用C++ C++中如何调用C
查看>>
webx学习
查看>>
eclipse导出可供项目引用的jar
查看>>
(16)JavaScript的流程控制(js的循环)
查看>>
java之equals()和hashCode()方法
查看>>
十进制转换为二进制(一直不会算的)
查看>>
Linux源码编译安装php7.3
查看>>
CF997B Roman Digits
查看>>
CF786B Legacy
查看>>
PHP7.1安装xdebug
查看>>
HighCharts的.Net本地导出环境配置
查看>>
[bbk5398] 第96集 -第12章 -数据移植 02
查看>>
Swift 2.0 单例的用法
查看>>
C++知识点综述
查看>>
模板方法模式
查看>>
获取url参数
查看>>
python3-开发面试题(python)6.23基础篇(2)
查看>>