目前的ARM处理器都支持多种启动模式,S3C6410和以前的Samsung的ARM处理器一样,通过外部管脚OM[4:0]的拉高拉低来决定是从哪个存储设备上启动。我认为S3C6410的User Manual并没有说的很清楚,所以我在最开始使用的时候,也对其启动模式有一些误解,下面就我个人的理解,介绍一下S3C6410的启动。

先读一下S3C6410 User Manual的第3章 System Controller,在123页列了一张表,如图:

这章表列出了S3C6410所支持的几种启动模式。首先介绍一下和启动模式相关的硬件管脚:

OM[4:0]:选择启动设备及时钟源。OM[0]为0选择XXTlpll,为1选择XEXTCLK。

GPN[15:13]:用于识别所支持的Nandflash的类型,包括Page的类型和地址周期。

XSELNAND:选择Nand启动或者是OneNand启动。0为OneNand,1为Nand。

从表中可以看出,S3C6410好像并不支持Nandflash启动,因为Boot Device中没有Nandflash设备。当OM[4:0]为0000x/0001x/0010x/0011x的时候,Boot Device是Reserved,我想这里是Samsung在6410中有意要隐瞒什么。如果你用过S3C6400,你应该知道在S3C6400 User Manual中也有这么一张表,描述了s3c6400的启动模式,具体S3C6400的启动模式也是在第3章 System Controller,在第107页的表,如图:

我想和S3C6410的表对照一下就会发现,两个处理器的启动模式是兼容的,我认为S3C6410应该兼容S3C6400的启动模式,只不过Samsung在S3C6410 User Manual中隐藏了S3C6400中所支持Nandflash启动模式,目的可能是Samsung不希望在S3C6410中使用Nandflash启动,而要推崇IROM的启动模式。个人理解啊!

下面来总结一下S3C6410所支持的启动模式:

1. NOR Flash启动

通过Nor Flash启动,此时OM[4:1]为0100或0101,对应8bit和16bit。

2. Nand Flash启动

虽然在S3C6410 User Manual中没有提到,但是也是支持的,从S3C6400 User Manual可以找到。OM[4:1]四个硬件管脚决定了Nandflash启动,以及支持的Nandflash的类型,包括大Page和小Page,地址周期为3,4,5。当然,XSELNAND管脚也要为1。

3. OneNAND启动

首先XSELNAND管脚为0,其次OM[4:1]为0110,为OneNand启动模式。

4. MODEM启动

当OM[4:1]为0111的时候,为MODEM启动。S3C6410通过MODEM接口下载boot代码到内部RAM中,然后进行引导。

5. IROM启动

当OM[4:1]为1111的时候,从Internal ROM中启动,此时GPN[15:13]用于识别设备的类型。这种模式以前没见过,这里具体介绍一下。

IROM模式可以支持MoviNand,SD/MMC,iNand,OneNand和Nand等。关于IROM的引导,具体过程如图:

1. 处理器上电后,当OM[4:1]=1111时,运行iROM中的程序,这个程序被称为Bootloader0(BL0),它会做一些初始化的工作。

2. 然后根据GPN[15:13]的管脚设置,iROM程序选择从相应的设备(SD/MMC/OneNand/Nand)中的指定区域读取4KB的程序到SteppingStone中运行,这段代码被称为Bootloader1(BL1)。

3. BL1可以初始化系统时钟,UART,SDRAM等设备,然后拷贝Bootloader2(BL2)到SDRAM中。

4. 跳转到SDRAM中的BL2,继续运行,BL2可以支持更强大的功能,可以将OS加载到SDRAM中,然后运行OS。

整个过程中,IROM是最先被运行的,它会首先做一些初始化,具体IROM的流程如下:

1. 禁用Watch-dog

2. 初始化TCM

3. 初始化设备拷贝函数,用于拷贝BL1到SteppingStone中

4. 初始化栈区域

5. 初始化PLL

6. 初始化指令Cache

7. 初始化堆区域

8. 拷贝BL1到SteppingStone中

9. 验证BL1

10. 跳转到SteppingStone中运行

还是看一下流程图吧,理解起来会更直观一些,IROM启动流程如图:


原文:S3C6410设备时钟源选择、启动方式选择和内存映射

********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

时间:2011.7.23

类别:WINCE bootloader开发

********************************LoongEmbedded********************************

