裸机——DDR
1.DDR介绍
DDR,是SDRAM的改进,是双通道的SDRAM,
SDRAM是同步动态随机访问存储器。
SDRAM与SRAM相对于,二者的特点是:
SDRAM 需要初始化,使用时许访问,价格便宜。
SRAM 不需要初始化,价格贵。
与之相似的还有 Norflash 和 Nandflash
RAM之所掉电丢失数据,是因为RAM使用电容实现0,1二进制表示。
最后,还需要了解,地球上制造RAM的公司多,但是一线大厂只有几家,一线大厂的RAM各有不同,但是二线厂商的RAM都向一线厂商靠,所以二线厂商的DDR如果是使用三星的SoC,那么直接使用三星的DDR初始化程序都可能成功初始化二线厂商的DDR。
2.初始化DDR
(1)首先看原理图
看原理图的目的:
获得板子上的DDR芯片名
知道板子上的DDR是怎么接的
下面是 SoC 上给DDR的接口:

可以看出:
这款SoC有三个接口,
每个接口的先分为三类:数据线,地址线,时序线,
另外注意到地址线并不是 32根,而是14根,这说明一个接口可以连接的内存片存储最大值为 2^14B
然后再看接的内存片的原理图:


可以看出:
实际使用SoC内存接口为:Port1, Port2
芯片正好与SoC的接口对齐,也分为:数据线,地址线,时序线,并且注意BA0,BA1,BA2位片选线(后面会用)
芯片无晶振,说明使用SoC提供频率,由于SoC频率低,所以芯片本身需要倍频,
一片内存位宽为16位,使用两片构成32位。
芯片信号:K4T1G164QQ
总结:
通过查看原理图,了解开发板上芯片和SoC的连接情况,和芯片编号。
接下来利用芯片编号,找到芯片的手册,大致了解下芯片情况。
芯片编号为 K4T1G164QQ
芯片手册是各种规格的集合,需要根据芯片编号得知自己的芯片规格,再看对应的说明
芯片编号的解读方法如下:

K4T1G164QQ
1 :K 说明是三星的
2: 4 说明是DRAM
3:T 是 DDR2
4:1G 密度和刷新速度,为 1Gb也就是 128MB
5:16 位宽为16bit
6:4 8Bank
7:电压
后面没用了
总结为 : DDR2 1Gb 16bit 8Bank
根据上面数据找到这张图

现在需要知道内存是如何确定每个 bit 的位置的。
内存是多个 Bank组成,每个Bank是个二维地址有col和row确定的存储单元,这样就构成了三维的矩阵。
所以每个bit先要确定 Bank,然后再是 row 和 col。
对应上面的图可以知道,一共17根线传输这些地址数据,3位用来选Bank(BA0,BA1,BA2),也就 8 Bank
10位 Col,14位Row,所以 1Bank 就是 2^24 B = 16MB
8Bank = 128MB
注意Col,Row确定一个Byte,内存的最小单位是Byte,那为什么我们可以操作bit呢?原因是我们使用寄存器和移位器来操作bit,与DDR无关。
完成了上面工作,对板子上的内存芯片就有了足够的认识,
就下来应该结合 SoC UM 和 参考代码进行分析,
因为知道使用的是DDR2,所以看SoC UM 对DDR2初始化的部分,一共有27步,应该结合参考代码看。
(1)设置驱动强度

