关于ok6410初始化内存方法

声明:本文转自http://blog.csdn.net/mcudoc/article/details/8758222

   

DDR初始化

 一、DDR的容量

       我们在DDR芯片资料上的开头都会标明DDR的容量:如我们的手上的OK6410A的DDR(K4X1G163PC),它的芯片资料上写的是32M x16 Mobile-DDR SDRAM。但是厂家跟说ok6410a有128M的容量。看到这里不禁就个疑问了。芯片上明明写是32M为什么,FL说是128M呢。在这里就能给你答案,板子上有两片DDR。那它的容量是32Mx16位x2=32Mx32位。它这里32M指的32位数据,而我们通常所讲的容量是以字节为单位,而不是字为单位。32M的32位就等于32Mx4的8位。这样就根FL给出的数据一样了。所以我们以后在看内存容量时一定要注意到这一点。

二、DDR信号

 --------------------------------------------------------------------------------  

  信号名             作用

-----------------------------------------------------------------------------------   

    CK,nCK                      差分时钟

     nCS                           片选信号                  低电平有效

     CKE                           时钟使能                  高电平有效

     A0~A12                     地址线                      行列地址线复用,行地址:A0~A12 列地址:A0~A9

     BA0~BA1                  BANK选择                00 01 10 11。第个BAND为4M

     nRAS                         行地址锁存                低电平有效

     nCAS                         列地址锁存                低电平有效

     nWE                           读写使能                    低电平有效

     L(U)DM                       数据屏蔽

     L(U)DQS                     数据选通

     DQ0~DQ15                 数据线

     VDD/VSS                     电源与地

      VDDQ/VSSQ             数据输出电源与地

-----------------------------------------------------------------------------------------------------------------------------------------------     

三、S3C6410的DRAM控制器初始化

         DRAM控制器初始化流程:

       (1)以‘3’b100’执行memc_cmd,使得DRAM 控制器输入‘配置’状态。
      (2)写存储器时间参数,芯片配置和ID 配置寄存器。
      (3)等待200μs 来使SDRAM 电源和时钟稳定。当CPU 开始工作时,电源和时钟已经被稳定下来。
     (4)执行存储器初始化顺序。
     (5)以‘3’b000’执行memc_cmd,使得DRAM 控制器输入‘准备’状态。
     (6)在memc_stat 中检查存储器状态域,直到存储器状态变为‘2’b01’,即‘准备’。

       DDR 初始化流程:

      (1)在direct_cmd,以‘2’b10’执行mem_cmd,使得DRAM 控制器产生‘NOP’存储器命令。

       (2)在direct_cmd,以‘2’b00’执行mem_cmd,使得DRAM 控制器产生‘Prechargeall’存储器命令。
       (3)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Autorefresh’存储器命令。
      (4)在direct_cmd,以‘2’b10’执行mem_cmd,使得DRAM 控制器产生‘MRS’存储器命令。
               EMRS 块地址必须被设置。
      (5)在direct_cmd,以‘2’b10’执行mem_cmd,使得DRAM 控制器产生‘MRS’存储器命令。
               MRS 块地址必须被设置。
      (6)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Autorefresh’存储器命令。
      (7)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Autorefresh’存储器命令。
      (8)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Prechargeall’存储器命令。

        如下图所示:

 

五、DDR初始化程序

       在初始化DDR控制器,要结合DDR的芯片手册。通常需要从DDR芯片手册中获取如下参数:

       1、地址线的分布(列地址行地址分别各为多少条)。

       2、DDR的刷新周期(通常为7.8US)

       3、位宽二片DDR,即为32位

       4、DDR的访问时序参数

程序如下

头文件:

  1. #ifndef __COMMON_H  
  2. #define __COMMON_H  
  3.   
  4. #define vi *( volatile unsigned int * )   
  5.   
  6. #define set_zero( addr, bit ) ( (vi addr) &= ( ~ ( 1 << (bit) ) ) )  
  7. #define set_one( addr, bit ) ( (vi addr) |= ( 1 << ( bit ) ) )  
  8.   
  9. #define set_bit( addr, bit, val ) ( (vi addr) = (( vi addr)&=(~(1<<(bit))) ) | ( (val)<<(bit) ) )  
  10.   
  11. #define set_2bit( addr, bit, val ) ( (vi addr) = (( vi addr)&(~(3<<(bit))) ) | ( (val)<<(bit) ) )  
  12.   
  13. #define set_nbit( addr, bit, len,  val ) \  
  14.     ( (vi addr) = ((( vi addr)&(~(( ((1<<(len))-1) )<<(bit))))  | ( (val)<<(bit) ) ))  
  15.   
  16. #define get_bit( addr, bit ) ( (( vi addr ) & ( 1 << (bit) )) > 0  )  
  17.   
  18. #define get_val( addr, val ) ( (val) = vi addr )  
  19. #define read_val( addr ) ( vi ( addr ) )  
  20. #define set_val( addr, val ) ( (vi addr) = (val) )  
  21. #define or_val( addr, val ) ( (vi addr) |= (val) )   
  22.   
  23. ///////////////////////////////  
  24.   
  25. typedef unsigned char u8;  
  26. typedef unsigned short u16;  
  27. typedef unsigned int u32;  
  28.   
  29. // function declare  
  30.   
  31. int delay( int );  
  32.   
  33. #endif   

 

