bootloader---12.sdram初始化

原创 2016年08月29日 13:54:58
TQ2440用的内存是2片MT48LC16M16A2 4Meg x 16 x 4 bank组成32位。
从DataSheet中可以看出:MT48LC16M16A2 的
ReFresh_Count=8K 
Row_Addressing = 8K(A0-A12)
Bank_Addressing = 4(BA0-BA1)
Column_Addressing = 512(A0-A8)
一、代码
1.1 start.S

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:
  4.     ldr r0, =0x53000000    
  5.     mov r1, #0x0
  6.     str r1, [r0]
  7.     
  8. #define COCKTIME    0x4C000000    
  9. #define MPLLCON        0x4C000004
  10. #define UPLLCON        0x4C000008
  11. #define CLKCON        0x4C00000C
  12. #define CLKSLOW        0x4C000010
  13. #define CLKDIVN     0x4C000014
  14. #define CAMDIVN     0x4C000018
  15.     /*FCLK:HCLK:PCLK=1:4:8*/
  16.     ldr r0, =CLKDIVN
  17.     mov r1, #0x05
  18.     str r1, [r0]

  19.     mrc p15, 0, r0, c1, c0, 0
  20.     orr r0, r0, #0xc0000000
  21.     mcr p15, 0, r0, c1, c0,0

  22.     /*MPLL=(2*m*Fin)/(P*(1<<S)), m=(MDIV+8), p=PDIV+2 s=SDIV*/
  23.     ldr r0, =MPLLCON 
  24.     ldr r1, =((0x5C<<12)|(0x01<<4)|(0x01))
  25.     str r1, [r0]
  26.     
  27.     ldr r0, =0x10000
  28. 1:
  29.     sub r0, r0, #1
  30.     bne 1b

  31.     /*UPLL=(m*Fin)/(P*(1<<S)), m=(MDIV+8), p=(PDIV+2), s=SDIV*/
  32.     ldr r0, =UPLLCON
  33.     ldr r1, =((0x10<<12)|(0x01<<4)|(0x01))
  34.     str r1, [r0]

  35.     ldr r0, =0x10000
  36. 1:
  37.     sub r0, r0, #1
  38.     bne 1b

  39.     ldr sp, =1024*4
  40.     bl init_sdram ;增加初始化sdram
  41.     bl main

  42. loop:
  43.     b loop

1.2 sdram.c

点击(此处)折叠或打开

  1. #define BWSCON (*(volatile unsigned int *) 0x48000000)
  2. #define BANKCON0 (*(volatile unsigned int *) 0x48000004)
  3. #define BANKCON1 (*(volatile unsigned int *) 0x48000008)
  4. #define BANKCON2 (*(volatile unsigned int *) 0x4800000C)
  5. #define BANKCON3 (*(volatile unsigned int *) 0x48000010)
  6. #define BANKCON4 (*(volatile unsigned int *) 0x48000014)
  7. #define BANKCON5 (*(volatile unsigned int *) 0x48000018)
  8. #define BANKCON6 (*(volatile unsigned int *) 0x4800001C)
  9. #define BANKCON7 (*(volatile unsigned int *) 0x48000020)
  10. #define REFRESH (*(volatile unsigned int *) 0x48000024)
  11. #define BANKSIZE (*(volatile unsigned int *) 0x48000028)
  12. #define MRSRB6 (*(volatile unsigned int *) 0x4800002C)
  13. #define MRSRB7 (*(volatile unsigned int *) 0x48000030)

  14. void init_sdram(void)
  15. {
  16. /* REFRESH parameter */
  17. #define REFEN 0x1 /* Refresh enable */
  18. #define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
  19. #define Trp          0x0
  20. #define Trc 0x3
  21. #define Tchr 0x2
  22. #define REFCNT 0x4f4

  23.     /* bank1,2-ide bk3,5,7-null bk4-dm9000 bk6-sdram*/
  24.     BWSCON =(0x02<<24);
  25.     BANKCON0 = 0x00000700;
  26.     BANKCON1 = 0x00000700;
  27.     BANKCON2 = 0x00000700;
  28.     BANKCON3 = 0x00000700;
  29.     BANKCON4 = 0x00000700;
  30.     BANKCON5 = 0x00000700;
  31.     BANKCON6 = (0x3<<15)|(0x01<<2)|0x01;
  32.     BANKCON7 = (0x3<<15)|(0x01<<2)|0x01;
  33.     REFRESH = ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT);
  34.     BANKSIZE = 0x32;
  35.     MRSRB6 = 0x30;
  36.     MRSRB7 = 0x30;
  37. }
 初始化内存就是要配置这十三个寄存器:
 BWSCON:
