二、编写 s3c24x0 的 bootloader——SDRAM 设置

2.1 介绍

2.1.1 硬件

在对时钟频率进行初始化之后,就可以使用存储器控制器对 SDRAM 进行初始化了。

可以看看存储器控制器的映射表:

  

 

由图上可以看出,S3C2440 可以接两个 SDRAM,一个起始地址是 0x30000000,一个是 0x38000000,分别由片选信号 nGCS6 和 nGCS7 控制。

查看原理图上的 SDRAM 控制电路:

  

 

 使用的是 nGCS6,那么 SDRAM 的地址就是 0x30000000

 2.1.2 寄存器

存储器控制器涉及到的寄存器很多,具体看芯片手册。

2.2 代码编写

start.S 代码中:

1     /** 5. 初始化 SDRAM */
2     mov ip, lr          /** 保存当前程序地址到 ip  寄存器 */
3     bl sdram_init       /** 执行 SDRAM 的初始化 */
4     mov    lr, ip

跳转到 sdram_init 标签中执行

sdram_init.S,这里是使用的 uboot 中的源码。

  1 /** =============== BWSCON: 地址 0x48000000 总线宽度和等待控制寄存器 ================ */
  2 #define BWSCON    0x48000000
  3 
  4 /* DW:数据总线宽度数据定义 */
  5 #define DW8                (0x0)   /** 8 位数据总线宽度 */
  6 #define DW16            (0x1)   /** 16 位数据总线宽度 */
  7 #define DW32            (0x2)   /** 32 位数据总线宽度 */
  8 
  9 /* WS: wait 状态 */
 10 #define WAIT            (0x1<<2)    /** 开启 BANK 的 WAIT 功能 */
 11 
 12 /* ST: 是否使用 使用 UB/LB */
 13 #define UBLB            (0x1<<3)    /** BANK 使用 UB/LB */
 14 
 15 #define B1_BWSCON        (DW32)      /** BANK1 的总线位宽设置 32 位 */
 16 #define B2_BWSCON        (DW16)      /** BANK2 的总线位宽设置 16 位 */
 17 #define B3_BWSCON        (DW16 + WAIT + UBLB)    /** BANK3 的总线位宽设置 16 位,使能 WAIT 和 UB/LB */
 18 #define B4_BWSCON        (DW16)      /** BANK4 的总线位宽设置 16 位 */
 19 #define B5_BWSCON        (DW16)      /** BANK5 的总线位宽设置 16 位 */
 20 #define B6_BWSCON        (DW32)      /** BANK6 的总线位宽设置 32 位 */
 21 #define B7_BWSCON        (DW32)      /** BANK7 的总线位宽设置 32 位 */
 22 
 23 /** =================================== end BWSCON =============================== */
 24 
 25 /** =============== BANK0CON: 地址 0x48000004 BANK0 控制寄存器 ===================== */
 26 #define B0_Tacs            0x0    /*  0clk */
 27 #define B0_Tcos            0x0    /*  0clk */
 28 #define B0_Tacc            0x7    /* 14clk */
 29 #define B0_Tcoh            0x0    /*  0clk */
 30 #define B0_Tah            0x0    /*  0clk */
 31 #define B0_Tacp            0x0
 32 #define B0_PMC            0x0    /* normal */
 33 /** =================================== end BANK0CON =============================== */
 34 
 35 /** =============== BANK1CON: 地址 0x48000008 BANK1 控制寄存器 ===================== */
 36 #define B1_Tacs            0x0    /*  0clk */
 37 #define B1_Tcos            0x0    /*  0clk */
 38 #define B1_Tacc            0x7    /* 14clk */
 39 #define B1_Tcoh            0x0    /*  0clk */
 40 #define B1_Tah            0x0    /*  0clk */
 41 #define B1_Tacp            0x0
 42 #define B1_PMC            0x0
 43 /** =================================== end BANK1CON =============================== */
 44 
 45 /** =============== BANK2CON: 地址 0x4800000C BANK2 控制寄存器 ===================== */
 46 #define B2_Tacs            0x0
 47 #define B2_Tcos            0x0
 48 #define B2_Tacc            0x7
 49 #define B2_Tcoh            0x0
 50 #define B2_Tah            0x0
 51 #define B2_Tacp            0x0
 52 #define B2_PMC            0x0
 53 /** =================================== end BANK2CON =============================== */
 54 
 55 /** =============== BANK3CON: 地址 0x48000010 BANK3 控制寄存器 ===================== */
 56 #define B3_Tacs            0x0    /*  0clk */
 57 #define B3_Tcos            0x3    /*  4clk */
 58 #define B3_Tacc            0x7    /* 14clk */
 59 #define B3_Tcoh            0x1    /*  1clk */
 60 #define B3_Tah            0x0    /*  0clk */
 61 #define B3_Tacp            0x3     /*  6clk */
 62 #define B3_PMC            0x0    /* normal */
 63 /** =================================== end BANK3CON =============================== */
 64 
 65 /** =============== BANK4CON: 地址 0x48000014 BANK4 控制寄存器 ===================== */
 66 #define B4_Tacs            0x0    /*  0clk */
 67 #define B4_Tcos            0x0    /*  0clk */
 68 #define B4_Tacc            0x7    /* 14clk */
 69 #define B4_Tcoh            0x0    /*  0clk */
 70 #define B4_Tah            0x0    /*  0clk */
 71 #define B4_Tacp            0x0
 72 #define B4_PMC            0x0    /* normal */
 73 /** =================================== end BANK4CON =============================== */
 74 
 75 /** =============== BANK5CON: 地址 0x48000018 BANK5 控制寄存器 ===================== */
 76 #define B5_Tacs            0x0    /*  0clk */
 77 #define B5_Tcos            0x0    /*  0clk */
 78 #define B5_Tacc            0x7    /* 14clk */
 79 #define B5_Tcoh            0x0    /*  0clk */
 80 #define B5_Tah            0x0    /*  0clk */
 81 #define B5_Tacp            0x0
 82 #define B5_PMC            0x0    /* normal */
 83 /** =================================== end BANK5CON =============================== */
 84 
 85 /** =============== BANK6CON: 地址 0x4800001C BANK6 控制寄存器 ===================== */
 86 #define B6_MT            0x3    /* 配置BANK6的存器类型为 SDRAM */
 87 #define B6_Trcd            0x1
 88 #define B6_SCAN            0x1    /* 9bit */
 89 /** =================================== end BANK6CON =============================== */
 90 
 91 /** =============== BANK7CON: 地址 0x48000020 BANK7 控制寄存器 ===================== */
 92 #define B7_MT            0x3    /* SDRAM */
 93 #define B7_Trcd            0x1    /* RAS 到 CAS 的延迟为 3 个时钟 */
 94 #define B7_SCAN            0x1    /* 列地址数为 9bit */
 95 /** =================================== end BANK7CON =============================== */
 96 
 97 /** =============== REFRESH: 地址 0x48000024 BANK7 SDRAM 刷新控制寄存器 ===================== */
 98 #define REFEN            0x1    /* SDRAM 刷新使能 */
 99 #define TREFMD            0x0    /* SDRAM 刷新模式为 CBR/自动刷新*/
