http://blog.sina.com.cn/s/blog_8c5d88390102vjqn.html
之前的程序都是在内部的stepping stone中运行的。但是stepping stone的大小是很小的。ARM11只有8K的大小。这么小的空间,要运行大型程序肯定是不行的。所以就需要外部的存储器。ARM11的外部存储器用的是ddr。所以就要对ddr进行初始化,同时将代码拷贝到ddr中。
不要被图中stepping stone的64M空间迷惑,其实是没有这么大的。只有8K大小。因为这空间很小,所以就需要外部加存储器。图中也说明了,外部存储器的地址从0x50000000开始。大小总共可以有256M。
0x00000000~0x07FFFFFF对应内部的镜像区。这个区用来镜像启动代码的。因为S3C6410支持多种启动方式。当选择一种外设存储设备启动方式的时候,会将该存储设备的首地址给映射到这个区域来。这样当cpu从0地址开始运行代码,就相当于从外设存储设备的首地址运行了。
0x08000000~ 0x0bFFFFFFF对应着内部ROM,但是IROM实际只有32KB,选择从IROM启动的时候,首先运行就是这里面的程序BL0,这部分代码由三星固化。
0x0c000000~ 0x0FFFFFFF对应内部SRAM,实际就是8KB的Steppingstone。
0X10000000~0X3FFFFFFF对应主存储区,这个区域用来访问挂在外部总线上的设备,比如oneNAND,NORFLASH。这个区域内被分割成6个bank。每个bank大小是128M。数据宽度最大支持16bit。每个bank由片选xm0CS[0]~xm0CS[5]选中。
0x50000000~0x6FFFFFFF。DRAM区域。这个区分为两个区,分别占256MB。可以通过片选xm1CS[0]和xm1CS[1]来进行选择。
我使用的OK6410的ddr大小是128M。起始地址是从0x50000000开始。
S3C6410对这些存储设备的操作都是通过控制器来控制的。因为存储器驱动是相对来说比较麻烦的,要产生对应的时序,来对存储器进行读写。如果让CPU来控制产生这些时序的话,那对CPU来说是一个很大的负担,所以在芯片中有存储控制器,CPU通过对直接对存储控制器读写数据,存储控制器自动的把数据按照存储器的时序对存储器进行读写。
上图是ddr的数据手册,大小是64MB。OK6410使用的是两片,所以总共大小是128M。
下面就要来对ddr控制器进行配置。
手册中有对ddr控制器初始化有说明顺序。所以在对ddr控制器初始化的时候,就必须要按照这个规定的顺序来。
整个流程
1、
2、
3、
4、
5、
6、
DRAM控制器支持两种dram,一种是SDR,一种是DDR。板子用的是DDR,所以上面流程中的执行存储器初始化序列,这里就是执行DDR的初始化序列。
1、
2、
3、
4、
5、
6、
手册中提供的参数有的有错误,实际要参考寄存器中说明的值。
下面就按照这个流程来进行初始化
先使用宏定义将地址都定义一下
第一步:
向MEMC_CMD寄存器写入3’b100,使DRAM控制器进入配置状态
上图是这个寄存器的说明,只有低三位有用。写入100.也就是0x4。
第二步:
写存储器时序参数,芯片配置,id配置寄存器。这里就要参考数据手册了。
在手册中,有下面这个说明
说明刷新周期是7.8us。寄存器设置中的值是刷新周期,不过这周期是通过时钟周期数来设置的。如果这时钟周期是100ns。那么设置的值是78,就刚好是7.8us。在之前的时钟初始化中,把这时间设置为133M了。所以需要去计算一下需要多少个时钟。但是这里,直接使用公式
7800 / ( 1000000000/133000000 ) + 1
这个是设置CAS参数的。就设置3:1位。最低位这里为0.
在数据手册中也有说明,这个参数可以是2,也可以是3.这里就设置为3。
这个是设置DQSS参数
也是查阅数据手册,在时序那一部分。
数据,这里就看前两列和最后一列,第一列是最小,第二列是最大。最后一个是单位。这里是以时钟为单位,最小是0.75个时钟。这里就可以设置为1.
手册中,参数是2个时钟。
以下就不说明了。一直把各个时序参数设置完就可以了。
配置完P1T_ESR寄存后,时序就配置完了。接着就对芯片进行配置
对这个寄存器的第16位,第4位,第1位和第0位置1
配置读写突发模式是4.
这个配置的位就多了。主要关心前面几个的配置。
这里,配置读延迟[12:11]是01,手册中也说这个是mobile DDR SDRAM使用。板子用的就是mobile DDR。存储器类型[10:8]是011,表示外部存储器是mobile DDR。存储器宽度[7:6]设置为01,表示是32位。一个DDR是16位,但是使用两片拼接的,所以宽度就是32位。后面几位的设置功能目前还不知道有什么用。
16位是存储器的选址方式。手册中有说明,bank-row-column。所以这一位要为1.
对于低8位。DDR的大小是128M。所以地址空间是0x5000_0000~0x57FF_FFFF。而低8位是屏蔽地址的。这里是设置为0XF8.就是将0x5000_0000~0x57FF_FFFF意外的地址屏蔽芯片使能。
所以这个参数的值就是0x150f8。
第三步:存储器初始化序列
第三步:向MEMC_CMD寄存器写入3’b000,让DRAM控制器进入准备状态
就往寄存器中写0就可以了。
第四步:检查MEMC_STAT寄存器的存储状态为为2’b01,表示准备好。
对比STM32: