JZ2440:sdram

本节的主要目的是对 u-boot 中 sdram 初始化部分的理解。

1. 相关部分代码:

// 前边的代码设置时钟频率 200MHz,FCLK:HCLK:PCLK = 1:2:4

#define MEM_CTL_BASE            0x48000000
    ldr r0, =MEM_CTL_BASE
    adr r1, sdram_config
    add r3, r0, #(13 * 4)
1:
    ldr r2, [r1], #4
    str r2, [r0], #4
    cmp r0, r3
    bne 1b


sdram_config:
    .long 0x22011110     //BWSCON    (1)
    .long 0x00000700     //BANKCON0    (2)
    .long 0x00000700     //BANKCON1    (3)
    .long 0x00000700     //BANKCON2    (4)
    .long 0x00000700     //BANKCON3    (5)
    .long 0x00000700     //BANKCON4    (6)
    .long 0x00000700     //BANKCON5    (7)
    .long 0x00018005     //BANKCON6    (8)
    .long 0x00018005     //BANKCON7    (9)
    .long 0x008C04F4     //REFRESH     (10)
    .long 0x000000B1     //BANKSIZE    (11)
    .long 0x00000030     //MRSRB6    (12)
    .long 0x00000030     //MRSRB7    (13)

sdram_config下边的
(1) 
对 BANK7 不使用  UB/LB : Bank 7 的WAIT 状态禁止:Bank7 数据总线宽度 32 位:
对 BANK6 不使用 UB/LB :Bank 6 的WAIT 状态禁止:Bank6 数据总线宽度 32 位: 
对 BANK5 不使用 UB/LB :Bank 5 的WAIT 状态禁止:Bank5 数据总线宽度 8 位:
对 BANK4 不使用 UB/LB :Bank4 的WAIT 状态禁止:Bank4 数据总线宽度 16 位:
对 BANK3 不使用 UB/LB :Bank3 的WAIT 状态禁止:Bank3 数据总线宽度 16 位:
对 BANK2 不使用 UB/LB :Bank2 的WAIT 状态禁止:Bank2 数据总线宽度 16 位:
对 BANK1 不使用 UB/LB :Bank1 的WAIT 状态禁止:Bank1 数据总线宽度 16 位

(2)(3)(4)(5)(6)(7)  nGCSn 前的地址建立时间 0 个时钟: nOE前的片选建立时间 0 个时钟: 访问周期 14个时钟: nOE后的片选保持时间 0 个时钟: nOE后的片选保持时间 0 个时钟: nGCSn 后的地址保持时间 0 个时钟: Page 模式下的 Page 模式访问周期 0 个时钟: Page 模式配置   1 个数据

(8)(9) BANK6,7 的存储器类型是 同步DRAM:nGCSn 前的地址建立时间 0 个周期:nOE 前的片选建立时间 0 个时钟:访问周期 1 个时钟:nOE 后的片选保持时间 0 个时钟:nGCSn 后的地址保持时间 0 个时钟:Page 模式下的page 的访问周期 3 个时钟:Page 模式配置 4个连续数据

(10) SDRAM 刷新使能:SDRAM RAS 的充电时间是2个时钟: SDRAM Semi Row cycle time ( SDRAM 半行周期时间  )7个时钟:刷新计数器是 0b100 1111 0100 = 1268   刷新周期 = (2^11  - 刷新计数  + 1) / HCLK  = 781 / HCLK = 7.81us

(11) 使能突发模式,使能SDRAM 掉电模式,SCLK只在访问期间有效,Bank6/7 存储器映射 64MB/64MB

(12)(13) CAS等待时间是 3 个时钟周期,写突发长度固定,突发类型连续,突发长度 1.

2. 相关硬件连接的依据:


对于数据总线 32位,地址总线从 LADDR2 开始的解释:
数据手册上提供了设计参考:

JZ2440:sdram_第1张图片


图中是有说的,但是原理是什么呢?
1,先弄清楚第一个概念,对于CPU来说:
      一个地址用32位来表示:0x30000000、0x40000000;
      但是这个地址代表的地址空间是1个字节,也就是说CPU读取0x30000000这个地址得到的是一个字节的数据;
      一个地址是多少位的地址跟这个地址代表的地址空间有多大是2码事。
      CPU:
          0x30000000         1字节
          0x30000001         1字节
          0x30000002         1字节
                ......
2,
      ① 对于JZ2440来说,SDRAM有2片,每一片的数据输出宽度是16bit,总共构成了具有32bit数据输出的内存,现在这块内存1次输出32bit的数据。
      ② 在这种情况下,读取SDRAM的一个地址得到的数据是4个字节(一定要把①、②这两句话看懂)。
也就是说,CPU想得到一字节的数据的时候, 要一次获取 sdram 中的四字节的数据,然后再在其中取出索要的数据。
假设:下图黑色带序号的表示CPU想得到的数据, ①②③④⑤...数据大小都是1个字节(不懂请把1看懂)


也就是说①②③④这四个字节的数据在SDRAM的0地址,⑤⑥⑦⑧这四个字节的数据在SDRAM的1地址,⑨这个字节在SDRAM的2地址。
      那么,
     ⑴    CPU发出0x30000000、0x30000001、0x30000002、0x30000003这4个地址的时候,访问的都必须是SDRAM的0地址 这句话一定要明白是什么意思,不懂的反复看前面的描述 )。
     ⑵    发出0x30000004、0x30000005、0x30000006、0x30000007这4个地址的时候,访问的都必须是SDRAM的1地址 这句话一定要明白是什么意思,不懂的反复看前面的描述 )。
     ⑶    发出0x30000008这个地址的时候,访问的必须是SDRAM的2地址。
       而CPU的地址线是直接连在SDRAM的地址线上的,中间又没有其他硬件或者软件做转换,要做到上面这3点,怎么办?
我们来看地址上的规律:


CPU要想发出地址后得到正确数据 那么发出的地址的bit0、bit1是无效的,地址从bit2开始有效。
实际有效地址的最低位是从bit2开始的:
       无论bit0、bit1的值是多少,bit2为0的时候访问的是SDRAM的0地址;
                                              bit2为1的时候访问的是SDRAM的1地址;
                                              bit3、bit2为10的时候访问的是SDRAM的2地址;
                                              ......
      既然实际有效地址的最低位从bit2开始,那么把CPU的ADDR2地址线接到SDRAM的AD0;
                                                                     把CPU的ADDR3地址线接到SDRAM的AD1;
                                                                     把CPU的ADDR4地址线接到SDRAM的AD2;
                                                                         .......
      CPU的ADDR0和ADDR1不用接。
那至于如何访问0x3000 0001,具体应该是这样的,先取sdram 的0 地址的4字节数据,然后由 s3c2440 芯片去取这四个里边的第二个,具体的实现是s3c2440 操作的,不需要人为操作。

此部分参考: http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=11544&fromuid=5490

你可能感兴趣的:(sdram,jz2440)