注:本文以 S3C2440 和 S5P6818为例,以S5P6818为主

1、三星 Steppingstone技术介绍

在介绍Steppingstone技术之前,需要先了解一下常用的Flash之间的区别,常见的有NOR Flash,NAND Flash,eMMC,SD等,具体有哪些区别自行百度科普,这里只需要知道烧写到NOR Flash中的代码可以直接运行,其他的都不可以。NOR Flash因为结构的原因,和SDRAM一样可以直接运行代码,也导致了NOR Flash的成本较高,显然不能满足大容量的需求,再以NAND Flash为例,容量大,但是代码不能直接运行,系统就不能启动。

所以有以下解决方案:

方案1:开发板同时设计有NOR Flash和NAND Flash,一部分代码运行在NOR Flash上,例如uboot,uboot运行之后初始化 NAND控制器 和 SDRAM,同时把用户代码重定向到SDRAM中运行,重定向就是把用户代码从NAND Flash或者其他存储设备中拷贝到 SDRAM中,至此整个系统就可以运行在SDRAM内存中。

方案2:大多数情况下,开发板中没有NOR Flash,只有一块NAND Flash或者eMMC,甚至是一张SD卡,那么程序是怎么运行的,这里就要说到三星的Steppingstone(垫脚石)技术。

SOC在上电后可以自动从Flash中拷贝一部分代码到SOC的片内SRAM,所以在这一部分的代码中,通常必须完成下面内容: 初始化CPU时钟,Flash控制器,SDRAM等,来实现代码重定位到内存中。

总结:Steppingstone技术就是SOC自动帮用户从Flash中复制一段代码到SOC片内SRAM中运行,完成代码重定向之后便跳转到SDRAM中运行用户程序。复制代码的大小取决于片内SRAM的大小,S3C2440 4KB,S5P6818 56KB

2、S3C2440启动流程

S3C2440支持NOR/NAND Flash,EEPROM启动,这里主要介绍 NOR Flash和NAND Flash

1)NOR Flash启动:

ARM CPU上电后通常从0地址开始执行,通常我们可以把负责启动的BootLoader(uboot)或者裸机开发中的程序烧写在NOR FLash中(此时NOR Flash的地址必须作为0地址),而把内核和文件系统放到NAND FLash中,由uboot从NAND Flash中加载到SDRAM。在这里提一下嵌入式Linux系统的大概流程 开发板上电→运行uboot→加载内核→挂载根文件系统(Linux挂载的第一个文件系统称为根文件系统)→启动应用程序。

2)NAND Flash启动:

由于代码不能直接在NAND Flash上运行,所以Steppingstone技术就闪亮登场了,CPU自动复制NAND Flash的前4K代码到片内SRAM中运行。在这4K代码中,完成了部分硬件初始化,所有代码的重定位和跳转到SDRAM,和NOR启动的区别就在于4K代码自动copy,还有重定位的是所有代码,这里为什么要重定位包括uboot在内的所有代码,原因就是4K内存太小,uboot的代码都放不下,只能执行uboot的一部分功能。完成重定位和跳转之后,垫脚石的使命就算是圆满完成。

思考:了解过Flash原理的,可能都会有这么一个疑问,NAND Flash不能像NOR 和 SDRAM 一样,通过地址线发送地址,在很短的时间内就会在数据线上得到数据,也就是NAND Flash不能直接访问,需要通过NAND 控制器,可是在CPU上电的一瞬间,压根没有程序运行,怎么配置NAND 控制器?

答案就是,通过外部引脚输入高低电平来选择参数,一些可以通过寄存器设置的则使用参数默认值,一般默认值即最安全的值,能够兼容大多数芯片。见下图所示

3、S5P6818启动流程

S5P6818支持的启动模式相比S3C2440来说就比较多了,内部ROM启动方式有带纠错的NAND启动、SD/MMC启动、SPI 串行 EEPROM启动、UART、USB,我所用的这一款开发板是8G的eMMC,但是如果只是裸板开发的话,这里我们使用SD卡烧写程序来演示裸板程序,同样你也可以把uboot 内核 文件系统都烧写在SD卡上来运行。

1)启动模式选择

在这么多的启动模式中,怎么选择启动模式?有了上面的S3C2440的介绍之后,相信大家已经有了一些想法,就是通过引脚配置高低电平来选择

选择了启动模式 SD MMC之后,那么问题来了,6818的SD/MMC控制器是支持3通道的,当前开发板上已经有了一块eMMC,此时如果我们想使用Micro SD卡来运行我们的裸板程序的话,怎么让CPU选择我们的SD卡?或者说在这三个通道中怎么选择想要的通道?

同样是通过配置引脚电平状态 ,见下图所示

CPU 会优先从SD0读取代码,读取代码失败后,则会转向下一个(SD2通道)。这里又有了一个疑问,CPU怎么知道读取的数据不正确呢,这里先简单说一下,具体后面还会涉及到,6818的boot代码是有格式要求的,在某一个位置的必须是一个指定的数据,否则就认为读取失败,转向下一个SD通道。

按照以上启动的要求,那么我们的板子就应该这么设计:eMMC接到SD2,Micro SD卡插槽接到SD0,确保Micro SD卡的启动优先级最高,方便我们的板子系统凉凉时,可以通过SD卡抢救。

2)SD/MMC启动流程

S5P6818内置了20KB的ROM,在SD/MMC启动模式中,0地址就指向了Internal ROM的入口,ROM中预置了代码能够支持多种启动方式,并且能够把用户代码从多种存储媒介中加载到内部SRAM(56KB)中,然后从SRAM中运行。

结合以上信息,启动流程大概分为这么几步:

