S3C6410支持多种存储设备,包括片上的Internal ROM、Internal SRAM和片外的Flash/ROM、DRAM。多种启动设备形成多种启动模式,分析如下。

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10035261.html

1. 存储系统

1.1 存储器结构

存储子系统结构如下图所示。6410的存储系统包括两个内部存储器和两个外部存储器端口(参用户手册1.1节、2.1节、4.3节):

内部存储器即集成在芯片内部的存储器,有

  • Internal ROM

  • Internal RAM

两个外部存储器端口支持外接存储器

  • Memory Port0(Flash/ROM):
    片选引脚Xm0CSn[5:0],128M×6Banks。
    支持SROM控制器(支持SRAM、ROM、NOR Flash)、OneNAND控制器(支持OneNAND Flash)、NAND控制器(支持NAND Flash)和CF控制器(SDCARD等)所支持的外部存储器。

  • Memory Port1(DRAM):
    片选引脚Xm1CSn[1:0],256M×2Banks。
    支持mobile DDR、DDR、Mobile SDRAM和SDRAM,下文中的DARM即指此四种(相对于SRAM)

1.2 存储系统内存映射

S3C6410内存映射表如下所示:

S3C6410X支持32位(4G)物理地址,但实际只用了2G存储空间,地址空间范围为0x0000_0000至0x7FFF_FFFF。
此地址空间分为两部分:前1.75G用于存储器(内部存储器和外部存储器),后0.25G(256M)用于外设。

1.2.1 存储器地址范围

地址范围:0x0000_0000-0x6FFF_FFFF(1.75G),通过SPINE总线访问。
存储器空间分为四个区域,如下:

1) 启动镜像区(boot image area)

地址范围:0x0000_0000-0x07FF_FFFF(128M)

启动镜像区并没有实际的映射内存(mapped-memory)。启动镜像区反映一个镜像,这个镜像指向内部存储区的SteppingStone或静态存储区。启动镜像的地址固定为0x0000_0000。

程序启动从地址0x0000_0000开始,所谓映射,实际上就是跳到。如启动镜像区映射到NOR即程序执行时从0地址直接跳转到NOR中执行。

2) 内部存储区(internal memory area)

地址范围:0x0800_0000-0x0FFF_FFFF(128M, 64M×2)

包含内部ROM(Internal ROM, IROM)和内部SRAM(Internal SRAM, 亦称SteppingStone)。内部存储区供bootloader访问。每块内部存储区的起始地址固定:
1) 内部ROM地址范围0x0800_0000-0x0BFF_FFFF(64M),但实际存储仅32K。只读,当内部ROM启动被选中时该区域将映射到启动镜像区。
2) 内部SRAM地址范围0xC000_0000-0x0FFF_FFFF(64M),但实际存储仅4K。可读写,当NAND闪存启动被选中时该区域能映射到启动镜像区。

3) 静态存储区(static memory area)

地址范围:0x1000_0000-0x3FFF_FFFF(768M, 128M×6)

此地址空间支持SROM控制器(支持SRAM、ROM、NOR)、OneNAND控制器(支持OneNAND)所支持的存储设备,还有SteppingStone(特殊,后面有描述)。也就是说NOR、OneNAND等可被编址到本空间,可通过地址访问。

此地址空间不支持NAND控制器和CF控制器。当NAND和CF的片选连接到Xm[0]CSn[5:2]的某一片选时,此片选对应的bank是没有用处的。不可以通过静态存储区的地址空间访问NAND的和CF,而是通过访问其控制器的SFR间接访问NAND和CF。有一个例外:若Xm[0]CSn[2]被用于片选NAND Flash,则Stepping Stone将映射到存取区0x2000_0000-0x27FF_FFFF,因NAND控制器有DMA功能,主要用于启动时的代码搬运,详细描述在本文的最后。

4) 动态存储区(dynamic memory area)

地址范围:0x4000_0000-0x6FFF_FFFF(768M)
0x4000_0000-0x4FFF_FFFF(256M, 128M×2)的地址空间保留。
0x5000_0000-0x6FFF_FFFF(512M, 256M×2)的地址空间用于DMC1(DRAM Controller of the Memory Port1),每一片选的起始地址可配置。

1.2.2 外设地址范围

地址范围:0x0000 0000-0x6FFF FFFF(256M),通过PERI总线访问。

此地址空间可访问所有的SFR。同样,若数据需从NFCON 或CFCON 传输,那么它们将通过PERI 总线传输。

2. 启动方式

S3C6410设备启动模式如下表所示:

