SD卡启动mDDR SDRAM初始化
本帖最后由 dragonnk 于 2013-12-27 21:57 编辑前一帖子已经介绍了我使用的开发环境和下载程序在mDDR SDRAM 中运行,但是程序在RAM中运行不是长久之道,能把程序存在非易失性介质中并从中启动程序才是长久之道。查找了资料之后发现最便捷的做法就是从SD卡启动并将SD卡中保存的程序拷贝到内存中运行了。
S3C6410SD卡启动的过程:在开发板上设置从SD卡启动,上电后芯片先运行内部ROM固化的程序,主要实现时钟等系统的初始化,并将SD卡中固定位置固定大小的程序拷贝到内部RAM中,并从中开始运行。以上都是芯片自动完成的。实现此做法我觉得用户要做的关键步骤有两步,一是写好内存初始化程序和拷贝程序,二是将用户的启动程序和应用程序保存到SD卡中指定位置。下面具体介绍一下我的做法,供大家参考:
一、内存初始化和拷贝程序(包含两个文件)
init.s/* 此文件为汇编程序寄存器设置参考相关文档*/
.include "sfr.h"
.text
.global _start
_start:
ldr r0, =0x70000013
mcr p15,0,r0,c15,c2,4
/*DRAM配置开始*/
ldr r0,=MEM_SYS_CFG
ldr r1,=0x00
str r1,
ldr r0,=SPCONSLP
ldr r1,=0x30
str r1,
ldr r0,=P1MEMCCMD /*开始配置控制器*/
ldr r1,=0x04
str r1,
LDRR0,=P1REFRESH
LDRR1,=0x40d
STRR1,
LDR R0,=P1CASLAT
LDR R1,=0x6
STR R1,
LDR R0,=P1T_DQSS
LDR R1,=0x1
STR R1,
LDR R0,=P1T_MRD
LDR R1,=0x2
STR R1,
LDR R0,=P1T_RAS
LDR R1,=0x100
STR R1,
LDR R0,=P1T_RC
LDR R1,=0xA
STR R1,
LDR R0,=P1T_RCD
LDR R1,=0x1D
STR R1,
LDR R0,=P1T_RFC
LDR R1,=0x21f
STR R1,
LDR R0,=P1T_RP
LDR R1,=0x1D
STR R1,
LDR R0,=P1T_RRD
LDR R1,=0xf
STR R1,
LDR R0,=P1T_WR
LDR R1,=0x7
STR R1,
LDR R0,=P1T_WTR
LDR R1,=0x7
STR R1,
LDR R0,=P1T_XP
LDR R1,=0x2
STR R1,
LDR R0,=P1T_XSR
LDR R1,=0x1f
STR R1,
LDR R0,=P1T_ESR
LDR R1,=0x1f
STR R1,
LDR R0,=P1MEMCFG
LDR R1,=0x10012
STR R1,
LDR R0,=P1MEMCFG2
LDR R1,=0xB41 /**/
STR R1,
LDR R0,=P1_chip_0_cfg
LDR R1,=0x150F0
STR R1,
LDR R0,=P1_user_cfg
LDR R1,=0x0
STR R1,
LDR R0,=P1DIRECTCMD
LDR R1,=0xC0000
STR R1,
LDR R0,=P1DIRECTCMD
LDR R1,=0x00000
STR R1,
LDR R0,=P1DIRECTCMD
LDR R1,=0x40000
STR R1,
LDR R0,=P1DIRECTCMD
LDR R1,=0x40000
STR R1,
LDR R0,=P1DIRECTCMD
LDR R1,=0xA0000
STR R1,
LDR R0,=P1DIRECTCMD
LDR R1,=0x80032
STR R1,
LDR R0,=P1MEMCCMD
LDR R1,=0x0
STR R1,
LDR R0,=P1MEMSTAT
DRAM_WAIT:
LDR R1,
AND R1,R1,#0x3
CMP R1,#0x1
BNE DRAM_WAIT
/*DRAM配置结束*/
BL Main
.end
main.c/*主函数实现拷贝函数,调用的是芯片内部给出的程序,参考附件文档*/
#include <stdbool.h>
#define CopyMMCtoMem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned int *)0x0C004008)))(z,a,b,c,e))
void Main(void)
{
CopyMMCtoMem(0,0x30d40,10000,(unsigned int *)0x50000000,0);
__asm__("LDR PC,=0x50000000");
}
拷贝函数第一和最后一个参数不解释了设为0,第二个参数为SD卡中保存应用程序的起始扇区号(从0开始),第三个参数为拷贝的扇区数,第四个参数为目的首地址。
启动代码连接到内部RAM地址上,应用程序连接到目的RAM地址上。
应用程序就自己随便写了。
二、程序保存到SD卡中
启动代码要保存在SD卡倒数第九KB中,大小不能超过8KB(参考附件文件,2G含 以下的卡),应用程序即保存到拷贝函数中给定的起始扇区内。
SD卡格式化好后插入电脑,打开WinHEX软件,点“文件”“打开”打开启动代码的BIN文件。
点“工具”“打开磁盘”打开物理磁盘中是SD卡。
如附件图片中点向右箭头,在新位置输入2400 (16进制的),相对于结尾,确定。光标定位在蓝色位置,将光标移至下一位置。全选打开的启动代码文件复制,再回到刚才定位好的磁盘内,点“编辑”下的二级菜单“写入”,或点工具栏的写入按钮,最后点“保存”,写入到SD卡中。
写入应用程序代码类似,只是定位时新位置选单位为扇区,输入拷贝函数中的参数值,相对于开头。
保存好后取下SD卡插入开板上电启动OK了,程序拷到RAM中运行了!
注:附件文件太大了传不了,标题为 S3C6410_Internal_ROM_Booting 搜一下网上就能下到,不好意思了!
页:
[1]