S3C6410根据启动设备(boot device)的类型分为支持6种操作模式,启动设备可以是SROM、NOR、OneNAND、MODEM和IROM(internal ROM)任何的一种,见下图1

从上图可知S36410的操作模式是系统启动的时候根据XSELAND、OM[4:0]和GPN[15:13]的值来决定是哪种操作模式(比如是IROM)以及操作模式下的具体启动设备(比如是SD或是NAND)。当然了这些引脚的值是根据我们所需要的启动方式来决定的,比如开发板中就支持SD卡和NAND启动的方式,下面尝试从硬件设计的角度来学习是如何确定一些关键设计的。

1. 开发板的时钟源选择(下图2)

上图是6410CPU对时钟发生器结构图的部分,这里只是截了一部分图,可知S3C6410的输入时钟源为外部晶振(XXTIpll)和外部时钟(XEXTCLK),

其中时钟发生器由三个PLLs(Phase Locked Loop,锁相环)组成,最高可以产生1.6GHz频率的时钟,这里开发板的设计是选择12MHZ的外部晶振作为时钟源,见下图3:

因为选择外部晶振作为始终源,所以由XOM0=0,见下图4:

2. 开发板采用的启动方式

由图2和3中的内容可知XOM0=0,因为采用SD卡和NAND的启动方式,结合图1可知,OM[4:0]=11111,而且可知XSELNAND=1,那么就确定了这些引脚的设计,如下图5:

下图6是XSELNAND引脚设计部分:

2.1. SD卡启动方式

SD卡启动方式,而我们选择的是SD/MMC(CH1),根据图1可知GPN[15:13]=111,所以可以通过图5的SW1开关的2打到“OFF”,也即高电平的状态,就可以实现是SD卡启动的方式了。

2.2. NAND启动方式

开发板采用的是NAND是1GBytes的K9G8G08U0M,其一页大小为2048Bytes,需要5个时钟周期,见下图7

结合图1和图7可以得到NAND启动方式的的GPN[15:13]=101,这时就需要

通过图5的SW1开关的2打到“ON”,也即低电平的状态,就可以实现是NAND卡启动的方式了。

3. S3C6410的存储器映射

S3C6410支持32位的物理地址空间,被分为memory和pheriperal部分。

3.1 memory空间

memory地址范围为0x0~0x6FFFFFFF(1792MBytes),通过SPINE总线memory空间。Memory又称为主内存,又被分为启动镜像区(boot image area)、内部存储区(internal memory area)、静态存储区(static memory area)和动态存储区(dynamic memory area)。

1) 启动镜像区

启动镜像区的物理地址范围是0x00000000~0x07FFFFFF(128MB),这个区域是用于启动系统的,但是这个区域内并没有实际的存储介质与之对应。这个区域反映一个镜像,这个镜像指向内部存储区或是静态存储区的一部分。启动镜像区的开始地址固定式0x00000000。在本设计中,通过上面描述的OM[4:0]选择据顶的启动介质后再把相应的介质的物理地址映射到这个启动镜像区,比如说选择了IROM启动方式(见图1)后,就把IROM所占用的地址空间映射为0x00000000开始的空间。在本设计中,比如我们选择NAND作为启动介质,而又是Xm0CSn2选择NAND的片选,那么就把0x20000000~0x27FFFFFF(为什么是这个范围呢?见下图8)这128MB的物理地址映射到启动镜像区。

2) 内部存储区

内部存储区用于启动代码(boot loader)访问内部ROM和内部SRAM,内部的SRAM也成为steppingstone。每块内存存储器的起始地址都是固定的,其中内部ROM的范围是0x08000000~0x0BFFFFFF(见图8),当然内部的ROM并没有64MB这么多,而实际只有32KB用于存储,该区域是只读的,并且当内部ROM(IROM)启动被选择时,该区域能映射到启动镜像区,此种情况下,该区域存放放的是IROM方式下的启动代码,选择IROM启动的时候首先运行的就是这部分的代码,称为BL0,这部分代码由厂家固化。内存SRAM的范围是0x0c000000~0x0fffffff,实际可用的SRAM按照三星的手册是4KB,其实这就是用于nand flash启动的Steppingstone(但是这个Steppingstone是8KB,这2者似乎有矛盾,我觉得应该是写这部分的作者的笔误)。该区域能被读写,当NAND启动被选择时能映射到启动镜像区。

3) 静态存储区