S3C6410支持Nand/Nor/OneNAND/Modem/iROM(内部ROM)几种启动方式,与启动模式相关的硬件管脚有:

  • XOM[4:0]:
    XOM[4:1]选择启动设备Nand/Nor/OneNAND/Modem/iROM。
    XOM[0]选择时钟源,为0选择XXTlpll,为1选择XEXTCLK。
  • GPN[15:13]:
    用于识别iROM启动方式时的设备类型。
  • XSELNAND:
    选择使用Nand设备或者OneNand设备(无论是用作启动设备还是存储设备)。为0使用OneNand,为1使用Nand,当NAND和OneNAND均未使用时,为0或1皆可。

启动模式分为两类:

2.1 iROM启动方式

iROM启动模式:启动镜像区映射到iROM

当OM[4:1]=1111时为iROM启动方式,芯片上电后,首先从iROM中运行。

BL0:Bootloader0,即固化在iROM中的启动代码,直接在iROM中运行。负责部分初始化工作以及将BL1拷贝至SteppingStone。

BL1:Bootloader1,存储于启动设备中(由GPN[15:13]管脚指定,如SD卡、NAND等),运行于iRAM中(即Internal SRAM, SteppingStone)。初始化DRAM等以及将BL2拷贝到DRAM。

BL2:Bootloader2,存储于启动设备中(由GPN[15:13]管脚指定,如SD卡、NAND等),运行于DRAM中,负责部分初始化工作以及引导操作系统等。

iROM启动方式如下图所示:

① iROM supports initial boot up: initialize system clock, D-TCM, device specific controller and booting device.
② iROM boot codes can load 4KB of bootloader to stepping stone. The 8KB boot loader is called BL1.
③ BL1: BL1 can initialize system clock, UART, and SDRAM for user. After initializing, BL1 will load remaining boot loader which is called BL2 on the SDRAM.
④ Finally, jump to start address of BL2. That will make good environment to use system.

BL0将执行如下操作,详细流程参考图

  1. 禁用Watch-dog
  2. 初始化TCM
  3. 初始化设备拷贝函数,用于拷贝BL1到SteppingStone中
  4. 初始化栈区域
  5. 初始化PLL
  6. 初始化指令Cache
  7. 初始化堆区域
  8. 拷贝BL1到SteppingStone中
  9. 验证BL1
  10. 跳转到SteppingStone中运行

与启动相关的存储器映射如下表所示:

2.2 非iROM启动方式

非iROM启动模式:启动镜像区映射到iRAM[NAND]、ExtROM、NOR或OneNAND

即使用Nand/Nor/OneNAND/Modem启动,以Nand为例:

当芯片上电后,Nand-Flash控制器会自动使用DMA将自己的bootloader区域的前4KB代码搬运到iRAM(内部SRAM),注意此动作由硬件执行,注意Nand-Flash控制器位于6410 IC内部,当然前提是芯片内部的Nand-Flash控制器支持Nand-Flash启动这个功能。

当然,若Nand-Flash中无bootloader程序,芯片肯定无法启动,DRAM也无法初始化。同样使用Nor启动也是一样。

非iROM启动方式与iROM启动方式不同的一点在于:非iROM启动方式是在芯片上电后,由Nand-Flash控制器(或Nor-Flash控制器等)将bootlader的相关部分搬运到SteppingStone中运行,而iROM启动方式是在芯片上电后,由iROM中的启动代码BL0将bootlader的相关部分搬运到SteppingStone中运行。如图2所示,即上电后第①步不同,其后步骤基本一样。

3. 总结分析

以下内容来自User Manual V1.10第6章和Application Note V1.0第6章
6410 SROM控制器支持SRAM, various ROMs和NOR flash。

SROM Controller support SROM interface for Bank0 to Bank5. In case of OneNAND boot, SROM controller cannot control Bank2 and Bank3 because its mastership is on OneNAND Controller. In case of NAND boot, SROM controller cannot control Bank2 and Bank3 because its mastership is on NAND Flash Controller.

当AXI Remap=0时,是非IROM启动方式。

下面从各控制器说起:

  • SROM控制器:
    支持SRAM,ROM,NOR flash。上图中的SRAM0-SRAM5即指SRAM,External ROM则指ROM和NOR flash。SROM控制器支持的存储设备,代码可在其中直接运行。
    因此启动镜像区可直接映射到SRAM0、External ROM,启动代码直接在存储设备中运行。当然SRAM掉电丢失内容,无法作启动设备。

  • OneNAND控制器:
    控制OneNAND flash,代码也可在OneNAND中运行。
    因此启动镜像区可直接映射到OneNAND区,启动代码直接在OneNAND中运行。

  • NAND控制器:
    控制NAND flash,代码不可在其中运行。
    NAND启动时,上电时NAND控制器可自动将自己bootloder区的前4KB代码拷贝到即内部SRAM(SteppingStone),暂称之为DMA功能。
    启动镜像区映射到内部SRAM(限上电直接从内部SRAM执行),内部SRAM中的代码是从NAND时拷贝过来的,因此前面也称SteppingStone映射到了NAND。

  • CF控制器:
    控制CF/ATA card,代码不可在其中运行。
    CF控制器不具备DMA功能,因此SDCARD只能使用IROM启动,无法使用非IROM启动方式。

