首页 > 代码库 > 9.内存的了解
9.内存的了解
9.内存的了解
内存由于具备访问速度快,访问方式简单等优点,成为了PC或者是嵌入式硬件平台上不可或缺的元件。在开始学习如何使用内存之前,非常有必要先了解一下内存的分类:
????1.1内存分类:
1.2 DRAM分类
?
????2.内存内部结构:
????包括:表结构,L-Bank,寻址信息(包括L-Bank选择信号和行地址)。
????2.1表结构:
?
?
?
?
?
?
?
?
?
?
?
?
?
????2.2L-Bank的结构:
????2.3:寻址信息:
?
?
?
?
?
?
?
?
?
????6410内存初始化:
?
- 地址空间:
?
外设区是放寄存器的,主存储区又被分为五个子区:
?
?
?
?
?
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
?
?
?
?
?
?
?
?
?
?
?
安装教程打的代码运行不了,按照给的代码改过来能运行:
?
?
?
?
9.内存的了解