转自:http://blog.sina.com.cn/s/blog_5ddb672b0100fkcf.html

1.首先应该先了解Flash ROM的种类

  NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。
  NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。通俗的说,只给地址不行,要先命令,再给地址,才能读到NAND的数据,在一个总线完成的。
  结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash.
  Nand Flash的命令、地址、数据都通过I/O口发送,管脚复用,这样做做的好处是,可以明显减少NAND FLASH的管脚数目,将来如果设计者想将NAND FLASH更换为更高密度、更大容量的,也不必改动电路板。在S3C2440中NANDFLASH的控制依靠NAND FLASH控制器。

Nandflash不能够执行程序,总结其原因如下
(1) NAND FLASH本身是连接到了控制器上而不是系统总线上(系统总线的概念?)。CPU启动后是要取指令执行的,如果是SROM、NOR FLASH 等之类的,CPU 发个地址就可以取得指令并执行,NAND FLASH不行,因为NAND FLASH 是管脚复用,它有自己的一套时序,这样CPU无法取得可以执行的代码,也就不能初始化系统了。
(2)NAND FLASH是顺序存取设备,不能够被随机访问,程序就不能够分支或跳转,这样你如何去设计程序。

2.在2440中为什么可以配置成从Nand Flash中启动程序?

  如果S3C2440被配置成从Nand Flash启动, S3C2440的Nand Flash控制器有一个特殊的功能,在S3C2440上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部SRAM中,(此内部RAM被称为Steppingstone)并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动,这个过程不需要程序干涉。程序员需要完成的工作,是把最核心的启动程序放在Nand Flash的前4K中,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到SDRAM中运行。

3.启动方式

Samsung S3C2440支持Nor Flash和Nand Flash启动,主要由OM[1:0]这两位来决定从何处启动。具体含义如下:

OM[1:0]=00时,处理器从NAND Flash启动;
OM[1:0]=01时,处理器从16位宽度的ROM启动;
OM[1:0]=10时,处理器从32位宽度的ROM启动;
OM[1:0]=11时,处理器从Test Mode启动。

  ARM的启动都是从0地址开始,所不同的是地址的映射不一样。在ARM开电的时候,要想让ARM知道以某种方式(地址映射方式)运行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候ARM会通过引脚的电平来判断。
(1)当引脚OM0跟OM1有一个是高电平时,这时地址0会映射到外部nGCS0片选的空间(Bank0),也就是Norflash,程序就会从Norflash中启动,ARM直接取Norflash中的指令运行。---Norflash中执行启动代码
(2)当OM0跟OM1都为低电平,则0地址内部bootbuf(一段4k的SRAM)开始。系统上电,ARM会自动把NANDflash中的前4K内容考到bootbuf(也就是0地址),然后从0地址运行。这时NANDFlash中的前4K就是启动代码(他的功能就是初始化硬件然后在把NANDFlash中的代码复制到RAM中,再把相应的指针指向该运行的地方)---Nandflash中启动代码先搬到RAM中执行。

4.启动代码应该做什么?

  由于Nand Flash控制器从Nand Flash中搬移到内部RAM的代码是有限的,所以在启动代码的前4K里,我们必须完成S3C2440的核心配置以及把启动代码(U-BOOT)剩余部分(前4K包括uboot一部分)搬到RAM中运行。至于将2440当做单片机玩裸跑程序的时候,就不要做这样的事情,当代码小于4K的时候,只要下到nand flash中就会被搬运到内部RAM中执行了。bootloader在某种意义上来说即是一个启动代码,种类有很多(vivi,uboot 等),但是功能上无非就是完成一些初始化。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化CPU、堆栈、初始化存储器系统等,其功能类似于PC机的BIOS。

  在实际的开发中,一般可以把bootloader烧入到Norflash,程序运行可以通过串口交互,进行一定的操作,比如下载,调试。这样就很可以很方便的调试你的一些代码。Norflash中的Bootloader还可以烧录内核到Norflash(Nandflash?Norflash一般用来存什么?只有uboot?还是包括kernel/fs?)等等功能。

