开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

前言与总结

这里说的SD卡启动方式,指的是uboot在SD卡中或者在inand里,且启动介质拨码开关选择SD卡启动方式(对于X210,是拨到远离电源键的一侧)。

uboot在SD卡的分布情况,通过将uboot烧写至SD卡的脚本可以大略知道,即uboot.bin的前16KB位于SD卡的扇区1~32,整个uboot.bin位于SD卡第49扇区开始的地方。

通过(利用fastboot将uboot镜像烧写到inand中的)操作可知,uboot在inand中仅有一个完整的镜像,不像uboot在SD卡中那样有两段且分开。我猜想,uboot也是放在inand的第1个扇区开始处。

但uboot在SD卡还是在inand中,本质应该没什么不同。因为无论uboot在SD卡还是在inand中,BL0都会从它们的第1扇区读取uboot的前16KB内容(也就是BL1)到SRAM中运行。而BL1会初始化DDR,DDR初始化之后,uboot在SD卡和在inand中,两者的区别才表现出来。当uboot位于SD卡时,BL1会从49扇区处将整个uboot拷贝至DDR中,然后利用ldr pc, =main这种远跳转方式,从SRAM中运行的BL1跳转到DDR中运行的BL2。当uboot位于inand中时,BL1是怎样操作的呢?这个应该需要了解uboot的启动过程,这里暂时不表。

1、三星推荐的启动方式

三星推荐将BL1放在SRAM中运行,将BL2也放在SRAM中运行,这意味着bootloader必须大于16KB且小于96KB。推荐即建议,但不一定要遵照。

三星推荐的启动过程

假定bootloader为80KB,则三星推荐的启动方式如下:

(1)开机上电后BL0运行,BL0会从外部启动设备(SD卡或者inand)的第1扇区处,读取bootloader的前16KB(也就是32个扇区)作为BL1加载到SRAM中运行。这是iROM中的BL0规定的,是写死的,第一步必须如此。

(2)BL1运行时,会将BL2(bootloader中80-16=64KB)加载到SRAM(SRAM中第16KB处)中运行。这是三星推荐的方法,但实际上我们没有遵循,而是在BL1中就完成DDR的初始化,并将BL2拷贝到DDR中,而不是拷贝到SRAM中,uboot就是如此。

(3)BL2运行时会初始化DDR,并且将OS搬运到DDR,然后去执行OS,启动完成。

这个过程示意图如下。

2、分散加载启动方式

分散加载的含义

如果文件大于16KB(只要大于16KB,哪怕是17KB,或者是700MB都是一样的),则需要将整个文件分割成两个独立的部分BL1和BL2,其中BL1小于等于16KB,BL2为任意大小,然后分别烧录到sd卡的不同扇区。注意,BL1在SD卡中必须从Block1开始(这个是三星官方规定的),我们定BL1为16KB(也就是32个block),则BL2理论上可以从33扇区开始,但实际上会留一些空扇区作为隔离,比如可以从45扇区开始,并根据BL2的大小来分配长度。

其中BL1在SRAM中运行,它负责将DDR初始化,然后将BL2从SD卡中加载到DDR中,然后在BL1最后(使用地址)强制跳转到BL2所在的地址,转而执行BL2。这种启动方式就叫做分散加载。

注意,DDR初始化好之后,整个DDR都可以使用了,这时在其中选择一段长度足够存储BL2的DDR空间即可,这里我们选0x23E00000,因为我们的BL1中只初始化了DDR1,地址空间范围是0x20000000~0x2FFFFFFF。

BL1和BL2其实是2个独立的程序,链接时也是独立分开链接的,因此不能使用ldr pc, =main这种通过链接地址的方式跳转到BL2。但是可以使用地址进行强制跳转,因为BL1知道BL2将被加载到哪个地址,所以BL1最后直接去执行这个地址即可。这种启动方式实现的例子,见在x210开发板上进行裸机开发的细节中第8点。

S5PV210内置的SD卡拷贝函数