tq2440的bank用途:其中bank1,2用于ide,bank3没用,bank4 是dm9000, bank5没用, bank6-sdram ,bank7没用。现在要初始化内存所以只设定bank6,其它的bank不管。
DW6=0b10; //bus width for bank 6 is 32bit
WS6=0;    //Disable WAIT,不使用wait信号 (这个东东没有搞明白)
ST6=0;    //Not using UB/LB(Upper Byte/Lower Byte) (这个东东没有搞明白,应该是只有SRAM才有的东东)
BANKCON0-BANKCON5
BANKCON6-BANKCON7:
MT=0b11 ;// Sync. DRAM
Trcd = 0b01;//RAS to CAS delay 3clock (这个东东没有搞明白)
SCAN = 0b01;//Column address numbe ;从A0-A8共9根
2.3 main.c

点击(此处)折叠或打开

  1. #define GPBCON (*(volatile unsigned int *) 0x56000010)
  2. #define GPBDAT (*(volatile unsigned int *) 0x56000014)

  3. static inline void delay (unsigned long loops)
  4. {
  5.     __asm__ volatile ("1:\n"
  6.             "subs %0, %1, #1\n"
  7.             "bne 1b":"=r" (loops):"0" (loops));
  8. }

  9. void main(void)
  10. {
  11.     int i = 1;
  12.     int *= (int*) 0x30000000;
  13.     GPBCON = 0x15400;
  14.     /*测试sdram,向0x30000000写入一个数,并读取,如果没有改变,则说明sdram初始化成功*/
  15.     *= 0x12345678;
  16.     if(0x12345678 == *p)
  17.     {
  18. /*如果成功,则灯全亮*/
  19.         GPBDAT = 0;
  20.         delay(400000);
  21.     }
  22.     while(1)
  23.     {
  24.         GPBDAT = 0x7FF&(~i<<5);
  25.         i *= 2;
  26.         if(16==i)
  27.             i = 1;
  28.     }
  29.     return ;
  30. }
注:
内存初始化部分是通过天嵌的u-boot中lowlevel_init.S改过来的,有些东东还不是很清楚,完全自己写还有难度。
版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

Bootloader NORFLASH NANDFlash EBOOT NBOOT UBOOT SDRAM NK.bin NK.nb0

理清一下Bootloader NORFLASH NANDFlash EBOOT NBOOT UBOOT SDRAM NK.bin NK.nb0的关系 一、在掌上电脑里要使用NAND FLASH存储数...

Bootloader NORFLASH NANDFlash EBOOT NBOOT UBOOT SDRAM NK.bin NK.nb0

理清一下Bootloader NORFLASH NANDFlash EBOOT NBOOT UBOOT SDRAM NK.bin NK.nb0的关系 一、在掌上电脑里要使用NAND FLASH存储数...

理清一下Bootloader NORFLASH NANDFlash EBOOT NBOOT UBOOT SDRAM NK.bin NK.nb0的关系

理清一下Bootloader NORFLASH NANDFlash EBOOT NBOOT UBOOT SDRAM NK.bin NK.nb0的关系 一、在掌上电脑里要使用NAND FLASH存储数...

S3C2440片内SRAM初始化片外SDRAM

  • 2013年12月24日 22:17
  • 67KB
  • 下载

第五天:初始化SDRAM 设置S5PV210时钟系统

1.代码重定位实战: 判断重定位:adr 与 ldr 伪指令的区别 ldr 和 adr 都是伪指令,区别是ldr是长加载、adr是短加载。 重点:adr指令加载符号地址,加载的是运行时地址;ldr...
  • Karven_
  • Karven_
  • 2016年07月22日 21:53
  • 1329

2410 sdram 初始化

  • 2013年04月09日 11:20
  • 703B
  • 下载

【补充】为什么初始化SDRAM中 adrl r2, mem_cfg_val而不是 ldr r2,=mem_cfg_val

我们来回顾2440的启动方式 Nand启动 ①Nand前4K-> SRAM(2440中有4K的SRAM) ②CPU从0地址执行(SRAM的0地址) Nor启动 ①0->Nor ②CPU...

(7)uboot详解——初始化SDRAM

(7)uboot详解——初始化SDRAM 在开始这篇文章之前,我们先回顾一下(1)uboot详解——板子刚上电时都干了些什么,不管板子是从nandflash启动还是从norflash启动,它的开始代码...

S5PV210之SDRAM初始化详解

参考朱老师教程视频讲解,视频链接地址:http://edu.51cto.com/lecturer/user_id-9584512.html 1、SDRAM定义和特性SDRAM:Syncronized ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bootloader---12.sdram初始化
举报原因:
原因补充:

(最多只允许输入30个字)