DDR 初始化程序

 

  1. #include "common.h"  
  2.   
  3. #define MEMCCMD 0x7e001004  
  4. #define P1REFRESH   0x7e001010  
  5. #define P1CASLAT    0x7e001014  
  6. #define MEM_SYS_CFG 0x7e00f120  
  7. #define P1MEMCFG    0x7e00100c  
  8. #define P1T_DQSS    0x7e001018  
  9. #define P1T_MRD     0x7e00101c  
  10. #define P1T_RAS     0x7e001020  
  11. #define P1T_RC      0x7e001024  
  12. #define P1T_RCD     0x7e001028  
  13. #define P1T_RFC     0x7e00102c  
  14. #define P1T_RP      0x7e001030  
  15. #define P1T_RRD     0x7e001034  
  16. #define P1T_WR      0x7e001038  
  17. #define P1T_WTR     0x7e00103c  
  18. #define P1T_XP      0x7e001040  
  19. #define P1T_XSR     0x7e001044  
  20. #define P1T_ESR     0x7e001048  
  21. #define P1MEMCFG2   0X7e00104c  
  22. #define P1_chip_0_cfg   0x7e001200  
  23.   
  24. #define P1MEMSTAT   0x7e001000  
  25. #define P1MEMCCMD   0x7e001004  
  26. #define P1DIRECTCMD 0x7e001008  
  27.   
  28.       
  29. #define HCLK    133000000  
  30.   
  31. #define nstoclk(ns) (ns/( 1000000000/HCLK)+1)  
  32.   
  33. int sdram_init( void )  
  34. {  
  35.     // 设置DRAM控制器状态为配置模式       
  36.     set_val( MEMCCMD, 0x4 );  
  37.   
  38.     // 设置DDR刷新周期为7.8US    
  39.     set_val( P1REFRESH, nstoclk(7800) );  
  40.   
  41.     //  设置DDR时序参数         
  42.     set_val( P1CASLAT, ( 3 << 1 ) );    
  43.     set_val( P1T_DQSS, 0x1 );   // 0.75 - 1.25时钟周期  
  44.     set_val( P1T_MRD, 0x2 ); //min=2个时钟周期  
  45.     set_val( P1T_RAS, nstoclk(45) );//45us  
  46.     set_val( P1T_RC, nstoclk(68) );//68us         
  47.   
  48.     u32 trcd = nstoclk( 23 );  
  49.     set_val( P1T_RCD, trcd | (( trcd - 3 ) << 3 ) );//22.5us  
  50.     u32 trfc = nstoclk( 80 );  
  51.     set_val( P1T_RFC, trfc | ( ( trfc-3 ) << 5 ) );     
  52.     u32 trp = nstoclk( 23 );  
  53.     set_val( P1T_RP, trp | ( ( trp - 3 ) << 3 ) );   
  54.     set_val( P1T_RRD, nstoclk(15) );  
  55.     set_val( P1T_WR, nstoclk(15) );  
  56.     set_val( P1T_WTR, 0x7 );  
  57.     set_val( P1T_XP, 0x2 );  
  58.     set_val( P1T_XSR, nstoclk(120) );  
  59.     set_val( P1T_ESR, nstoclk(120) );  
  60.       
  61.     // set mem cfg   
  62.     set_nbit( P1MEMCFG, 0, 3, 0x2 );    
  63.   
  64.       
  65.     //把第0位开始的后三位清零,然后把这三位设置为ox2  
  66.       
  67.     set_nbit( P1MEMCFG, 3, 3, 0x2 );    
  68.       
  69.     set_zero( P1MEMCFG, 6 );            
  70.     set_nbit( P1MEMCFG, 15, 3, 0x2 );   
  71.       
  72.     set_nbit( P1MEMCFG2, 0, 4, 0x5 );   
  73.     set_2bit( P1MEMCFG2, 6, 0x1 );        
  74.     set_nbit( P1MEMCFG2, 8, 3, 0x3 );     
  75.     set_2bit( P1MEMCFG2, 11, 0x1 );    //读延迟1 周期  
  76.   
  77.     set_one( P1_chip_0_cfg, 16 );         
  78.   
  79.     // DDR 初始化  
  80.     set_val( P1DIRECTCMD, 0xc0000 ); // NOP  
  81.     set_val( P1DIRECTCMD, 0x000 );  // precharge  
  82.     set_val( P1DIRECTCMD, 0x40000 );// auto refresh  
  83.     set_val( P1DIRECTCMD, 0x40000 );// auto refresh  
  84.     set_val( P1DIRECTCMD, 0xa0000 ); // EMRS  
  85.     set_val( P1DIRECTCMD, 0x80032 ); // MRS  
  86.   
  87.     set_val( MEM_SYS_CFG, 0x0 );  
  88.                       
  89.     // 使得DRAM 控制器输入‘准备’状态  
  90.     set_val( P1MEMCCMD, 0x000 );  
  91.   
  92.     // 直到存储器状态变为‘2’b01’,即‘准备  
  93.     while( !(( read_val( P1MEMSTAT ) & 0x3 ) == 0x1));  
  94. }  

以下为本人找的:

  在s3c6410x文档中的第五章DRAMC中的5.4.1为初始化流程,5.4.3为ddr初始化流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章