mini2440 使用sdram
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应用开发完全手册》PDF光盘源代码等全套
《嵌入式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
|
评论暂时关闭