uboot源码学习(9)DDR初始化程序分析

本文分析S5PV210板的DDR初始化程序。
一、IO部分配置。从下图管脚定义表来看,Xm1管脚只有单个功能Func0,所以不用配置管脚复用功能。
uboot源码学习(9)DDR初始化程序分析
memory.S文件,20行-40行

mem_init:
	//1、设置DMC0 Drive Strength (Setting 2X)
	ldr r0,=ELFIN_GPIO_BASE
	ldr r1,0x0000AAAA
	str r1,[r0,#MP1_0DRV_SR_OFFSET]
	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,0x0000AAAA
	str r1,[r0,#MP1_8DRV_SR_OFFSET]

其中,宏定义都在s5pv210.h文件中:

#defineELFIN_GPIO_BASE 0xE020_0000
#defineELFIN_GPIO_BASE 0x3CC

将DMC0的驱动能力设置为2X。

二、从此开始,按照手册的27步开始配置:
**step1:**To provide stable power for controller and memory device, the controller must assert and hold CKE to a logic high level. Then apply stable clock. Note: XDDR2SEL should be Low level to hold CKE to high.
为了提供稳定的电源给控制器和内存设备,控制器必须确保CKE维持低电平,提供一个稳定的时钟。
uboot源码学习(9)DDR初始化程序分析
step2:Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc bit-fields to correct value according to clock frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to activate the PHY DLL.

此步配置DMC端DLL。

DMC端DLL的作用是将DQS信号相移90°,以消减从DDR数据总线有数据时到数据传送到CPU的延时(rd_fetch)。
uboot源码学习(9)DDR初始化程序分析
uboot源码学习(9)DDR初始化程序分析
rd_fetch计算公式如下:
uboot源码学习(9)DDR初始化程序分析
配置代码:

//2、初始化PHY DLL
ldr r0,=APB_DMC_0_BASE 
//step3:PhyControl0 parameter setting,manual 0x00101000
ldr r1,= 0x00101000
str r1,[r0,#DMC_PYHCONTROL0]
//PhyControl1 parameter setting,LPDDR/LPDDR2 Case
ldr r1,= 0x00000086
str r1,[r0,#DMC_PYHCONTROL1 ]
#define APB_DMC_0_BASE 0xF000000
#define DMC_PYHCONTROL0 0x18
#define DMC_PYHCONTROL1 0x1C

uboot源码学习(9)DDR初始化程序分析
上图中:ctrl_inc,表示DLL从0到90°相移过程中,每次相移的度数。推荐值为0x10;
ctrl_start_point:表示DLL从0到90°相移过程中,起点位置,推荐值为0x10;
ctrl_dll_on:DLL总开关;此时先配置为0,在后面的步骤中再打开。
ctrl_start:DLL待机开关。先打开ctrl_dll_on,再打开ctrl_start。
ctrl_dfdqs:DQS差分或者单端选择信号;
ctrl_half:DLL低速或告诉选择信号。此处配置为0。
uboot源码学习(9)DDR初始化程序分析
step3:DQS Cleaning: Set the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields to the correct value according to clock frequency and memory tAC parameters.
uboot源码学习(9)DDR初始化程序分析
其中,ctrl_shiftc是DQS Cleaning 相移粗调,在DDR2@200MHz时推荐是0x6(T/2)。
ctrl_offsetc是DQS Cleaning相移精调。

DQS Cleaning示意图如下:
uboot源码学习(9)DDR初始化程序分析
DQS Cleaning就是在DMC中将DQS的信号延时标记出来,如PCB布线、焊点等的延时。

上一篇:〇二——U-boot常用命令


下一篇:rk3566 android CMA预留内存系统层获取ddr容量变小