通过存储控制器访问外设

来源:互联网 发布:js获取file绝对路径 编辑:程序博客网 时间:2024/05/15 06:08

  SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)也就是通常所说的内存。内存的工作原理、控制时序、及相关控制器的配置方法一直是嵌入式系统学习、开发过程中的一个难点。我们从其硬件的角度来分析其原理,然后再引出SDRAM的驱动编写过程。

  内存是代码的执行空间,以PC机为例,程序是以文件的形式保存在硬盘里面的,程序在运行之前先由操作系统装载入内存中,由于内存是RAM(随机访问存储器),可以通过地址去定位一个字节的数据,CPU在执行程序时将PC的值设置为程序在内存中的开始地址, CPU会依次的从内存里取址,译码,执行,在内存没有被初始化之前,内存好比是未建好的房子,是不能读取和存储数据的,因此我们要想让MTOS运行在内存里必须进行内存的初始化

通用存储设备:

  在介绍内存工作原理之前有必要了解下存储设备的存储方式:ROM,RAM

  ROM(Read-Only Memory):只读存储器,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,资料并且不会因为电源关闭而消失。如:PC里面的BIOS。

  BIOS(basic input output system):基本输入输出系统,它的作用:

    1)自检及初始化

      开机后BIOS最先被启动,然后它会对电脑的硬件设施进行完全彻底的检验和测试,如果发现问题,       会分两种情况处理:

      一.严重故障停机,不给出任何提示或信号

      二.非严重故障,则给出屏幕提示或声音警报信号,等待用户处理

      如果未发现问题,则将硬件设施设置为备用状态,然后启动操作系统,把对电脑的控制权交给用户。

    2)程序服务

       BIOS直接与电脑的Input或output设备打交道,通过特定的数据端口发出命令,传送或接受各种外部设备的数据,实现软件程序对硬件的直接操作。

    3)设置中断

       开机时,BIOS会告诉CUP各硬件设备的中断号,当用户发出使用某个设备的指令后,CPU就根据中断号使用相应的硬件来完成工作,再根据中断号跳回去执行原来的工作

  RAM(Random Access Memory) :随机访问存储器,存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。可以理解为,当你给定一个随机有效的访问地址,RAM会返回其存储内容(随机寻址),它访问速度与地址的无关。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间内随机访问使用的程序。计算机系统里内存地址是一个四字节对齐的地址(32位机),CPU的取指,执行,存储都是通过地址进行的,因此它可以用来做内存。

RAM按照硬件设计的不同,随机存储器又分为DRAM(Dynamic RAM)动态随机存储器和SRAM(Static RAM) 静态随机存储器。

  DRAM它的基本原件是小电容,电容可以在两个极板上短时间内保留电荷,可以通过两极之间有无电压差代表计算机里的0和1,由于电容的物理特性,要定期的为其充电,否则数据会丢失。对电容的充电过程叫做刷新,但是制作工艺较简单,体积小,便于集成化,经常做为计算机里内存制作原件。比如:PC的内存,SDRAM, DDR, DDR2, DDR3等,缺点:由于要定期刷新存储介质,存取速度较慢。

  SRAM它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。因此其存取速度快,但是体积较大,功耗大,成本高,常用作存储容量不高,但存取速度快的场合,比如CPU的L1 cache,L2cache(一级,二级缓存) ,寄存器。

 

为了满足开发的需要s3c2440在出厂时搭载了三种存储介质:

(1)NOR FLASH(2M):ROM存储器,通常用来保存BootLoader,引导系统启动

(2)NAND FLASH(1G/2G,型号不一样,Nandflash大小不一样):保存操作系统映像文件和文件系统

(3)SDRAM(64M):内存,执行程序

  NOR FLASH它的特点是支持XIP芯片内执行(eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中,也就是说可以随机寻址。NOR FLASH的成本较高。

  NAND FLASH:它能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。其成本较低,不支持XIP。可做嵌入式里的数据存储介质。如:手机存储卡,SD卡等。

  S3C2440对外引出27根地址线ADDR0-ADDR26,因此从地址线数目来看S3C2440对外访问的范围只有128MB;而S3C2440的存储管理器的1G地址空间分为8个BANK,cpu同时还引出了8根片选信号nGCS0-nGCS7,分别对应着BANK0-BANK7,当nGCSx引脚拉低即可选中对应的外接设备。这样S3C2440的寻址空间就有1GB了。S3C2440作为32位的cpu,理论可以寻址范围是4GB,一部分用于访问外设--1GB,一部分是cpu内部寄存器的地址,剩下的地址空间没有使用。(注意:这里是物理地址

       

  上图是s3c2440的内存控制器地址空间分布图,左侧图对应不使用Nand flash启动时(通过跳线设置),存储器Bank分布图,通常在这种启动方式里选择Norflash启动,将Nor flash焊接在Bank0, 系统上电后,CPU从Bank0的开始地址0x00000000开始取指运行。上图右侧是选择从Nand flash引导启动(通过跳线设置),系统上电后,CPU会自动将Nandflash里前4K的数据复制到S3C2440内部一个4K大小 SRAM类型存储器里(叫做Steppingstone),然后从Steppingstone取指启动。

 其中Bank0~Bank5可以焊接ROM或SRAM类型存储器,Bank6~Bank7可以焊接ROM,SRAM,SDRAM类型存储器,也就是说,S3C2440的SDRAM内存应该焊接在Bank6~Bank7上,最大支持内存256M,Bank0~Bank5通常焊接一些用于引导系统启动小容量ROM,具体焊接什么样存储器,多大容量,根据每个开发板生产商不同而不同,比如s3c2440开发板将2M的Norflash焊接在了Bank0上,用于存放系统引导程序Bootloader,将两片32M,16Bit位宽SDRAM内存焊接在Bank6和Bank7上,并联形成64M,32位内存。

                 

    sdram内部是一个存储阵列,就像表格一样,将数据填进去,而sdram有四个这样的表格,这4个表格就叫逻辑 Bank(Logical Bank,简称 L-Bank)。 由于技术、成本等原因,不可能只做一个全容量的 L-Bank,而且最重要的是,由于 SDRAM的工作原理限制,单一的 L-Ban k将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在 SDRAM内部分割成多个 L-Bank,目前基本都是 4个(这也是SDRAM规范中的最高L-Bank数量),由此可见,在进行寻址时就要先确定是哪个 L-Bank,然后在这个选定的 L-Bank中选择相应的行与列进行寻址。因此对内存的访问,一次只能是一个 L-Bank工作。对表格进行检索需要先指定一个行,再指定一个列。

               

   cpu对sdram访问:

     1)cpu发出片选信号nSCS0/nSCS6的有效信号,通过选中存储控制器的BANK6来选中sdram芯片(其中nSCS0与nSCS6是同一个引脚的两种功能,拉低哪一个对引脚效果都是一样的)

     2)使用ADDR24和ADDR25作为L-Bank的选择信号,可以选择SDRAM的L-Bank的四个中任意一个

     3)对选中的芯片进行统一的行和列寻址,根据sdram芯片的列地址线数设置存储管理器的相关寄存器,cpu就会从4GB地址中自动分配L-bank选择信号,行地址信号,列地址信号,然后先后发出行地址信号,列地址信号。L-bank选择信号在发出行地址信号的同时并维持到列地址信号结束。