因为BL0中的代码规定到SD卡第一扇区去读取BL1,所以BL1肯定得位于SD卡第一扇区开始的地方。BL2放在SD卡适当的扇区位置就好,因为(BL1将BL2从SD卡拷贝到DDR的)函数中,有一个参数表示BL2放在SD卡哪个扇区,另外一个参数表示读取多少个扇区,还有一个参数表示拷贝到DDR哪个位置,因此我们可以通过传参来设置BL1从SD卡哪个扇区读取BL2,读取多少扇区,读取到DDR哪个位置。并根据这些传参,我们可以修改(将uboot烧写至SD卡的脚本)write2sd文件烧写SD卡的哪个扇区,修改链接脚本中的链接地址。

那么BL1将BL2从SD卡拷贝到DDR的函数,是怎么来的呢?其实它是调用iROM中BL0内置的SD卡拷贝函数(通过函数指针方式来调用),这个函数的地址是0xD0037F98。当初BL0也是利用这个SD卡拷贝函数,将BL1从SD卡加载到SRAM中运行的。

分散加载的缺陷

第一,代码完全分2部分,完全独立,代码编写和组织上麻烦。

第二,无法让工程项目兼容SD卡启动和Nand启动、NorFlash启动等各种启动方式。

3、uboot的SD启动方式

uboot在sd卡的烧写情况

uboot一般大于200KB。将uboot烧录到SD卡时,先截取uboot.bin的前16KB(推荐截取这么大,因为这样就和三星推荐的一致,但实际脚本截取的是8KB)烧录到SD卡的扇区1~32(三星规定BL1必须烧写到SD卡的扇区1开始处),然后将整个uboot烧录到SD卡的某个扇区(比如49扇区)。

与分散加载的异同

由此可知,代码仍然分成BL1和BL2两部分,但是uboot是作为一个整体来组织。

这种方式能够兼容各种启动方式。

uboot的启动过程

(1)上电后BL0运行,BL0从SD卡扇区1开始读取16KB内容到SRAM中。尽管实际脚本截取8KB作为BL1烧写到SD卡,但我猜想,BL0还是会拷贝16KB到SRAM中,因为IROM中的BL0代码规定拷贝大小是16KB。

(2)BL1运行时会初始化DDR,然后从SD卡的49扇区开始拷贝整个uboot到DDR中,然后利用ldr pc, =main这种远跳转方式,从SRAM中运行的BL1跳转到DDR中运行的BL2。

(3)uboot启动后在uboot命令行中去启动OS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用iBATIS3.0完成增删改查

为什么80%的码农都做不了架构师?>>> 使用iBATIS3.0完成增删改查 iBATIS3.0和以前的版本有一些改变,不过学过以前版本的再学习3.0应该不是太难,3.0要求JDK1.5支持,因为其中增加了注解和泛型,这些都是JDK1.5…

oracle-11g-R2监听文件配置

客户端连接oracle数据库时出现如下错误: Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor 首先看看Oracle服务是否开启: 然后找到listener.or…

【C】strcpy()需谨慎使用;

大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #define MAX 204 5 int main(void)6 {7 char a[MAX]"abc";8 char b[MAX]"abcdefghi"…

多重指针操作

之前对多重指针操作心存忐忑&#xff0c;不能很熟练使用&#xff0c;本质原因是不了解其实质&#xff0c;因此对其进行了学习。 一、简单的代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h>void myArray(char ***p2, int num) {int i0;…

嵌入式Linux系统的构成和启动总结

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、嵌入式Linux系统典型结构 Flash划分成以下4个区&#xff1a; &#xff08;1&#xff09;Bootloader区。存放的是Bootloader&#xff0c;它负责嵌入式系统最初的硬件初始化、驱动和内核加载。 &#xff08;2&…

根文件系统的简介

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、文件系统 文件系统是对一个存储设备上的数据进行组织的机制。这种机制有利于用户和操作系统的交互。 尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如…

函数指针的使用

在学习群里看到的一个程序&#xff0c;基本说明了函数指针的用法。就摘录如下&#xff1a;

CreateThread和_beginthread的区别

1.程序&#xff1a;程序构成&#xff1a;(1)源代码(2)可执行的二进制代码程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。由操作系统加载其可执行的二进制代码&#xff0c;分配相应的数据结构&#xff1a;进程控制块PCB(Proces…

