u-boot分析(七)----内存初始化
2015-01-19 18:09
369 查看
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) SDRAM(2440常用)
2) DDR(6410常用)
3) DDR2(210常用)
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的芯片手册(2440、6410也有类似的东西),很轻松我们在可以找到其给出的初始化配置过程
2. 内存的位置
本以为拿到了内存的初始化流程,就可以开始写代码了,但是在写的过程中会发现其有部分硬件的东西需要了解一下,首先是内存的位置,再以前的博文中说过地址布局的问题,下面以210为例进行分析:
从上图可知210的DRAM分为两个区域,DRAM0和DRAM1总共为1.5G大小,分别通过DMC0和DMC1进行控制,我们要根据自己手头的板子进行确定。
3. 代码分析
有了上面的DDR2的初始化流程和地址布局的分析,我们就不难理解210内存的初始化代码,由于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) SDRAM(2440常用)
2) DDR(6410常用)
3) DDR2(210常用)
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的芯片手册(2440、6410也有类似的东西),很轻松我们在可以找到其给出的初始化配置过程
2. 内存的位置
本以为拿到了内存的初始化流程,就可以开始写代码了,但是在写的过程中会发现其有部分硬件的东西需要了解一下,首先是内存的位置,再以前的博文中说过地址布局的问题,下面以210为例进行分析:
从上图可知210的DRAM分为两个区域,DRAM0和DRAM1总共为1.5G大小,分别通过DMC0和DMC1进行控制,我们要根据自己手头的板子进行确定。
3. 代码分析
有了上面的DDR2的初始化流程和地址布局的分析,我们就不难理解210内存的初始化代码,由于u-boot代码太多看着不太清楚,我将自己按照流程写的代码给大家分享一下
#define DMC_PHYCONTROL0 0xf0000018 #define DMC_PHYCONTROL1 0xf000001c #define DMC_CONCONTROL 0xf0000000 #define DMC_MEMCONTROL 0xf0000004 #define DMC_MEMCONFIG0 0xf0000008 #define DMC_MEMCONFIG1 0xf000000c #define DMC_PRECHCONFIG 0xf0000014 #define DMC_TIMINGAREF 0xf0000030 #define DMC_TIMINGROW 0xf0000034 #define DMC_TIMINGDATA 0xf0000038 #define DMC_TIMINGPOWER 0xf000003c #define DMC_PHYSTATUS 0xf0000040 #define DMC_DIRECTCMD 0xf0000010 #define DMC_PWRDNCONFIG 0xf0000028 #define DMC0_MEMCONTROL 0x00202400 #define DMC0_MEMCONFIG_0 0x20F00313 #define DMC0_MEMCONFIG_1 0x00F00313 #define DMC0_TIMINGA_REF 0x00000618 #define DMC0_TIMING_ROW 0x2B34438A #define DMC0_TIMING_DATA 0x24240000 #define DMC0_TIMING_PWR 0x0BDC0343 .globl init_mem init_mem: @ step 2.1 ldr r0, =DMC_PHYCONTROL0 ldr r1, =0x00101000 str r1, [r0] ldr r0, =DMC_PHYCONTROL1 ldr r1, =0x00000086 str r1, [r0] @ step 2.2 ldr r0, =DMC_PHYCONTROL0 ldr r1, =0x00101002 str r1, [r0] @ step 4 ldr r0, =DMC_PHYCONTROL0 ldr r1, =0x00101003 str r1, [r0] @ step 5 ldr r0, =DMC_CONCONTROL ldr r1, =0x0FFF1350 str r1, [r0] @ step 6 ldr r0, =DMC_MEMCONTROL ldr r1, =DMC0_MEMCONTROL str r1, [r0] @ step 7 ldr r0, =DMC_MEMCONFIG0 ldr r1, =DMC0_MEMCONFIG_0 str r1, [r0] @ step 8 ldr r0, =DMC_PRECHCONFIG ldr r1, =0xFF000000 str r1, [r0] @ step 9.1 ldr r0, =DMC_TIMINGAREF ldr r1, =DMC0_TIMINGA_REF str r1, [r0] @ step 9.2 ldr r0, =DMC_TIMINGROW ldr r1, =DMC0_TIMING_ROW str r1, [r0] @ step 9.3 ldr r0, =DMC_TIMINGDATA ldr r1, =DMC0_TIMING_DATA str r1, [r0] @ step 9.4 ldr r0, =DMC_TIMINGPOWER ldr r1, =DMC0_TIMING_PWR str r1, [r0] @ step 11 wait_lock: ldr r0, =DMC_PHYSTATUS ldr r1, [r0] and r2, r1, #0x4 cmp r2, #0x4 bne wait_lock @ step 14 ldr r0, =DMC_DIRECTCMD ldr r1, =0x07000000 str r1, [r0] @ step 16 ldr r1, =0x01000000 str r1, [r0] @ step 17 ldr r1, =0x00020000 str r1, [r0] @ step 18 ldr r1, =0x00030000 str r1, [r0] @ step 19 ldr r1, =0x00010400 str r1, [r0] @ step 20 ldr r1, =0x00000542 str r1, [r0] @ step 21 ldr r1, =0x01000000 str r1, [r0] @ step 22.1 ldr r1, =0x05000000 str r1, [r0] @ step 22.2 ldr r1, =0x05000000 str r1, [r0] @ step 23 ldr r1, =0x00000442 str r1, [r0] @ step 25.1 ldr r1, =0x00010780 str r1, [r0] @ step 25.2 ldr r1, =0x00010400 str r1, [r0] @ step 26, repeat step14~step25 ldr r1, =0x07100000 str r1, [r0] ldr r1, =0x01100000 str r1, [r0] ldr r1, =0x00120000 str r1, [r0] ldr r1, =0x00130000 str r1, [r0] ldr r1, =0x00110400 str r1, [r0] ldr r1, =0x00100542 str r1, [r0] ldr r1, =0x01100000 str r1, [r0] ldr r1, =0x05100000 str r1, [r0] ldr r1, =0x05100000 str r1, [r0] ldr r1, =0x00100442 str r1, [r0] ldr r1, =0x00110780 str r1, [r0] ldr r1, =0x00110400 str r1, [r0] @ step 27 ldr r0, =DMC_CONCONTROL ldr r1, =0x0FF02030 str r1, [r0] ldr r0, =DMC_PWRDNCONFIG ldr r1, =0xFFFF00FF str r1, [r0] ldr r0, =DMC_CONCONTROL ldr r1, =0x00202400 str r1, [r0] mov pc, lr
相关文章推荐
- 关于u-boot-1.1.6对S3C2440开发板内存初始化的研究(转)
- u-boot第一阶段初始化流程(反汇编分析)
- Tiny210(S5PV210) U-BOOT(十一)----DDR2初始化源码分析
- u-boot中nandflash初始化流程分析(转)
- linux-3.2.36内核启动4-setup_arch中的内存初始化3(arm平台 bootmem_init源码分析)
- 调试中常见Bug分析 – 内存错误(使用未初始化内存)
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(内存初始化)
- linux-3.2.36内核启动3-setup_arch中的内存初始化2(arm平台 分析建立页表)
- [置顶] linux内核启动2-setup_arch中的内存初始化(目前分析高端内存)
- 第十三章、Tiny4412 U-BOOT移植十三 DDR3初始化源码分析
- U-boot之flash初始化完全代码分析
- u-boot_smdkv210 分析六:内存分配
- 关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
- linux-3.2.36内核启动4-setup_arch中的内存初始化3(arm平台 bootmem_init源码分析)
- u-boot_smdkv210 分析:内存分配
- Linux中的内存分配和释放之__alloc_boot函数分析
- Linux内存分析(2) -- mm\bootmem.c
- u-boot中nandflash初始化流程分析(转)
- linux-3.2.36内核启动2-setup_arch中的内存初始化1(arm平台 分析高端内存和初始化memblock)
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(内存初始化)