5.存储控制器的作用

  在2440中分了8个bank,每个bank的基地址由nCGSx来选择,每个bank都接外设之后,就可以通过存储控制器来进行地址上的选择了。每个bank与外设的连接方式不一样,主要看外设是每次进行多少位的数据传输(比如short *ptr,如果是从外设读short型数据,那就是A1接到A0?),如果是8位,这样CPU的地址线A0就可以直接接外设的A0,如果是16位,那么CPU的A1就该接到外设的A0,以此类推。nor flash接在bank0,数据线为16位。存储控制器的特性如下:
  大小端设置;
  地址空间:每个bank为128MB (总共1GB);
  除了bank0其余所有banks的数据位宽是可编程的(8/16/32-bit);(bank0是16/32位)
   总共8个memory banks,其中6个bank是接ROM,SRAM等,其余2个bank是接ROM,SRAM,SDRAM等;
  7个memory bank的起始地址是固定的;(发现size也是固定的,128MB)
  1个memory bank的起始地址和大小是可灵活可变的;
  所有banks的访问周期数是可编程的;
  支持片外等待信号以扩充总线周期;
  SDRAM在Power down模式下支持自动刷新。

  这里看到有8个BANK,然后他们地址怎么就可以确定呢?理解:外面一共就使用了27根地址线,还有5根地址线没有被使用,5根地址线就有16个选择了,初步估计其中的3根又被用来选择这8个bank了,所以才有那样的地址~~至于那个可变地址,暂时还想不出什么解释,好像是叫部分译码~呵呵。。OK---理解:应该nCGSx来决定地址的映射区间,如nCGSx=1则地址映射区间为0x100000~0x200000, nCGSx=2则地址映射区间为0x200000~0x300000

6.Nand Flash控制器

  自动启动: 系统复位后,boot code搬运到4KB Steppingstone,然后在其内部执行;
   Nand Flash存储接口: 支持256Words,512Bytes,1KWords和2KBytes Page;
  软件模式: 用户能直接访问nand flash;
  接口: 支持8/16-bit Nand flash存储接口;
  支持大小端模式;
  硬件ECC发生器;
  Steppingstone: 4KB SRAM Buffer,在nand flash启动过后可以用作它处.

  当系统处在复位状态时,Nand flash控制器从管脚NCON,GPG13,GPG14,GPG15得到nand flash的一些信息(如page size,bus width等,见下图)。在上电或系统复位之后,则Nand flash控制器将自动加载4KB boot loader代码,之后就是在steppingstone里执行.
  注意:在自动启动这个过程中,ECC模块是不发挥作用的。

问题

1.DDRAM和SRAM、SDRAM什么关系?

一般的认识:速度SRAM>DDR2>DDR>SDRAM, SRAM一般用作cache或者片上RAM(如SAM4S拥有高达160K片上SRAM);而在DSP或者ARM外部存储器如512M或者256M,则更多的是DDR;在电脑上,一般cache是SRAM,而内存4G则是DRAM, 当然啦,现在DRAM基本都是DDR2或者DDR3了,也可以认为DDR2/DDR3都是SDRAM的范畴。

2.Linux内核起来之后,整个fs/kernel/uboot是全部在RAM中,还是部分在flash中,用到的时候采取搬?

就目前来看,是全部搬到DDR中,比如kernel/fs都存放在Nandflash中,如果不是启动时全部搬到RAM,运行时,没有任何一处去显视的读Nandflash数据,所有不会存在数据交换。更多了解参照MMU

3.片子是不是必须拥有MMU才能跑Linux系统?

MMU不仅仅是硬件的概念也是软件的概念。

操作系统从MMU角度来讲,分有MMU和无MMU

  • 有MMU:Windows/Linux/Android/Mac...
  • 无MMU:FreeRTOS/VxWorks/ucOS...

硬件从MMU角度来讲,分带MMU和不带MMU

  • CortexA9/ARM9/ARM11....
  • CortexM....

4.程序如果在Norflash里面运行,是不是意味着RAM在程序运行的这个过程没有任何意义?

程序编译完之后,有codesize和datasize,前者通常指的是存在flash中的代码,data通常是指在ram中的用户数据,如数组等。比如2M大小的未初始化数组,在code里面其实很小,只会指定code大小之类的参数,而程序启动后,由.bss段展开,则会产生在ram内对应2M大小的内存块。

//TODO:回答问题

5.Nandflash和Norflash通常在ARM(搭载Linux)系统中充当什么角色?

如Mini2440的nandflash有128M,而Norflash有2M,而系统中一般Bootloader:200KB, kernel:2M, fs:100M, 这样首先这些数据不会都存放在Norflash中,所以Nandflash中存放Bootloader/kernel/fs, 而Norflash存放Bootloader,这样Mini2440既可以从Nandflash启动,也可以从Norflash中启动。

