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改过来的,有些东东还不是很清楚,完全自己写还有难度。
版权声明:本文为博主原创文章,转载请注明出处。

CSS样式初始化代码

CSS样式初始化代码 为什么要初始化CSS?       建站老手都知道,这是为了考虑到浏览器的兼容问题,其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏...
  • pengpengpeng85
  • pengpengpeng85
  • 2016年07月30日 06:26
  • 11970

Java中String字符串初始化细节

Java中String类型细节一 . String两种初始化方式1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否存在...
  • u012768347
  • u012768347
  • 2017年03月04日 00:42
  • 3639

MySQL5.7数据库怎么初始化?

MySQL 5.7发布了,不少网友发现:打开想安装文件夹,但是文件夹中没有DATA目录, 没有mysqly默认库。启动不了数据库,那是因为5.7的数据库的初始化方法和之前的初始化不一样了。...
  • jiangmy927
  • jiangmy927
  • 2016年09月03日 14:06
  • 7905

二叉树的初始化

问题: 给定二叉树的初始化数据,怎样动态建立一个二叉树呢? 比如我们给定这样的一组数据:{ 1, 2, 3, 4, 0, 5, 6, 0, 7 }(假设0代表空),则我们构建的二叉树是这样的: ...
  • T_27080901
  • T_27080901
  • 2015年03月12日 16:26
  • 5430

Linux系统初始化流程

linux系统的启动,指的是从系统加电到系统控制台显示“login:”登录提示符为止的系统运行阶段,与这部分动作密切相关的代码主要是: 四个汇编程序:bootsect.S setup.S head...
  • viewsky11
  • viewsky11
  • 2016年11月04日 23:08
  • 485

JAVA构造MAP并初始化MAP

如何简洁且正确地构造MAP并初始化MAP   public class Demo{     private static final Map myMap;     st...
  • dujianxiong
  • dujianxiong
  • 2017年02月03日 19:40
  • 21697

js中初始化的事件

js中初始化常用的三种方法://方法一:(jQuery) $(document).ready(function(){ }); //方法二:(jQuery) $(function(){ }); ...
  • xiejunna
  • xiejunna
  • 2017年04月12日 16:00
  • 1675

串口通信初始化

出处:http://www.cnblogs.com/nibuyaoni/p/5732526.html (1)先来说说串口通信的特点。   串行通信(UART)的全称是:Universal asyn...
  • Echo_Ana
  • Echo_Ana
  • 2016年12月07日 20:36
  • 1427

结构体的4种初始化方式

// // main.c // C语言学习 #include int main(int argc, const char * argv[]) { //定义结构体类型 ...
  • github_26672553
  • github_26672553
  • 2015年12月22日 20:44
  • 16320

vector的几种初始化和遍历

随着C++11标准的出现,vector出现了新的初始化和遍历用法,但是vs2010和较高版本并没有能完全支持C++11标准,所以我就将它的所有的用法归纳了一下。 vector的初始化 ve...
  • u011543018
  • u011543018
  • 2016年02月23日 19:05
  • 14114
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bootloader---12.sdram初始化
举报原因:
原因补充:

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