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

  • 1
  • 2
  • 3
  • 下一页

相关内容