/* DMC0 Drive Strength (Setting 2X) */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_0DRV_SR_OFFSET] // 寄存器中对应0b10,就是2X
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_1DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_2DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_3DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_4DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_5DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_6DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP1_7DRV_SR_OFFSET]
ldr r1, =0x00002AAA
str r1, [r0, #MP1_8DRV_SR_OFFSET]
/* DMC1 Drive Strength (Setting 2X) */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_0DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_1DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_2DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_3DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_4DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_5DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_6DRV_SR_OFFSET]
ldr r1, =0x0000AAAA
str r1, [r0, #MP2_7DRV_SR_OFFSET]
ldr r1, =0x00002AAA
str r1, [r0, #MP2_8DRV_SR_OFFSET]
(2)设置PLL,因为DDR使用SoC提供时钟,频率太低,需要倍频,所以需要使用PLL

/* DMC0 initialization at single Type*/
ldr r0, =APB_DMC_0_BASE
ldr r1, =0x00101000 @PhyControl0 DLL parameter setting, manual 0x00101000
str r1, [r0, #DMC_PHYCONTROL0]
ldr r1, =0x00000086 @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0x00101002 @PhyControl0 DLL on
str r1, [r0, #DMC_PHYCONTROL0]
ldr r1, =0x00101003 @PhyControl0 DLL start
str r1, [r0, #DMC_PHYCONTROL0]
find_lock_val:
ldr r1, [r0, #DMC_PHYSTATUS] @Load Phystatus register value
and r2, r1, #0x7
cmp r2, #0x7 @Loop until DLL is locked
bne find_lock_val
and r1, #0x3fc0
mov r2, r1, LSL #
orr r2, r2, #0x100000
orr r2 ,r2, #0x1000
orr r1, r2, #0x3 @Force Value locking
str r1, [r0, #DMC_PHYCONTROL0]
这一步和时序相关,看不懂
ldr r1, =0x0FFF2010 @ConControl auto refresh off
str r1, [r0, #DMC_CONCONTROL]
对应文档中的这几步

接下来
#define DMC0_MEMCONFIG_0 0x20F01323 // MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed#define DMC1_MEMCONTROL 0x00202400 // MemControl BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off
ldr r1, =DMC0_MEMCONTROL @MemControl BL=4, 1 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off
str r1, [r0, #DMC_MEMCONTROL]
ldr r1, =DMC0_MEMCONFIG_0 @MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
str r1, [r0, #DMC_MEMCONFIG0]
这里按照硬件连接情况设置。
接下来比较重要
ldr r1, =DMC0_MEMCONFIG_1 @MemConfig1 #define DMC0_MEMCONFIG_1 0x30F00312 // MemConfig1 默认值
str r1, [r0, #DMC_MEMCONFIG1]
看UM

可以看出,31-24设置内存的基地址,基地址该如何设置应该看SoC安排的Memory Map

地址向上生长,DRAM0使用 0x3000_0000
23-16是使用掩码的方式设置长度,根据 Memory Map 可以看出DRAM0长度最大0x3FFF_FFFF,这里设置的也是这个
其他的按照前面查的数据填。
其他的代码基本上时序,没得可以变的,也看不懂。
这样 DDR的初始化就完了。
总结:
通过这次初始化,学习如何使用芯片手册,SoC手册,参考代码,原理图。
简单说是:
先看原理图,了解SoC和芯片实际连接,和使用的芯片类型。
再看芯片手册,了解下芯片,当然前提需要知道硬件的基本常识。
再依照参考代码看SoC手册,期间需要结合芯片手册确定某些特殊数据。
可以看出 DDR 的初始化基本上没得可以改的,也不会改,
需要注意的就是内存的起始地址和长度的设置部分,这里可以变通。
裸机——DDR的更多相关文章
- S5PV210(TQ210)裸机编程
本文很多其它的是教会大家怎样学习. 4.1 汇编学习 4.1.1 基础知识 4.1.2 ARM模拟器 4.2 S5PV210启动流程 4.3 点亮一个LED 4.4 串 ...
- 第五章之S5PV210将u-boot.bin从SD卡中搬到DDR中
1,在完成上一节的memory初始化后,接下来在arch/arm/cpu/armv7/start.S的160行:如下图 2,跳转到arch/arm/lib/board.c下的board_init_f函 ...
- NanoPC-T3 64位裸机编程 —— 启动和运行状态切换
参考: https://github.com/metro94/s5p6818_spl https://github.com/trebisky/Fire3/tree/master/Boot_NSIH h ...
- arm裸机程序启动流程
arm裸机程序启动流程 1373 Linux系统的引导: 一个SOC拿过来,它是有内部BROM和SRAM的,这个BROM中会固化芯片厂商的最初引导代码,我们叫它RBL(ROM boot loader) ...
- tiny4412 裸机程序 七、重定位代码到DRAM【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...
- u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
RAM的原理简单学习 DDR是RAM的一种,RAM常见的类型有SRAM,SDRAM,DDR他们的共同特点是,随机存储意味着读写速度快,掉电后数据丢失,所以常用来存储程序中的变量. SRAM 静态随机存 ...
- DDR的前世与今生(一)
作者:一博科技 DDR SDRAM全称为Double Data Rate SDRAM,中文名为"双倍数据率SDRAM".DDR是在原有的SDRAM的基础上改进而来,严格的说DDR应 ...
- DDR相关的低功耗技术之PASR、TCSR、DPD
随着智能机的发展,DDR内存容量越来越大,bank数量越来越多,功耗也越来越大.在不需要的时候关闭部分bank,或者降低自刷新频率,或者进入深度低功耗模式.有三种DDR技术用来降低功耗: PASR(P ...
- 基于KEIL4开发ARM9(S3C2440)的裸机程序
本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...
随机推荐
- 轻松完成excel读写操作- 基于POI的框架BingExcel的使用(1)
Bingexcel User Guide 使用maven进行项目开发目前项目的maven仓库是在github上,浏览地址为 https://github.com/bingyulei007/mvn-re ...
- 实现vmare虚拟机系统随主机开机自动启动
服务器主机上的虚拟机每次开机要手动启动是很麻烦的事,so,在网上找到一方法让虚拟机随主机开机自动运行:挺方便的,记录下来: 1.操作环境 主机:windows 2003 虚拟机:centos6 2.下 ...
- 《孵化Twitter》:Twitter创始人勾心斗角史,细节披露程度令人吃惊
本书详细讲述twitter的发展史.感觉基本上是一部创始人从朋友变敌人,勾心斗角的历史.Twitter本身的产品发展反而相对比较简单. 书中披露了许多email.谈话.会议的细节,作者说这些是数百个小 ...
- 【js基础修炼之路】— 深入浅出理解闭包
之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解. 什么是闭包? 引用高程里的话 => 闭包就是有权访问另一个作用域中变量的函数,闭包是由函数以及创建该函数 ...
- Leetcode back(215) to be continue
solution discussion https://leetcode.com/problems/kth-largest-element-in-an-array/description/ -- 21 ...
- mysql用一个表更新另一个表
写法: UPDATE Document, ObservationRequestSET Document.CreateOrganizationName = ObservationRequest.Orga ...
- 前端js限制上传文件类型及大小(1)
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 广搜最短路径变形,(POJ3414)
题目链接:http://poj.org/problem?id=3414 解题报告: 1.每个节点都是一个独立的状态 2.这里的状态转移就是有几种出路,4种:1.倒掉a中的水,2.把a中的水倒到b中去, ...
- telegram汉化和代理
telegram在Ubuntu18.04的应用商店中可以一键下载. 1.注册:用国内手机号即可,就是验证码可能很慢. 2.汉化:关注zh-CN 频道,在点击其中的安装链接即可. 3.代理: 如果你使用 ...
- 2017.10.5 Java图形化界面设计——布局管理器
1.BorderLayout(边界布局) 边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次对应为:上北(NORTH).下南(SOUTH).左西( ...