1、开发板上电后,CPU从0地址开始执行代码,就是内部ROM的起始位置

2、内部ROM的代码首先要识别外部存储媒介是是什么类型,然后初始化相关的控制器

3、把前56KB代码拷贝到内部SRAM

4、通过设置PC跳转到内部SRAM的位置开始运行

5、执行硬件初始化,代码重定位等

4、总结

S3C2440和S5P6818这两款SOC都使用到了Steppingstone技术,都是CPU自动地帮用户执行一部分代码,不同的是,S5P6818使用到了IROMBOOT技术,能够支持的存储外设类型更多,相对来说流程也就更复杂,也许现在看来感觉两款CPU的启动流程差不多,要说的是差别体现在了代码设计上,之前也提到6818的前56KB代码的格式有一定要求,代码设计上就复杂了许多,这个下一篇安排。

插播一条消息:在我后续的学习过程中,偶然得知S5P4418 和 S5P6818并非三星公司的作品,而是韩国一家公司Nexell的作品。这让我想起来,之前吐槽6818的手册看上去乱糟糟的(有可能是我太菜),和2440的手册根本就是两种风格,现在实锤了。特意去Nexell官网看了下,确实有这两款SOC!另外,仔细看了下手册封面,是的,大意了,Powered by NEXELL

S5P6818裸机开发(1)-启动过程分析相关推荐

  1. S5P6818裸机开发(2)-S5P6818 Boot Header解析

    1.S5P6818 Boot Header 手册上对Boot Header部分是这么描述的,所有的启动模式都会检查512字节的引导头,引导头假设第一次接收或者从启动设备都是加载到SRAM中,地址为0x ...

  2. 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...

  3. 嵌入式linux s5pv210,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅三 ...

  4. Android开发入门教程2-Android init 启动过程分析

    Android init 启动过程分析   分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linu ...

  5. AliOS Things的启动过程分析(一)

    AliOS Things的启动过程分析(一) 在本篇文章中,我们以developerkit开发板为例,介绍AliOS Things的启动过程.AliOS Things支持多种工具链进行编译链接的方式生 ...

  6. linux 重定位arm,Arm linxu启动过程分析(一)

    本文着重分析 FS2410 平台 linux-2.6.14 内核启动的详细过程,主要包括: zImage 解压缩阶段. vmlinux 启动汇编阶段. startkernel 到创建第一个进程阶段三个 ...

  7. arm-linux-gcc 裸机程序,Linux下ARM裸机开发-交叉工具链

    初识linux下ARM的裸机开发全过程.现在总结如下: 首先说明为什么要学习裸机开发,一方面bootloader的编写要用到裸机开发的知识,另一方面就是驱动的开发.一般情况下我们进行的系统上的开发. ...

  8. 嵌入式学习:裸机开发_L4_官方SDK开发LED实验

    裸机开发_L4_官方SDK开发LED实验 1. 硬件层电路 1.1 正点原子 i.MX6ULL ALPHA V2.2 开发板 1.2 飞凌i.MX6UL-C开发板 2. 软件编写 2.1. 正点原子 ...

  9. 嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序

    一.学习之路的开始 购买了I.MX6ULL mini开发板进行学习,开发环境为Linux,上学期的Linux课程中,我已将电脑配置好Ubuntu,熟悉了Linux基本操作.之前并没有学过怎么在物理机与 ...

  10. ARM裸机开发——双机异步串行通信

    写在前面  本报告因为期末将至,后续还需要完成一次课程设计,故本次实验较为简单,完成的时间也非常匆忙,故文章内容较为单薄,也可能有着更多疏忽之处,还望大家海涵. 1. 项目任务  1) 利用S3C24 ...

最新文章

  1. XML DOM Node List
  2. 如何显示服务器上的图片,显示服务器上的图片怎么写
  3. php排序地区,怎么在php项目中实现一个地区分类排序算法
  4. linux硬件配置_Linux硬件配置
  5. Docker(4)-容器互联与端口映射
  6. Python实现图像直方图均衡化算法
  7. 回声检测仿真信号matlab,杭州oracle培训入门
  8. 记一次axios源码排查
  9. ubuntu下git使用
  10. cc2530dma控制器功能_CC2530芯片DMA控制器配置
  11. Usage of API documented as @since 1.8+”报错的解决办法
  12. linux kernel pwn学习之堆漏洞利用+bypass smap、smep
  13. 补单平台开发搭建源码_补单系统开发搭建IDEA导入jdk8源码学习(报错解决方案)
  14. Python快速复制浏览器中的Request
  15. iOS用Sketch制作APP下拉刷新的GIF动画
  16. HTTP (RESTful) API 响应时间分析及SLA定义
  17. pythonifelse简化_简化“if…elif..else”条件
  18. int GetMonth( ) const throw( );后面的throw( )什么意思?
  19. Natural language Processing in tensorflow quizs on Coursera
  20. shn gh wh aisg thtc yi p tc cw cw knx

热门文章

  1. MyEclipse配置jdk
  2. 盘点安卓手机被吐槽最多的三大奇葩设计
  3. 使用YOOtheme Pro加速您的WordPress网站
  4. 嵌入式Linux入门-代码重定位和清除bss段讲解
  5. 坐标测量机的定位误差和测长不确定度有何区别,如何表示?
  6. Type-C PD充电简介
  7. 数据结构 严薇敏 单链表(无头结点)的实现(增 删 改 查)及其使用方法详解
  8. pandas 第八章 文本数据
  9. 【BZOJ】【P3110】【ZJOI2013】【K大数查询】【题解】【树套树】
  10. 轻量级交通仿真——Flow