静态存储区域的地址范围是0x10000000~0x3FFFFFFF(6*128MB),通过该地址可以访问SROM、SRAM(比如DM9000A)、NOR Flash、同步NOR接口设备和steppingstone。每一块区域代码一个片选(见图8),比如如果用Xm0CSn[1]来作为DM9000A的片选信号,0x18000000~0x1FFFFFFF就代表Xm0CSn[1],我们就可以通过0x18000000~0x1FFFFFFF来访问DM9000A自带的SRAM。每个芯片选择的开始地址都是固定的。

虽然Xm0CSn[5:2]可以映射到NAND Flash和CF/ATA等非线性存储器,但我们不能通过静态存储区来访问NAND Flash和CF/ATA的地址空间,相反,当映射到这些存储器的时候这些bank的地址也不能再使用了,而只能通过pheriperal空间的AHB总线来访问这些非线性存储器。有一个例外是如果Xm0CSn[2]被映射到NAND Flash的时候,Steppingstone映射到0x020000000~0x27FFFFFF这块区域,具体一点说是steppingstone这4KB的SRAM被映射到bank2开始的4KB,而在以NAND Flash方式启动的时候bank2被映射到0x00000000开始的地方,那么实际上就是把steppingstone映射到0x00000000,,这样,系统启动的时候,会把NAND Flash的第一个4KB最开始的启动代码读取到steppingstone中 来执行,这个读取的动作是由NAND控制器自动完成的。

4) 动态存储区

