U-boot中对SDRAM初始化

项目中遇到需要把64M  SDRAM升级到128M的情况,我们板子上是两片32M的K4S561632C,而K4S511632C是64M的,直接更换不需要重新画PCB。原理图参见TQ2440—V2核心板,将对应电阻重焊后,就可将原来接到A24,A25引脚上的地址线换到A25,A26上。

u-boot中board/samsung/hfrk2440/lowlevel_init.S中:

#define BWSCON 0x48000000

/* BWSCON */
#define DW8   (0x0)
#define DW16   (0x1)
#define DW32   (0x2)
#define WAIT   (0x1<<2)
#define UBLB   (0x1<<3)

#define B6_BWSCON  (DW32)                //两片16位SDRAM并成32位
#define B7_BWSCON  (DW32)

#define B6_MT   0x3 /* SDRAM */ 

/* Determine the memory type for bank6 and bank7.  00 = ROM or SRAM 01 = Reserved (Do not use) 10 = Reserved (Do not use) 11 = Sync. DRAM */
#define B6_Trcd   0x1   /* 3clk */
/*在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定 的延迟.S3C2440的FCLK最大的频率值为400Mhz,HCLK最大为133Mhz,PCLK最大为67Mhz。再查一下关于这些个时钟频率的使用就可以知道,内存方面,是由HCLK来控制的。那么经过简单的计算就可以知道,内存的一个时钟周期,最短为7.519ns(1s/133M)。再看一下K4S561632E-UC75的数据手册,关于Trcd的值的描述,K4S561632E-UC75的内存,这个值,最少需要20ns。如果 Trcd为2clk,则时间不够,差一点儿,所以只能填3clk。如果最短的时间都能满足,那么当内存工作在比133Mhz低的情况下,就更能满足了,所以这里的Trcd为3clk。
*/
#define B6_SCAN   0x1 /* 9bit */
/* K4S561632H的内存地址的Column Address为(CA0 ~ CA8),即9bit,所以值为0x1,对应64M SDRAM。
    K4S511632H的内存地址的Column Address为(CA0 ~ CA9),即10bit,所以值为0x2,对应128M SDRAM。*/
#define B7_MT   0x3 /* SDRAM */
#define B7_Trcd   0x1 /* 3clk */
#define B7_SCAN   0x1 /* 9bit */

/* REFRESH parameter */
#define REFEN   0x1 /* Refresh enable */
#define TREFMD   0x0 /* CBR(CAS before RAS)/Auto refresh */
/* SDRAM Refresh Mode   0 = CBR/Auto Refresh 1 = Self Refresh  In self-refresh time, the SDRAM control signals are driven to the appropriate level. */
#define Trc   0x3 /* 7clk */
#define Tchr   0x2 /* 3clk */

#if defined(CONFIG_S3C2440)
#define Trp   0x2 /* 4clk */
#define REFCNT   1012
#else
#define Trp   0x0 /* 2clk */
#define REFCNT   1269

  /* 根据HCLK设置SDRAM的刷新参数,主要有REFCNT寄存器。由于我所用的开发板的HCLK设置为100Mhz,根据SDRAM芯片(K4S561632数据手册上注:64ms refresh period (8K Cycle))的参数计算REFCNT寄存器的值。计算公式如下:R_CNT=2^11+1-SDRAM时钟频率(MHz)*SDRAM刷新周期(us)*/
#endif

u-boot的include/configs/hfrk2440.h
/*-----------------------------------------------------------------------
 * Physical Memory Map
 */
#define CONFIG_NR_DRAM_BANKS 1    /* we have 1 bank of DRAM */
/* 它是由nGCS确定,两片SDRAM的CS都接到了nGCS0上 */
#define PHYS_SDRAM_1  0x30000000 /* SDRAM Bank #1 */
/* SDRAM的物理基地址,blank6的地址就是0x30000000 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
/* SDRAM的大小,根据板子硬件配置,如果是128M,则应该是0x08000000 */
#define PHYS_FLASH_1  0x00000000 /* Flash Bank #1 */

#define CONFIG_SYS_FLASH_BASE  PHYS_FLASH_1

/*-----------------------------------------------------------------------*/


相关参考http://hi.baidu.com/%B6%C5%BD%F0%CA%F7/blog/item/9fae0b2f68175b2b359bf733.html  
 http://blog.csdn.net/atower_boy/article/details/6290817  

posted on 2012-07-16 16:45  crazy_code1990  阅读(1811)  评论(0编辑  收藏  举报