• u-boot分析(七)----内存初始化


    u-boot分析(七)

      上篇博文我们按照210的启动流程,分析到了时钟初始化,今天我们继续按照u-boot的启动流程对内存的初始化进行分析。

    今天我们会用到的文档:

    1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949

    2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965

    3.        210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)

    4.        内存芯片手册:大家根据自己的内存芯片去找相应的芯片手册

     

    内存的初始化也是比较复杂我们今天会通过以下几点,对内存的初始化进行介绍:

    1.      内存基本分类

    2.      深入认识内存

    3.      编程分析

     

    l  内存基本分类

    为了让大家对内存有个初步的认识,简单介绍其分类

    1.       DRAM

    有小电容组成,需要刷新(充电),所以导致速度较慢

    1)        SDRAM2440常用)

    2)        DDR6410常用)

    3)        DDR2210常用)

    4)        其他衍生产品

    以上几种都是速度依次增高。

    2.       SRAM

    不用刷新,速度快,价格昂贵,比如我们前面提到的垫脚石就是采用的是SRAM

    l  深入认识DRAM

    1.       表结构:

    内存的内部结构如同一张表格,我们称为l-bank类似与下图,其中每个单元格中可以存放数据

    2.       内存寻址

    内存经过以下信息进行寻址

    1)        L-Bank

    一方面由于技术、成本等原因,不可能只做一个全容量的L-Bank,而另一方面由于SDRAM的工作原理限制,单一的L-Bank将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在SDRAM内部分割成多个L-Bank

    因此我们在寻址时就要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择行列地址进行寻址。

    2)        行地址(Row

    3)        列地址(Column

    上面已经说明了内存的寻址方法,其实其内部构造如下图

    3.       内存芯片容量的计算

    内存芯片的容量就是所有的L-Bank中的存储单元的总容量,那么我们可以得到总的存储单元数量

     

    存储单元数量=行数×列数(一个L-Bank的存储单元数量)×L-Bank的数量

    那么如何知道一个存储单元的容量呢?其实在内存芯片的文档中都会有说明,大家可以自己找找看。大家也可以参考其芯片命名进行计算,这里有篇博文简单分析了常见内存芯片的命名规则http://blog.chinaunix.net/uid-20964486-id-1831487.html

     

    经过上述内容我们对内存有了一定的了解,接下来我们分析其编程方法。

    l  编程分析

    我们的芯片通过存储控制器对内存进行访问,我们对内存的初始化起始就是对控制器的初始化,所以我们知道怎么对存储控制器进行初始化,下面以210为例进行分析

    1.       初始化流程

    通过阅读210的芯片手册(24406410也有类似的东西),很轻松我们在可以找到其给出的初始化配置过程

    2.       内存的位置

    本以为拿到了内存的初始化流程,就可以开始写代码了,但是在写的过程中会发现其有部分硬件的东西需要了解一下,首先是内存的位置,再以前的博文中说过地址布局的问题,下面以210为例进行分析:

    从上图可知210DRAM分为两个区域,DRAM0DRAM1总共为1.5G大小,分别通过DMC0DMC1进行控制,我们要根据自己手头的板子进行确定。

    3.       代码分析

    有了上面的DDR2的初始化流程和地址布局的分析,我们就不难理解210内存的初始化代码,由于u-boot代码太多看着不太清楚,我将自己按照流程写的代码给大家分享一下

     

      1 #define DMC_PHYCONTROL0 0xf0000018
      2 #define DMC_PHYCONTROL1 0xf000001c
      3 #define DMC_CONCONTROL  0xf0000000
      4 #define DMC_MEMCONTROL  0xf0000004
      5 #define DMC_MEMCONFIG0  0xf0000008
      6 #define DMC_MEMCONFIG1  0xf000000c
      7 #define DMC_PRECHCONFIG 0xf0000014
      8 #define DMC_TIMINGAREF     0xf0000030
      9 #define DMC_TIMINGROW     0xf0000034
     10 #define DMC_TIMINGDATA     0xf0000038
     11 #define DMC_TIMINGPOWER 0xf000003c
     12 #define DMC_PHYSTATUS   0xf0000040
     13 #define DMC_DIRECTCMD     0xf0000010
     14 #define DMC_PWRDNCONFIG 0xf0000028
     15 
     16 #define DMC0_MEMCONTROL            0x00202400
     17 #define DMC0_MEMCONFIG_0        0x20F00313    
     18 #define DMC0_MEMCONFIG_1        0x00F00313    
     19 
     20 #define DMC0_TIMINGA_REF        0x00000618
     21 #define DMC0_TIMING_ROW         0x2B34438A
     22 #define DMC0_TIMING_DATA        0x24240000
     23 #define DMC0_TIMING_PWR         0x0BDC0343      
     24 
     25 
     26 
     27 .globl init_mem
     28 init_mem:
     29     @ step 2.1
     30     ldr    r0, =DMC_PHYCONTROL0
     31     ldr    r1, =0x00101000                
     32     str    r1, [r0]
     33     
     34     ldr    r0, =DMC_PHYCONTROL1
     35     ldr    r1, =0x00000086                
     36     str    r1, [r0]
     37     
     38     @ step 2.2
     39     ldr    r0, =DMC_PHYCONTROL0
     40     ldr    r1, =0x00101002                    
     41     str    r1, [r0]
     42     
     43 
     44     
     45     @ step 4
     46     ldr    r0, =DMC_PHYCONTROL0
     47     ldr    r1, =0x00101003                    
     48     str    r1, [r0]
     49     
     50     @ step 5
     51     ldr    r0, =DMC_CONCONTROL                
     52     ldr    r1, =0x0FFF1350
     53     str    r1, [r0]
     54     
     55     @ step 6
     56     ldr    r0, =DMC_MEMCONTROL
     57     ldr    r1, =DMC0_MEMCONTROL                
     58     str    r1, [r0]
     59     
     60     @ step 7
     61     ldr    r0, =DMC_MEMCONFIG0
     62     ldr    r1, =DMC0_MEMCONFIG_0                
     63     str    r1, [r0]
     64     
     65     @ step 8
     66     ldr    r0, =DMC_PRECHCONFIG
     67     ldr    r1, =0xFF000000                    
     68     str    r1, [r0]
     69     
     70     @ step 9.1
     71     ldr    r0, =DMC_TIMINGAREF
     72     ldr    r1, =DMC0_TIMINGA_REF                
     73     str    r1, [r0]
     74     
     75     @ step 9.2
     76     ldr    r0, =DMC_TIMINGROW
     77     ldr    r1, =DMC0_TIMING_ROW                
     78     str    r1, [r0]
     79     
     80     @ step 9.3
     81     ldr    r0, =DMC_TIMINGDATA
     82     ldr    r1, =DMC0_TIMING_DATA                
     83     str    r1, [r0]
     84     
     85     @ step 9.4
     86     ldr    r0, =DMC_TIMINGPOWER
     87     ldr    r1, =DMC0_TIMING_PWR                
     88     str    r1, [r0]
     89     
     90     @ step 11
     91 wait_lock:
     92     ldr    r0, =DMC_PHYSTATUS 
     93     ldr    r1, [r0]            
     94     and    r2, r1, #0x4
     95     cmp    r2, #0x4                    
     96     bne    wait_lock
     97 
     98     @ step 14
     99     ldr    r0, =DMC_DIRECTCMD
    100     ldr    r1, =0x07000000                    
    101     str    r1, [r0]
    102     
    103     @ step 16
    104     ldr    r1, =0x01000000                    
    105     str    r1, [r0]
    106     
    107     @ step 17
    108     ldr    r1, =0x00020000                    
    109     str    r1, [r0]
    110     
    111     @ step 18
    112     ldr    r1, =0x00030000                    
    113     str    r1, [r0]
    114     
    115     @ step 19
    116     ldr    r1, =0x00010400                    
    117     str    r1, [r0]
    118     
    119     @ step 20
    120     ldr    r1, =0x00000542                    
    121     str    r1, [r0]
    122     
    123     @ step 21
    124     ldr    r1, =0x01000000                    
    125     str    r1, [r0]
    126     
    127     @ step 22.1 
    128     ldr    r1, =0x05000000                    
    129     str    r1, [r0]
    130     
    131     @ step 22.2
    132     ldr    r1, =0x05000000                    
    133     str    r1, [r0]
    134     
    135     @ step 23
    136     ldr    r1, =0x00000442                    
    137     str    r1, [r0]
    138     
    139     @ step 25.1
    140     ldr    r1, =0x00010780                    
    141     str    r1, [r0]
    142     
    143     @ step 25.2
    144     ldr    r1, =0x00010400                    
    145     str    r1, [r0]
    146     
    147     @ step 26, repeat step14~step25
    148     ldr    r1, =0x07100000                    
    149     str    r1, [r0]
    150     
    151     ldr    r1, =0x01100000                    
    152     str    r1, [r0]
    153     
    154     ldr    r1, =0x00120000                    
    155     str    r1, [r0]
    156     
    157     ldr    r1, =0x00130000                    
    158     str    r1, [r0]
    159     
    160     ldr    r1, =0x00110400                    
    161     str    r1, [r0]
    162     
    163     ldr    r1, =0x00100542                    
    164     str    r1, [r0]
    165     
    166     ldr    r1, =0x01100000                    
    167     str    r1, [r0]
    168     
    169     ldr    r1, =0x05100000                    
    170     str    r1, [r0]
    171     
    172     ldr    r1, =0x05100000                    
    173     str    r1, [r0]
    174     
    175     ldr    r1, =0x00100442                    
    176     str    r1, [r0]
    177     
    178     ldr    r1, =0x00110780                    
    179     str    r1, [r0]
    180     
    181     ldr    r1, =0x00110400                    
    182     str    r1, [r0]
    183     
    184     @ step 27
    185     ldr     r0, =DMC_CONCONTROL
    186     ldr    r1, =0x0FF02030                    
    187     str    r1, [r0]
    188     
    189     ldr     r0, =DMC_PWRDNCONFIG
    190     ldr    r1, =0xFFFF00FF                    
    191     str    r1, [r0]
    192     
    193     ldr     r0, =DMC_CONCONTROL
    194     ldr    r1, =0x00202400                    
    195     str    r1, [r0]
    196 
    197     mov    pc, lr

     

     

  • 相关阅读:
    Windows进程端口相关命令
    SpringMVC获取请求的匹配方法对应的路径
    Feign配置远程调用时携带原请求的token
    LINUX的patch文件 何打patch
    如何制作LINUX的patch文件及如何打patch
    (转) 跟我一起写 Makefile --- 陈皓
    u-boot移植到mini2440,增加DM9000驱动的学习笔记
    DNW PL2303驱动解决问题
    kermit的安装,配置
    wpf中bool按钮三种方式
  • 原文地址:https://www.cnblogs.com/wrjvszq/p/4234451.html
Copyright © 2020-2023  润新知