冒泡排序 Bubble Sort

冒泡排序 冒泡排序的过程很简单&#xff0c;就是不断比较相邻两个元素的大小关系&#xff0c;若逆序则交换之&#xff0c;这样通过一轮的比较&#xff0c;关键字最大的记录就沉底了。 一般地说&#xff0c;第i趟冒泡排序是从第一个元素起到第n-i1个元素依次比较相邻两个记录的关…

从源码到可执行程序的步骤

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理&#xff0c;以及网页http://mp.weixin.qq.com/s/_iVrUtA-jgE8XAR-vKYcww的学习整理。如有侵权&#xff0c;请告知删除。 一、总结 从源码到可执行程序的步骤&#xff1a;预编译、编译、汇编、链接。前三个宏观上为编译&…

win设置壁纸

默认壁纸图片位置&#xff1a; C:\Windows\Web\Wallpaper\Scenes 你可以自己建文件夹&#xff0c;放自己喜欢的桌面壁纸。 设置壁纸&#xff1a; 桌面右键 -> 个性化 然后点击 “桌面背景” -> 可以点击标题选择其下面的所有图片&#xff0c;也可以按 ctrl 选择你想要的…

物理机安装ESXI6.7提示No Network Adapters的解决方案

下载好ESXI6.7.iso镜像&#xff0c;写入U盘后&#xff0c;提示No Network Adapters&#xff0c;找不到网卡驱动。 解决办法&#xff1a;需要重新封装ESXI&#xff0c;将对应的网卡驱动嵌入进来。 1、先下载VMware-PowerCLI-6.5.0和ESXi-Customizer-PS&#xff1a; http://down.…

mysqlslap详解--MySQL自带的性能压力测试工具(转)

本文的参考博客地址为&#xff1a;https://blog.csdn.net/fuzhongfaya/article/details/80943991 和 https://www.cnblogs.com/davygeek/p/5253830.html 本文的目的一方面是自己整理&#xff0c;防止后续忘记&#xff0c;一方面是对参考博客的进行验证. 首先在这里介绍一下常用…

Android Gallery控件使用方法详解

我们今天给大家讲的就是Gallery控件&#xff0c;这个控件在android当中是非常重要的&#xff0c;我们今天就给大家介绍一下3D的Gallery控件是怎么样来实现的。下面我们就来直接看看代码吧。 1.扩展Gallery&#xff1a; public class GalleryFlow extends Gallery { private Cam…

javax.servlet.jsp.JspTagException:

2019独角兽企业重金招聘Python工程师标准>>> Illegal use of <when>-style tag without <choose> as its direct parent 这个错误一般是在jsp页面中非法使用<when>标签 该标签必须是<choose>标签的直接子标签 不能单独是<when>标签 …

c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序

1、继承的概念 2、继承中&#xff0c;构造函数和析构函数的先后顺序

结对开发:电梯调度(2)

组员&#xff1a;赵天 李金吉 分工&#xff1a;赵天&#xff1a;概要设计与编码。 李金吉&#xff1a;详细设计与调试。 界面&#xff1a; 详细代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Sys…

c++远征之继承篇——继承方式

以下内容源于慕课网&#xff0c;系学习整理而成&#xff0c;如有侵权&#xff0c;请告知删除。 1、公有继承 2、保护继承 3、私有继承

VMware vCenter Server6.5安装及群集配置介绍

借助 VMware vCenterServer&#xff0c;可从单个控制台统一管理数据中心的所有主机和虚拟机&#xff0c;该控制台聚合了集群、主机和虚拟机的性能监控功能。 VMware vCenterServer 使管理员能够从一个位置深入了解虚拟基础架构的集群、主机、虚拟机、存储、客户操作系统和其他关…

[JS性能优化专篇]

为什么80%的码农都做不了架构师&#xff1f;>>> 参考文章&#xff1a;了解 JavaScript 应用程序中的内存泄漏 旧版本的IE和Firefox都存在内存泄漏的问题&#xff0c;而且会一直持续到浏览器关闭。现在可以使用 Google Chrome 中的 Heap Profiler 来诊断内存问题。 …