Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4282047
  • 博文数量: 241
  • 博客积分: 15936
  • 博客等级: 上将
  • 技术积分: 25293
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 11:22
个人简介

Fedora-ARM

文章分类
文章存档

2016年(3)

2014年(1)

2013年(3)

2012年(50)

2011年(61)

2010年(26)

2009年(27)

2008年(21)

2007年(49)

分类: LINUX

2011-12-27 16:23:35

    在移植bootloader到新嵌入式开发板的过程中经常会碰到初始化DDRx和DDR控制器的问题。而现在较高端的嵌入式CPU中早已集成了DDR2甚至DDR3控制器,这相较于早期使用SDRAM的CPU,在初始化的时候可能会复杂许多。再加上这些代码一般是在系统刚启动的时候运行的,通常为汇编代码,看着那一大坨汇编程序,不免有些恐惧感。但是如果对DDRx内存原理及其与DDRx控制器的关系有些了解的话,这个配置工作其实还是有章可循的。下面我根据自己的开发经验总结如下,但是此处不涉及具体代码,只对一般流程做描述,因为代码必须是和硬件配套的。如果你先看具体代码,请参考uboot中的代码。

一、学习相关的基础知识:
(1)了解DDRx的外部引脚及其作用

(2)了解的大致时序和相关时序参数的关系

(3)了解DDRx的初始化过程以及配置寄存器的功能

    对于以上的一些知识,我已经在《关于学习DDR2时值得一看的资料》中总结过了,大家可以去看看。

(4)了解CPU核、内存控制器及DDRx间的关系

     过去在PC中他们三者的关系一般是:

而现在的大多数PC构架中,为了性能,CPU多集成了DDRx控制器,所有现在的关系如下:

但是在嵌入式CPU中,他们三者的关系是:

所以在嵌入式系统中初始化DDRx的顺序应该是先初始化好DDRx控制器,然后通过DDRx控制器初始化外部DDRx芯片。

~~~~~~~~~~以下是CPU初始化DDRx代码的一般步骤~~~~~~~~~~~~~
二、配置内存控制器
(1)根据DDRx芯片大小、位宽和连接方式配置控制寄存器(其中包含了地址映射的配置)
(2)根据所用DDRx芯片的AC特性配置控制器的时序参数寄存器
(3)根据电路板和走线的特性配置DDRx控制器中PHY的控制寄存器(当前仅在部分高端嵌入式芯片中需要)

四、初始化外部DDRx芯片
在上面的参数的配置完成后,就可以开始对外部的DDRx芯片执行初始化过程了。这个根据不同的DDRx控制器可能有不同的情况:
(1)手工:需要操作DDRx控制器的寄存器(指令寄存器),按照DDRx的初始化规范来一步一步手工初始化。(例如三星的S5PV210)
(2)自动:只需要在DDRx控制器的寄存器中触发某个位,DDRx控制器就会帮你自动完成初始化。(例如Ti的DM816x)

这两者各有利弊:手动的方式虽然繁琐,但是给程序员更多的控制权和知情权,比如在DDR2的OCD调整中就可以手动实现,优化传输特性。反之自动方式遂简洁,但是(除非你用高级的逻辑分析仪看)你不知道控制器初始化的细节,也无法从中调整,但是就算是这样也必须遵守JEDEC(电子设备工程联合委员会)的DDR2标准文档

但是从DDR2 的标准来看,初始化中可以设置的变量基本都已经在初始化控制寄存器时给出了,是板级相关不可变的。只有极少数配置和OCD调整是可变的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在完成以上工作后,一般DDRx内存就可以通过映射好的地址访问了,此后bootloader一般就会进入代码自拷贝到内存运行的工作。

阅读(9170) | 评论(5) | 转发(27) |
给主人留下些什么吧!~~

zhuqing_7392012-06-14 13:59:54

多谢博主。。。。。。我也是这么认为的。。。。。。

tekkamanninja2012-06-14 13:52:34

zhuqing_739: 看了最后一段文字,对于嵌入式设备而言,你的意思是初始化ddr的代码是在flash里面运行的,而不是ddr里面?.....
你在初始化ddr,怎么可能在ddr中运行呢?
初始化代码一般是在芯片的内部ram(也可能在nor flash)中运行的。这个和芯片的boot方式相关。

zhuqing_7392012-06-14 11:03:37

看了最后一段文字,对于嵌入式设备而言,你的意思是初始化ddr的代码是在flash里面运行的,而不是ddr里面?

tekkamanninja2011-12-29 09:07:29

十七岁的回忆: 手动的方式虽然繁琐,但是给程序员更多的控制权和知情权
是啊,不只是程序猿,所以要开源啊!!.....
手动和自动的问题只是我的一些感觉,还不知道是否正确
毕竟就算是手动,能改的也很少~~~

十七岁的回忆2011-12-29 08:11:26

手动的方式虽然繁琐,但是给程序员更多的控制权和知情权
是啊,不只是程序猿,所以要开源啊!!