在下图中可以清楚看到行地址和列地址共用地址线ADDR2-ADDR14(BANK6位宽是32,ADDR0/1没有使用),并用sdram的行地址脉冲选择信号nSRAS和列地址脉冲选择信号nSCAS进行区别。当nSRAS有效时,ADDR2-ADDR14上发出的是行地址信号,对应着32位地址空间的bit[23:11];当nSCAS信号有效时,ADDR2-ADDR10上发出的是列地址信号,对应32位地址空间的bit[10:2]。

                

     4)找到存储单元后,对被选芯片进行统一数据传输。Jz2440上用两块SDRAM并联组成32位的位宽,与CPU的32根数据线相连,这样CPU每次可以向内存读取或发送32位的数据。由于BANK6的起始地址是0x30000000,它用13根地址线可寻址64MB,即:寻址范围是0x30000000-0x33FFFFFF。

    SDRAM总的容量(SDRAM寻址空间大小)是2^13*2^9*4 (BANK数)*4 (位宽)/1024/1024=64MB

          

  s3c2440的存储控制器共有13个,而BANK0-BANK5仅仅设置BWSCON和BANKCONx(x=0~5),BANK6,BANK7外接SDRAM时,除了上面需要进行上面两个寄存器的配置,还需要配置REFRESH,BANKDIZE,MRSRB6,MRSRB7。


  存储寄存器的操作:

  首先从NAND Flash启动cpu,cpu会通过内部的硬件将NAND flash开始的4KB数据复制到内部的sram中去,并在0地址开始执行。

  用汇编语言设置好存储控制器,使外接的sdram可用,然后将程序本身从sram复制到sdram中执行。

 

/*********************************************************

**head.s

**功能:设置SDRAM,将程序复制到SDRAM,然后到SDRAM继续执行
**********************************************************/   

.equ        MEM_CTL_BASE,      0x48000000             //相当于c中的宏定义

.equ        SDRAM_BASK,        0x30000000


.text

.global _start

_start:

        bl  disable_watch_dog               //关闭看门狗,否则cpu将会不断进行重启

      bl  memsetup                        //进行存储控制器的设置

      bl  copy_steppingstone_to_sdram     //复制代码到sdram

      ldr pc, =on_sdram                   //跳到sdram中继续执行

on_sdram:

      ldr sp,=0x34000000                  //设置堆栈

      bl  main                            //调用main函数

halt_loop:

      b   halt_loop

disable_watch_dog:

      mov r1,  #0x53000000                //看门狗地址

      mov r2,  #0x0                       //写入0

      str r2,  [r1]

      mov pc,  lr                         //返回

memsetup:

      mov r1,  #MEM_CTL_BASE              //存储控制器的13个寄存器的开始地址

      adrl r2,mem_crg_val                //13个寄存器初始值的地址

      add r3,  r1,#52                    //13*4=52

1:  
    ldr r4,     [r2], #4            @ 读取设置值,并让r2加4
    str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4
    cmp r1,     r3                  @ 判断是否设置完所有13个寄存器
    bne 1b                          @ 若没有写成,继续
    mov pc,     lr                  @ 返回

.align 4
mem_cfg_val:
    @ 存储控制器13个寄存器的设置值
    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .long   0x00000700      @ BANKCON1
    .long   0x00000700      @ BANKCON2
    .long   0x00000700      @ BANKCON3  
    .long   0x00000700      @ BANKCON4
    .long   0x00000700      @ BANKCON5
    .long   0x00018005      @ BANKCON6
    .long   0x00018005      @ BANKCON7
    .long   0x008C07A3      @ REFRESH
    .long   0x000000B1      @ BANKSIZE
    .long   0x00000030      @ MRSRB6
    .long   0x00000030      @ MRSRB7


copy_steppingstone_to_sdram:
    @ 将Steppingstone的4K数据全部复制到SDRAM中去
    @ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
    
    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024
1:  
    ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4
    str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
    cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的未地址?
    bne 1b              @ 若没有复制完,继续
    mov pc,     lr      @ 返回      



原创粉丝点击