1、DRAM的地址空间
(1)从地址映射图可以知道,S5PV210有两个DRAM端口。 DRAM0的内存地址范围:0x20000000~0x3FFFFFFF(512MB);DRAM1:的内存地址范围:0x40000000~0x7FFFFFFF(1024MB);
(2)S5PV210实际最多能接1.5G的内存。32位的CPU理论上能接4G的内存,但是ARM结构的机器是统一编址,寄存器会占掉一部分地址空间,所以实际是达不到4G的内存;
2、DRAM端口的引脚
DRAM端口的引脚:32根数据线(Xm1_DATAn) + 14根地址线(Xm1_ADDRn) + 3根片选信号线(Xm1_BAn) + 控制信号线。
3、DRAM控制器
DRAM是比较复杂的器件,初始化DRAM需要根据数据手册里的时序说明来写代码,没有对DRAM有深入的了解是没法写出合适的代码。但是DRAM的接口统一,于是在复杂CPU里集成了DRAM控制器,编程人员只需要操作寄存器就可以发出相应的时序,而不用去管时序是如何产生的。DRAM控制器简化了使用Soc开发人员的工作,我们只需要知道DRAM的大致过程和关键的参数就可以去初始化DRAM。
4、DRAM初始化
4.1、数据手册里初始化步骤
DRAM控制器支持多个版本的DRAM的,比如S5PV210支持LPDDR、LPDDR2、DDR2。不同版本的DRAM初始化步骤是不一样的,上面就是初始化DDR2的部分初始化步骤。初始化DDR2的代码就是按照上面的步骤进行的,但是上面的步骤很粗略,很多细节没有列举出来,但是可以辅助我们阅读DDR2的初始化代码;
4.2、实际代码初始化流程分析
代码来源:uboot中对DRAM的初始化代码,下面只是从逻辑上梳理了初始化过程,要结合代码才能真正理解整个初始化过程;
(1)设置GPIO引脚的驱动强度;
(2)设置DRAM控制器的DLL,给DRAM控制器提供稳定的时钟信号;
(3)关掉DRAM的自动重刷新;
(4)配置DRAM的相关参数:行地址、列地址、自动重刷新间隔、DRAM的有效地址空间、Memory Burst Length、数据线宽度、DRAM类型等关键参数;
(5)根据数据手册里的初始化步骤,依次给DRAM发命令进行初始化。发命令的实质就是按照时序去初始化DDR2,只不过时序由DRAM控制器产生,我们不再操心。
(6)最终DDR2初始化成功,后面的程序都重定位到DDR2中执行;