Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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光盘源代码等全套 http://www.linuxidc.com/Linux/2011-01/31114.htm《嵌入式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