zoukankan      html  css  js  c++  java
  • 内存初始化

    1.内存的分类:

     
    (1)SRAM静态RAM,访问速度更快,但是成本高。常用在存储容量不大,速度要求高的场合。比如CPU的垫脚石采用的是SRAM。
     
    (2)DRAM动态:由很多电容组成,需要定期充电保持信息,即刷新,故访问速度慢。
      1.1SDRAM:同步动态随机存储器(synchronous dynamic random access memory)
      同步:他的工作(命令传送和数据传输)要以同步时钟为基准。
      动态:不断刷新来保持信息。
      随机:不是线性按照地址存放信息,而是指定任意地址存放数据。
     
      1.2DDR(double data rate SDRAM)和DDR2:双倍速率同步动态随机存储器。基于SDRAM,不仅在时钟上升沿可以存储数据,在下降沿也可以,从而速度翻倍。
      而DDR2则是在DDR的基础上再翻倍。
     
      1.3;2440用的是SDRAM,6410用的是DDR,210用的是DDR2.
     
    2.内存的内部结构
     
      2.1表结构:内存的存储结构就像一张表格,每一个单元格都可以存放数
      2.2L_BANK:逻辑块,每一张表称之为L_BANK。由于技术,成本等原因无法将所有的单元格做在同一张表格(L_BANK),所以一个内存通常分为多个L_BNAK,通常为4块。
      2.3寻址信息:
      (1)L_BANK片选信号
      (2)行地址  
      (3)列地址
     
    3.容量计算 = 4 (L_BANK数目)x 单元格数目 x单元格容量
     
    4.2440内存初始化:
      4.1:地址空间:
      (1)地址线:2440对外提供27条地址线,只能访问128MB的外设空间。
      (2)片选信号:8个片选信号,扩大可访问的外设空间到1GB。
      (3)外设空间:有2440的datasheet知道他将1GB分成8部分,即8块,通过不同的片选信号来访问不同的块空间。其中内存从band6开始(0x30000000),有可能 占用band7。
      (4)存储器控制器:所谓对内存初始化,实质上是对CPU的存储器控制器进行初始化,由他对给出的地址进行分析转换得到片选信号和行列地址。而CPU和内部寄存器之间的访问则是通过CPU内部的32位总线进行的。
      4.2:内存芯片连接
      由于每个单元格的容量是16bit,即内存芯片的数据宽度是16bit,而CPU的数据宽度是32bit,为了避免浪费,就用两块内存芯片并联,使得每一次cpu对内存访问的时候可以一次性取出32bit的数据。分为高16bit和低16bit。
    当然不可避免的要涉及到片选信号,L_BANK选择信号,行列地址信号。
      4.3存储器控制器寄存器
      设置13个寄存器,要查阅2440的datasheet以及内存的datasheet,然后看时序图,找出寄存器的某些位控制的参数所需要设置的值。最后要学会在汇编里用循环的方式来给寄存器赋值。
      5.  理论上2440可以寻址4GB,总体上分为内部空间和外设空间。外设空间又分为8个bank,每个bank为128MB
      6.  6410也可以寻址4GB空间,但是6410把地址空间划分为三个部分,一个是保留区(高2GB),一个是外设区(256MB),一个是主存储区(1972MB)。  
    主存储区又分为五个部分
     
    (1)boot镜像区:不匹配任意硬件外设,负责把相应的外设映射到该处。CPU上电后从这里取指运行。
    (2)内部存储区:分两个部分:IROM和ISRAM,虽然理论上各有64MB,但是IROM实际有效的只有32KB,ISRAM有效的只有8KB
    (3)静态存储区:类似于2440的外设区,分成6个bank,可以接NORFLASH,onenand等外设。
    (4)保留区:256MB,不用
    (5)动态存储区:就是用来连接内存的,所以6410的内存起始地址是0x50000000

    下面主讲6410内存初始化

    打开6410的手册192页

    先看第一句,翻译过来就是给memc_cmd寄存器写入0b100,使DRAM寄存器处于配置的状态。

    我们找到这个memc_cmd寄存器,地址是0x7e001004,所以代码如下ldr r0, =0x7e001004ldr r0, =0x7e001004

    ldr r0, =0x7e001004
    mov r1, #0x4
    str r1, [r0]

    这就使DRAM寄存器处于配置的状态。

    接着看第二句,写内存时序参数、芯片配置、和身份配置寄存器

    这一部分和2440的芯片的内存配置差不多,不一样的是2440的内存配置只有这么多,没有上面的使DRAM寄存器处于配置的状态。

    接下来就一个一个配置寄存器

    这个寄存器有32位,每个位都有说明,具体看对这个寄存器的说明

    31位到23位是被保留的,所以不需要看。

    接下来的这个位具体要看你板子上的内存芯片的参数来配置,所以我只能按照我的板子来设置。

    ldr r0, =0x7e00100c      
    ldr r1, =0x00010012   
    str r1, [r0]

    再接着是这个寄存器

    这个是设置DRAM的刷新周期,只有0~14位

    ldr r0, =0x7e001010  
    ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )      
    str r1, [r0]

    这个具体为什么刷新时间这个数,我目前也没弄清楚

    再接着是这个寄存器

    具体什么意思看英文,是这样设置

    ldr r0, =0x7e001014    
    mov r1, #(3 << 1)
    str r1, [r0]

    由于寄存器众多,这里就不再一一讲解

    给出第二步的初始化代码

        ldr r0, =0x7e001010  
        ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )      
        str r1, [r0]
    
        ldr r0, =0x7e001014     
        mov r1, #(3 << 1)
        str r1, [r0]
    
        ldr r0, =0x7e001018   
        mov r1, #0x1
        str r1, [r0]
    
        ldr r0, =0x7e00101c    
        mov r1, #0x2
        str r1, [r0]
    
        ldr r0, =0x7e001020      
        ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e001024   
        ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e001028      
        ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e00102c       
        ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e001030     
        ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e001034     
        ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e001038      
        ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e00103c    
        mov r1, #0x07
        str r1, [r0]
    
        ldr r0, =0x7e001040    
        mov r1, #0x02
        str r1, [r0]
    
        ldr r0, =0x7e001044     
        ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e001048    
        ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )
        str r1, [r0]
    
        ldr r0, =0x7e00100c 
        ldr r1, =0x00010012      
        str r1, [r0]
        
        ldr r0, =0x7e00104c
        ldr r1, =0x0b45  
        str r1, [r0]
    
        ldr r0, =0x7e001200   
        ldr r1, =0x150f8
        str r1, [r0]
    
        ldr r0, =0x7e001304     
        mov r1, #0x0
        str r1, [r0]

    这里第二步就结束

    接下来看第三步

    等待200us的系统上电和时钟稳定

    接下来第四步

    执行内存初始化程序

    代码如下

        @issue NOP
        ldr r0, =0x7e001008
        ldr r1, =0xc0000
        str r0, [r0]
        
        @issue prechargeall
        ldr r0, =0x7e001008
        ldr r1, =0x0
        str r0, [r0]
        
        @issue refresh
        ldr r0, =0x7e001008
        ldr r1, =0x4
        str r0, [r0]
        
        @issue refresh
        ldr r0, =0x7e001008
        ldr r1, =0x4
        str r0, [r0]
        
        @issue mrs
        ldr r0, =0x7e001008
        ldr r1, =0xa0000
        str r1, [r0]
        
        @issue mrs
        ldr r0, =0x7e001008
        ldr r1, =0x80032
        str r1,[r0]

    接下来第五步

    给这个memc_cmd寄存器写入000,是他处于等待状态

        ldr r0, =0x7e001004
        mov r1, #0x0
        str r1, [r0]

    接下来第六步

    检查内存的状态是否为b01,01就代表着准备

        
    check_ready:
        ldr r0, =0x7e001000
        ldr r1, [r0]
        mov r2, #0x3
        and r1, r1, r2
        cmp r1, #0x1
        bne check_ready
        
        mov pc, lr

    到这里6410初始化就完成了

    下面附上2440内存初始化程序

    #define mem_contrl 0x48000000
    init_sdram:
        ldr r0, =mem_contrl 
        add r3, r0, #4*13
        adrl r1, mem_data
    
    0:
        ldr r2, [r1], #4
        str r2, [r0], #4
        cmp r0, r3
        bne 0b
        mov pc, lr
    
    mem_data:
        .long 0x22000000 
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00018001
        .long 0x00018001
        .long 0x008c04f5
        .long 0x000000b1
        .long 0x00000030
        .long 0x00000030
  • 相关阅读:
    算法5--排序
    算法4---数组
    算法3---字符串
    算法2---链表4---单循环链表
    wcf精通1-15
    框架技术细节
    Achieving High Availability and Scalability
    Windows平台下利用APM来做负载均衡方案
    Windows平台分布式架构实践
    web api control注册及重写DefaultHttpControllerSelector、ApiControllerActionSelector、ApiControllerActionInvoker
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/8361981.html
Copyright © 2011-2022 走看看