sdram控制器的初始化,无非就是向相应的特殊功能寄存器中写值.翻开2410的数据手册,可以看到,sdram有13个特殊功能寄存器,从0x48000000开始向高低连排布.那么我们只要配置好这13个寄存器就完成了对sdram的初始化.
mem_cfg_val:
.long 0x22111110 @ vBWSCON
.long 0x00000700 @ vBANKCON0
.long 0x00000700 @ vBANKCON1
.long 0x00000700 @ vBANKCON2
.long 0x00000700 @ vBANKCON3
.long 0x00000700 @ vBANKCON4
.long 0x00000700 @ vBANKCON5
.long 0x00018005 @ vBANKCON6
.long 0x00018005 @ vBANKCON7
.long 0x008e0459 @ vREFRESH
.long 0xb2 @ vBANKSIZE
.long 0x30 @ vMRSRB6
.long 0x30 @ vMRSRB7
以上这一段,相当于定义了一个数组,数组名(即数组的首地址)为mem_cfg_val.该数组的长度为13,数组中的每个元素都存放着一个32位的具体数值.我们只要将这个数组的值一一对应的赋给0x48000000开始的13个寄存器即可.
这些数组里的值是如何确定的呢?即,我们将sdram初始化成一个什么样的状态呢?那么我们来一个一个的分析吧:
1. BWSCON
主要控制总线宽度
总共有8个bank,每个bank用4位来控制,共8*4=32位.正好以16进制写出时,每个数字即控制一个bank.
这里我们的sdram放在bank6,所以主要对sdram6要配置正确.
0x22111110 : bank[7:6] 32位总线. bank[5:1] 16位 bank0特殊一些,由OM[1:0]控制,硬件电路里可由跳线来配置.
2. BANKCON
对于bank[5:0],可以不管它,采用默认值0x00000700即可.
对于bank[7:6],由于只有这两个bank能放置ram,所以配置起来会特殊一些.0x00018005.具体可参考数据手册和<2410完全开发流程>,上面讲得很清楚.
3. REFRESH
控制sdram的自刷新.这里我算出来的是0x008e04f3
计算公式为2^11 + 1 - 100 * (64*1000/8192) = 4f3
不知道这个有没有影响.
4. BANKSIZE
bank[7:6]的大小是可配置的,就在这里配置.配置多了没关系,程序可以检测出来.
5. MRSRB
参见参考资料
-----------------------------------------------------------------------------------------
参考资料: <2410完全开发流程>
<2410数据手册>
阅读(1203) | 评论(0) | 转发(0) |