动态存储区的范围是0x40000000~0x6FFFFFFF(3*256MB),其中第一个256MB为保留区,实际使用的动态内存区位0x50000000~0x6FFFFFF,这个范围又分为2个区间,每个区间占256MB,可以通过DMC(动态内存控制器)的Xm1CSn[1:0]来选择对应的区间,这个内存主要是扩展DRAM,最大可以扩展512MB的DRAM,见图8。下图9是开发板用Xm1CSn[作为DRAM的片选信号的电路图:

结合图8,可以得出g_oalAddressTable表的DRAM区域范围如下:

DCD     0x80000000, 0x50000000,  256    ; 256 MB DRAM

3.2 pheriperal空间

外设区域通过PERI总线访问,其地址范围是 0x70000000~0x7FFFFFFF(256MBytes),这个地址范围的所有的SFR都能被访问,而且如果数据需要从NFCON或CFCON传输,这些数据需要通过PERI总线传输。


原文:S3C6410 NAND启动流程

S3C6410和2440的NAND启动流程大体一样,也有一些区别。这篇文章主要目的是梳理下S3C6410 NAND启动流程,也给这几天的学习来个总结。

S3C6410主存的地址范围为 0x0000_0000~0x6FFF_FFFF。主存部分分成四个区域:引导镜像区,内部存储去,静态存储区和动态存储区。

引导镜像区的地址范围是从0x0000_0000~0x07FFF_FFFF,但是没有实际的映射内存,引导镜像区反映一个镜像,这个镜像指向内存的一部分区域或者静态存储区。引导镜像的开始地址是0x0000_0000。

内部存储区用于启动代码访问内部ROM和内部SRAM,也被称为Steppingstone。内部ROM地址范围为0x0800_0000~0x0bff_ffff,为只读,当内部ROM启动被选中时,该区域能映射到引导镜像区。内部RAM地址范围为0x0c00_0000~0x0fff_ffff,可读写,当NAND启动被选择时,能映射到引导镜像区。

(图中steppingstone 4K是错误的,不知道为什么,有的芯片资料说是4K,有的说是8K,我请教过别人都是说8K,并且在内部SRAM设置sp为8*1024程序能正常跑,说明8K没有超出范围)

启动流程:

给板子上电之后,硬件会将nand前8K代码拷贝到steppingstone中,steppingstone会映射到引导镜像区,代码从0x0地址开始执行。可以通过这段启动代码将uboot等加载进SDRAM,实现更多功能。

这里有个小问题困扰了很久,因为这点跟2440不同,就是为什么nand里8K拷贝进steppigstone后程序从0地址开始跑,而不是0x0c00_0000(steppingstone 地址0x0c00_0000),后来又看了芯片资料,steppingstone会映射到引导镜像区,引导镜像区在映射之前是不指向实际内存地址的。我做了个测试,当8K拷贝完后,我将PC指针分别指向0x0,和0x0c00_0000去执行,发现执行的代码是一样的。所以以0x0,和0x0c00_0000为起始地址的8K代码其实是一样的,都是指向物理地址为0x0c00_0000的这段代码。

S3C6410启动方式相关推荐

  1. S3C6410设备时钟源选择、启动方式选择和内存映射

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  2. thinkpad重装系统不引导_重装系统时,如何判断Windows的启动方式是Legacy还是UEFI?...

    众所周知,BIOS启动模式有UEFI+GPT和Legacy+MBR两种,如今大多数新机型电脑都采用了UEFI的启动模式来引导系统,即便如此,仍有部分电脑采用Legacy启动模式.这两种启动模式究竟有什 ...

  3. Flask开发服务器启动方式

    开发服务器启动方式 在1.0版本之后,Flask调整了开发服务器的启动方式,由代码编写app.run()语句调整为命令flask run启动. from flask import Flaskapp = ...

  4. Redis的多种启动方式比较!

    有感: Redis玩了许久时间,真心感觉启动方式还是自己定义的方便! 1)直接启动和关闭:(配置文件默认) 开启:redis-server &(&后台运行) #daemonize ye ...

  5. 12.QT线程的两种启动方式

    一.QT中的线程 QT中的线程主要是通过QThread进行管理,一个QThread对象管理程序中的一个线程. QThreads管理的线程在run()中开始执行. 默认情况下,run()通过调用exec ...

  6. prometheus 插件node_exporter 启动方式

    在linux下./node_exporter&这种启动方式,关闭终端后,就挂掉了,使用以下启动方式 nohup ./node_exporter  --web.listen-address=&q ...

  7. mysql服务器的启动方式有哪几种_Mysql启动的方式(四种)

    废话不多说了,直奔主题了. mysql的四种启动方式: 1.mysqld 启动mysql服务器:./mysqld --defaults-file=/etc/my.cnf --user=root 客户端 ...

  8. [转]redis的三种启动方式

    来源:https://www.cnblogs.com/pqchao/p/6549510.html redis的启动方式 1.直接启动   进入redis根目录,执行命令:   #加上'&'号使 ...

  9. ***程序一般的启动方式

    大家所熟知的***程序一般的启动方式有:加载到"开始"菜单中的"启动"项.记录到注册表的[HKEY_CURRENT_USER\Software\Microsof ...

最新文章

  1. L1-025 正整数A+B
  2. Java中创建对象的5种方式 -[转] http://www.codeceo.com/article/5-ways-java-create-object.html...
  3. 记一次使用 removeEventListener 移除事件监听失败的经历
  4. Spark _23 _读取parquet文件创建DataFrame(二)
  5. 用diag直接使用错误_用python学量子力学(1)
  6. 如何给SpringBoot配置轻松加密?
  7. 网页检测 AdBlock 的 6 种方法
  8. SQL运行速度慢?查查中间件
  9. 13凯越门锁继电器在哪里_汽车中控保险丝在哪里_汽车一年保险费_保险频道
  10. Effective C++ -----条款50:了解new 和delete 的合理替换时机
  11. ngix入门 Linux系统Ubuntu ngix安装
  12. SIP协议之术语定义
  13. 深圳 计算机网络与管理,深圳计算机网络管理员路由与交换班
  14. BZOJ 2434 阿狸的打字机(fail树)
  15. 传教士过河java_野人和传教士渡河问题的java实现
  16. 1741. Communication Fiend(dp)
  17. matplotlib柱状图上方显示数据_Python数据可视化之matplotlib
  18. oracle 生成随机姓名_Oracle生成随机码
  19. 参考文档一:性能测试---测试方案
  20. 要用什么态度去面对生活?

热门文章

  1. RISCV学习笔记5.3--ubuntu18.04芯片设计软件(vcs、verdi)的简单使用
  2. Android系统之ContentObserver和SettingsProvider结合使用(三)
  3. 加州大学欧文分校 计算机专业,加州大学欧文分校信息与计算机科学
  4. SqlServer 2016新特性 —— automatic seeding (自动种子设定)究竟是什么
  5. Cesium环境 Primitives加载广告牌出现Cannot read property ‘globe‘ of undefined
  6. Project的分组依据
  7. 天津医科大学计算机研究生吧,天津医科大学
  8. Python学者在CSDN该怎么学习
  9. 天视通支持海康威视摄像头吗_海康威视突然做电脑,到底有胜算吗?
  10. 友价商城源代码插件汇总