zoukankan      html  css  js  c++  java
  • 9.内存的了解

    9.内存的了解

    内存由于具备访问速度快,访问方式简单等优点,成为了PC或者是嵌入式硬件平台上不可或缺的元件。在开始学习如何使用内存之前,非常有必要先了解一下内存的分类:

        1.1内存分类:

    1.2 DRAM分类

        2.内存内部结构:

        包括:表结构,L-Bank,寻址信息(包括L-Bank选择信号和行地址)。

        2.1表结构:

        2.2L-Bank的结构:

        2.3:寻址信息:

        6410内存初始化:

    1. 地址空间:

    外设区是放寄存器的,主存储区又被分为五个子区:

    1.1:主存储区-划分:

    内存初始化

    下面我们来完成内存初始化的工作:

    图一

    如图一,我们知道第一项工作是往我们的memc_cmd的域入b100,让我们的DRAM Controller进入config状态。这个域是在我们的P1MEMCCMD这个寄存器里面:

    代码操作:

    接下来是第二项工作:初始化以下的寄存器:

    Write memory timing parameter, chip configuration, and id configuration registers.

    我们从上面知道。第三步是可以不做的:

    接下来进入第四步:Execute memory initialization sequence.内存初始化系列:

    由上面的图知道,第一件事是把direct_cmd寄存器相应的位写入b10,让它发出一个nop的指令。下面是该寄存器的地址:

    上面知道,要让系统发出nop命令,18,19位是等于11的。上面的10是错的。其他的是0.所以我们只要往该寄存器的18,19位写入11即可:代码:

    第二件事是往我们的direct_cmd相应的位写入00,让它发出prechargeall命令:

    代码:

    第三项工作:

    连续两次:

    第五项工作:

    这个我们是参考uboot的参数的:

    代码:

    第五件事:这样就完成了我们的第四件事Execute memory initialization sequence,接下来是第五件事:Program memc_cmd to '3'b000', which makes DRAM Controller enter 'Ready' state.就是往我们的寄存器写入0,让我们的controller进入ready的状态:

    第六件事就是检查是否ready了:

    从文字知道,我们得去看memc_stat这个寄存器:

    我们看到最低的两位,就是状态位,所以要检查最低两位的值是否为01:

    其实到这里,我们内存的初始化还没完成,就是在开头的时候,我们的落下的那几行代码:

    这是用来干什么的呢?我们来看看手册:

    该寄存器最重要的是第7位:

    上面应该是31-16位:当这一位是0的时候,

    如果第7位是0,上面的16-31这16个pin角,就用来作为我们的数据线。若果是1,就被我们的SROMC使用的。所以这一位是设置为0.

    这样就写好了:make:

    下载到开发板,led亮起来。

    中间的代码没有讲------对应的是如下 :自学:

    下面是Uboot里的代码实现:uboot_ok6410/cpu/s3c64xx/s3c6410/cpu_init.S:

    #include <config.h>

    #include <s3c6410.h>

        .globl mem_ctrl_asm_init

    mem_ctrl_asm_init:

        ldr    r0, =ELFIN_MEM_SYS_CFG            @Memory sussystem address 0x7e00f120

        mov    r1, #0xd                @ Xm0CSn2 = NFCON CS0, Xm0CSn3 = NFCON CS1

        str    r1, [r0]

        ldr    r0, =ELFIN_DMC1_BASE            @DMC1 base address 0x7e001000

        ldr    r1, =0x04

        str    r1, [r0, #INDEX_DMC_MEMC_CMD]

        ldr    r1, =DMC_DDR_REFRESH_PRD

        str    r1, [r0, #INDEX_DMC_REFRESH_PRD]

        ldr    r1, =DMC_DDR_CAS_LATENCY

        str    r1, [r0, #INDEX_DMC_CAS_LATENCY]

        ldr    r1, =DMC_DDR_t_DQSS

        str    r1, [r0, #INDEX_DMC_T_DQSS]

        ldr    r1, =DMC_DDR_t_MRD

        str    r1, [r0, #INDEX_DMC_T_MRD]

        ldr    r1, =DMC_DDR_t_RAS

        str    r1, [r0, #INDEX_DMC_T_RAS]

        ldr    r1, =DMC_DDR_t_RC

        str    r1, [r0, #INDEX_DMC_T_RC]

        ldr    r1, =DMC_DDR_t_RCD

        ldr    r2, =DMC_DDR_schedule_RCD

        orr    r1, r1, r2

        str    r1, [r0, #INDEX_DMC_T_RCD]

        ldr    r1, =DMC_DDR_t_RFC

        ldr    r2, =DMC_DDR_schedule_RFC

        orr    r1, r1, r2

        str    r1, [r0, #INDEX_DMC_T_RFC]

        ldr    r1, =DMC_DDR_t_RP

        ldr    r2, =DMC_DDR_schedule_RP

        orr    r1, r1, r2

        str    r1, [r0, #INDEX_DMC_T_RP]

        ldr    r1, =DMC_DDR_t_RRD

        str    r1, [r0, #INDEX_DMC_T_RRD]

        ldr    r1, =DMC_DDR_t_WR

        str    r1, [r0, #INDEX_DMC_T_WR]

        ldr    r1, =DMC_DDR_t_WTR

        str    r1, [r0, #INDEX_DMC_T_WTR]

        ldr    r1, =DMC_DDR_t_XP

        str    r1, [r0, #INDEX_DMC_T_XP]

        ldr    r1, =DMC_DDR_t_XSR

        str    r1, [r0, #INDEX_DMC_T_XSR]

        ldr    r1, =DMC_DDR_t_ESR

        str    r1, [r0, #INDEX_DMC_T_ESR]

        ldr    r1, =DMC1_MEM_CFG

        str    r1, [r0, #INDEX_DMC_MEMORY_CFG]

        ldr    r1, =DMC1_MEM_CFG2

        str    r1, [r0, #INDEX_DMC_MEMORY_CFG2]

        ldr    r1, =DMC1_CHIP0_CFG

        str    r1, [r0, #INDEX_DMC_CHIP_0_CFG]

        ldr    r1, =DMC_DDR_32_CFG

        str    r1, [r0, #INDEX_DMC_USER_CONFIG]

        @DMC0 DDR Chip 0 configuration direct command reg

        ldr    r1, =DMC_NOP0

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @Precharge All

        ldr    r1, =DMC_PA0

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @Auto Refresh    2 time

        ldr    r1, =DMC_AR0

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @MRS

        ldr    r1, =DMC_mDDR_EMR0

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @Mode Reg

        ldr    r1, =DMC_mDDR_MR0

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

    #ifdef CONFIG_SMDK6410_X5A

        ldr    r1, =DMC1_CHIP1_CFG

        str    r1, [r0, #INDEX_DMC_CHIP_1_CFG]

        @DMC0 DDR Chip 0 configuration direct command reg

        ldr    r1, =DMC_NOP1

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @Precharge All

        ldr    r1, =DMC_PA1

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @Auto Refresh    2 time

        ldr    r1, =DMC_AR1

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @MRS

        ldr    r1, =DMC_mDDR_EMR1

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

        @Mode Reg

        ldr    r1, =DMC_mDDR_MR1

        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]

    #endif

        @Enable DMC1

        mov    r1, #0x0

        str    r1, [r0, #INDEX_DMC_MEMC_CMD]

    check_dmc1_ready:

        ldr    r1, [r0, #INDEX_DMC_MEMC_STATUS]

        mov    r2, #0x3

        and    r1, r1, r2

        cmp    r1, #0x1

        bne    check_dmc1_ready

        nop

    mov    pc, lr

    /* Below code is for ARM926EJS and ARM1026EJS */

        .globl cleanDCache

    cleanDCache:

        mrc    p15, 0, pc, c7, c10, 3    /* test/clean D-Cache */

        bne    cleanDCache

        mov    pc, lr

        .globl cleanFlushDCache

    cleanFlushDCache:

        mrc    p15, 0, pc, c7, c14, 3    /* test/cleanflush D-Cache */

        bne    cleanFlushDCache

        mov    pc, lr

        .globl cleanFlushCache

    cleanFlushCache:

        mrc    p15, 0, pc, c7, c14, 3    /* test/cleanflush D-Cache */

        bne    cleanFlushCache

        mcr    p15, 0, r0, c7, c5, 0    /* flush I-Cache */

        mov    pc, lr

        .ltorg

    安装教程打的代码运行不了,按照给的代码改过来能运行:

  • 相关阅读:
    Eureka Server的多级缓存和过期机制
    eureka-client拉取注册表
    Ribbon的调用流程
    EurekaServer启动
    eureka的注册
    Eureka的客户端是怎么启动的?
    Ribbon的负载均衡源码
    Ribbon是怎么重构URL的?
    Maven添加本地jar
    window 常用软件记录
  • 原文地址:https://www.cnblogs.com/FORFISH/p/4203873.html
Copyright © 2011-2022 走看看