100 #define Trp                0x0 /* SDRAM RAS 预充电时间 2 个时钟 */
101 #define Trc                0x3    /* SDRAM 半行周期时间 7 个时钟 */
102 #define Tchr            0x2    /* 3clk */
103 #define REFCNT            1113    /* SDRAM 刷新计数值, period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
104 /** ======================================== end REFRESH ================================== */
105 
106 .globl sdram_init
107 sdram_init:
108     /* memory control configuration */
109     /* make r0 relative the current location so that it */
110     /* reads SMRDATA out of FLASH rather than memory ! */
111     ldr     r0, =SMRDATA    /** 执行 SMRDATA 函数,对各个寄存器进行配置 */
112     ldr        r1, =CONFIG_SYS_TEXT_BASE   /** CONFIG_SYS_TEXT_BASE 为 0 */
113     sub        r0, r0, r1
114     ldr        r1, =BWSCON    /* Bus Width Status Controller */
115     add     r2, r0, #13*4   /* 将SMRDATA这一块地址赋值给r2中 */
116 0:      /** 循环操作 */
117     ldr     r3, [r0], #4
118     str     r3, [r1], #4
119     cmp     r2, r0
120     bne     0b  /** 比较R2和R1,如果不相等,则跳回前面的 0 标号 */
121 
122     /* everything is fine now */
123     mov    pc, lr
124 
125     .ltorg
126 /* the literal pools origin */
127 
128 SMRDATA:
129     .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
130     .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
131     .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
132     .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
133     .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
134     .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
135     .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
136     .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
137     .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
138     .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
139     .word 0x32
140     .word 0x30
141     .word 0x30

 

posted @ 2020-05-17 16:51  游戏进行中  阅读(282)  评论(0)    收藏  举报