s3c2440存储控制器和地址以及启动的理解的更多相关文章

  1. s3c2440存储控制器详解

    从上图可知,外部内存类的设备与存储管理器相连,那么CPU是怎样访问到内存的呢?通过存储管理器.CPU比较单纯,只会按照指令执行,CPU只负责发出地址,怎样找到内存类设备呢?这些都交给存储管理器来管理. ...

  2. S3C2440之存储控制器学习记录

    /==========翻译S3C2440存储控制器部分================/ 5 存储控制器 概述 S3C2440内存控制器为外部存储访问提供内存控制信号. S3C2440A有如下特征: ...

  3. S3C2440—7.存储控制器访问外设

    文章目录 一.内存接口的概念 二.存储控制器(内存控制器) 2.1 什么是存储控制器? 2.2 S3C2440存储控制器介绍 2.3 存储控制器如何处理不同位宽的外设 2.4 怎么确定芯片的访问地址? ...

  4. 存储控制器和SDRAM 实验

    S3C2440 存储控制器(memory controller)提供了訪问外部设备所需的信号,这是一种通过总线形式来訪问扩展的外设. S3C2440  的存储器控制器有下面的特性: 支持小字节序.大字 ...

  5. JZ2440 裸机驱动 第6章 存储控制器

    本章目标:     了解S3C2410/S3C2440地址空间的布局     掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...

  6. JZ2440开发笔记(6)——存储控制器

    存储控制器与CPU及其它外设的关系 我们看到cpu上集成了一个存储管理器,外围的存储设备都接在这个存储管理器上.cpu负责发出命令,其它的一切工作都交给了存储管理器.那么存储管理器是如何来管理这些外设 ...

  7. u-boot移植(七)---代码修改---存储控制器

    一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特 ...

  8. LCD实验学习笔记(六):存储控制器

    s3c2440可使用地址空间为1GB(0x00000000到0x40000000). 1G空间分为8个BANK,每个BANK为128MB. 设27条地址线,和8个片选引脚(nGCS0-nGCS7). ...

  9. 今天学习的裸板驱动之存储控制器心得(初始化SDRAM)

    CPU只管操作地址,而有些地址代表的是某些存储设备. 但是操作这些存储设备需要很多东西,比如需要制定bank,行/列地址等.所以就有了存储管理器,用来处理这种CPU操作的地址和存储设备间的转换. (1 ...

随机推荐

  1. ubuntu 状态栏不显示时间

    有时候我们会看到我们电脑的状态栏那里并没有显示时间,一个原因是日期时间指示器没有工作,另一个可能的原因是用户禁用了时间显示. 方法一: 首先我们用下面的命令来确认一下是否安装了日期时间指示器: sud ...

  2. 利用jdbc连接oracle数据库

    JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行SQL语 ...

  3. ORACLE 11g 用Duplicate恢复Data Guard 备库详细过程

    1.先查找备库控制文件路径 先在备库上找出控制文件的路径,通过和主库一样,不过为了以防万一,还是check为好. SQL>  select name from v$controlfile; NA ...

  4. DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf

    DYNAMIC_DOWNCAST.STATIC_DOWNCAST.CRuntimeClass和IsKindOf   DYNAMIC_DOWNCAST(class, pointer ):如果pointe ...

  5. java_linear list

    1.线性表的顺序存储结构,类似ArrayList package collectionsFramework.linearlist; import java.util.Arrays; /** * @Pa ...

  6. C#基础:Lambda表达式

    从委托的角度来看,Lambda表达式与匿名方法没有区别.在[C#基础:匿名方法]一文中,我使用了匿名方法来调用List<T>的FindAll方法.从C# 3.0开始,在使用匿名方法的地方, ...

  7. NoSQL之Redis高级实用命令详解--安全和主从复制

    Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...

  8. 使用latencytop深度了解你的系统的延迟(转)

    转载自系统技术非业余研究 http://blog.yufeng.info/archives/1239 我们在系统调优或者定位问题的时候,经常会发现多线程程序的效率很低,但是又不知道问题出在哪里,就知道 ...

  9. 使用Ef时,对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

    EntityValidationErrors   关于如何查看 EntityValidationErrors 详细信息的解决方法 我们在 EF 的编程中,有时候会遇到这样一个错误: 但是,按照他的提示 ...

  10. 如何在asp.net中获取GridView隐藏列的值?

    在阅读本文之前,我获取gridview某行某列的值一般做法是这样的:row.Cells[3].Text.ToString().有点傻瓜呵呵 在Asp.net 2.0中增加了一个新的数据绑定控件:Gri ...