SROM控制器支持的存储器、OneNAND存储器均可通过静态存储区(static memory area)直接存取,它们被编址在静态存储区。

而NAND和CF卡则不行,必须通过相应的控制器对器件间接访问,不能被编址在静态存储区,当它们使用Xm0CSn[5:2]占了静态存储区的相应banks时,相应的bank将不可用,白白被占。一个例外是:若Xm[0]CSn[2]被用于片选NAND Flash,则Stepping Stone将映射到存取区0x2000_0000-0x27FF_FFFF,这一句话还是不很清楚。

当AXI Remap=1时,是IROM启动方式。

启动镜像区映射到Internal ROM(BL0),BL0初始化相关硬件后,将位于外部存储器(SRAM因掉电丢失除外,NOR,ROM,NAND,CF)的bootloader的前4KB(BL1)拷至SteppingStone(即Internal RAM),并跳转至BL1运行,SteppingStone中的BL1初始化相关硬件后,将外存中剩余的bootloader(BL2)拷至DRAM中并跳转至DRAM中的BL2运行,BL2开始引导操作系统。

4. 参考资料

[1] S3C6410X USER'S MANUAL.pdf, REV 1.20
[2] S3C6410_Internal_ROM_Booting.pdf, REV 1.00
[3] http://blog.chinaunix.net/space.php?uid=26470747&do=blog&id=3025478

S3C6410启动过程分析的更多相关文章

  1. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  2. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...

  3. Neutron分析(2)——neutron-server启动过程分析

    neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...

  4. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  5. Activity启动过程分析

    Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...

  6. Spark Streaming应用启动过程分析

    本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...

  7. ActivityManagerService启动过程分析

    之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了Activity ...

  8. Disconf源码分析之启动过程分析下(2)

    接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...

  9. Service启动过程分析

    Service是一种计算型组件,用于在后台执行一系列的计算任务.由于工作在后台,因此用户是无法直接感知到它的存在.Service组件和Activity组件略有不同,Activity组件只有一种运行模式 ...

随机推荐

  1. cocos游戏网址

    http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framewor ...

  2. 关于DFS和BFS的理解 以及坐标的定义

    http://blog.csdn.net/bool_isprime/article/details/5803018DFS: 1: 坐标类型搜索 :这种类型的搜索题目通常来说简单的比较简单,复杂的通常在 ...

  3. 7.css浮动与定位

    外边距塌陷 解决方案: ◆给父盒子加border ◆overflow:hidden; bfc 行内元素可以定义左右的内外边距,上下会被忽略掉. 行内块可以定义内外边距. 文档流(标准流) 元素自上而下 ...

  4. Android-Java-死锁

    死锁:程序不往下执行了,程序又没有结束,就一直卡在哪里: 在使用synchronized的时候要避免死锁,synchronized嵌套就可能会引发死锁,需要严格的检查代码,排除死锁发生的可能: 特意演 ...

  5. bootstrap基础学习小记(二)排版、列表、代码风格、表格

    排版——标题.副标题.段落(正文文本).强调内容.粗体.斜体.强调相关的类.文本对齐 <!DOCTYPE HTML> <html> <head> <meta ...

  6. C#通过字符串名称来调用对应字符串名称的方法

    前段时间在一个项目中,在一个地方要将函数所在类中的方法都调用一遍,但是否调用要通过配置文件中的内容决定.所以为了减少代码量,在网上查了相关信息,终于成功的将其应用到了项目中,我在这里将我做的一个简单例 ...

  7. 1.翻译:EF基础系列--什么是Entity Framework?

    大家好,好久不见,EF系列之前落下了,还是打算重新整理一下. 先说说目前的打算:先简单了解一下EF基础系列-->然后就是EF 6 Code-First系列-->接着就是EF 6 DB-Fi ...

  8. java servlet编写验证码

    import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffere ...

  9. 堆排序(大顶堆、小顶堆)----C语言

    堆排序 之前的随笔写了栈(顺序栈.链式栈).队列(循环队列.链式队列).链表.二叉树,这次随笔来写堆 1.什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被 ...

  10. jQuery基础(1)

    一.jQuery的介绍 1.为什么要使用jQuery? 在用js写代码时,会遇到一些问题,如下: 1)window.onload 事件有事件覆盖的问题,因此只能写一个事件: 2)代码容错性差: 3)浏 ...