设为首页 加入收藏

TOP

mini2440 使用sdram
2014-11-24 01:43:12 来源: 作者: 【 】 浏览:1
Tags:mini2440 使用 sdram

在S3C2440A user manual.pdf 的第五章有 Memory Controller的介绍。设置memory controller是为了明确各个bank(硬件决定出的地址空间)属性,包括数据位宽、WAIT信号、访问时序、刷新周期、bank起始位置和大小 (仅对bank6、7)及SDRAM模式。《嵌入式Linux应用开发完全手册》第6章对各寄存器有较详细叙述,再配上 S3C2440A user manual.pdf 各寄存器个字段含义应属明确。只可惜这些还不够,举例来说要设置SDRAM各参数,没有SDRAM数据手册是没法做的,在这个百花齐放的世界里真没什么是 通吃的。


《嵌入式Linux应用开发完全手册》对应的SDRAM是K4S561632C,我手头的mini2440开发板上的号称是 HY57V561620FTP,但芯片上的丝印被刻意划掉了,隐约看到一个M的logo和无法辨认的一串数字,而且2片还不一样!面对此情此景除了发自肺 腑的一句“你妹呀~”实在不知再说些什么。


mini2440 板子入手在nor 上已有可正常运行的 supervivi,进入它的命令行模式,输入:
mem info,它自曝了 memory controller 各寄存器设置,既然它工作正常就用这套值吧


Supervivi> mem info



RAM Information:


Default ram size: 64M


Real ram size : 64M


Free memory : 61M



RAM mapped to : 0x30000000 - 0x34000000


Flash memory mapped to : 0x10000000 - 0x12000000


Available memory region : 0x30000000 - 0x33d80000


Stack base address : 0x33defffc


Current stack pointer : 0x33defb6c



Memory control register vlaues


BWSCON = 0x22111112


BANKCON0 = 0x00000700


BANKCON1 = 0x00000700


BANKCON2 = 0x00000700


BANKCON3 = 0x00000700


BANKCON4 = 0x00000700


BANKCON5 = 0x00000700


BANKCON6 = 0x00018009


BANKCON7 = 0x00018009


REFRESH = 0x008e04eb


BANKSIZE = 0x000000b2


MRSRB6 = 0x00000030


MRSRB7 = 0x00000030


DSC0 = 0x00000000


DSC1 = 0x00000000


准 备工作还有如何拷贝内存数据。真正有意义的是从flash 拷贝到sdram但鉴于我还没到这步,先搞点无意义的从片内ram到sdram吧,这里的重点是“位置无关指令”这个概念。如果这个解决了剩下就是位置相 关指令的定位,换言之怎么链接,怎么加载,也就是如何保证运行地址的正确性。


S3C2440A 是 ARM920T 处理器类型,属于 ARMv4T 架构,其位置无关指令包括 b bl。
假 想我有一些大个函数必须在 sdram 中调用,它们开机时是存在 flash 中的,那么必须先设置好内存控制器,然后从flash中读出这些函数的机器码写到sdram中去,然后再“跳”到sdram 中执行之。mini2440的sdram 起始地址是在bank6的(S3C2440A允许在bank7也挂sdram,但mini2440把它们都挂在bank6了)故这些大个函数在连接时必须 指定其所处段的运行地址在 0x30000000 之上。
位置相关指令要用以运行地址计算出来的绝对地址,上面那些大个函数中的绝对地址一定会在0x30000000之上,在没有初始化内存控制器之前bank6中的地址是不存在的,此时只能用位置无关指令。这些指令无论你在链接时指定的运行地址是什么都能通过相对值正确跳转。


软件分成2部分,一个汇编用于必要寄存器初始化和拷贝内存,再加设置sp和跳转main;一个cpp用于模拟大块头。
先是 head.s


.text


.global _start


_start:


bl kill_dog


bl control_mem


bl copy2sdram


ldr pc, =sdram


sdram:


mov sp, #0x34000000


bl main


_end:


b _end



kill_dog:


mov r0, #0x53000000


mov r1, #0


str r1, [r0]


mov pc, lr



control_mem:


mov r0, #0x48000000


ldr r1, =0x22111112


str r1, [r0], #4


mov r1, #0x00000700


str r1, [r0], #4


mov r1, #0x00000700


str r1, [r0], #4


mov r1, #0x00000700


str r1, [r0], #4


mov r1, #0x00000700


str r1, [r0], #4


mov r1, #0x00000700


str r1, [r0], #4


mov r1, #0x00000700


str r1, [r0], #4


ldr r1, =0x00018009


str r1, [r0], #4


ldr r1, =0x00018009


str r1, [r0], #4


ldr r1, =0x008e04eb


str r1, [r0], #4


mov r1, #0x000000b2


str r1, [r0], #4


mov r1, #0x00000030


str r1, [r0], #4


mov r1, #0x00000030


str r1, [r0], #4


mov r1, #0x00000000


str r1, [r0], #4


mov r1, #0x00000000


str r1, [r0], #4


mov pc, lr



copy2sdram:


mov r0, #0


mov r1, #0x30000000


ldr r2, =0x1000


loop:


ldr r3, [r0], #4


str r3, [r1], #4


cmp r0, r2


bne loop


mov pc, lr



注意其中 ldr pc, =sdram


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java instrment手工加载Log4j配置.. 下一篇PHP+MySQL留言板开发例子

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: