dragonnk 发表于 2013-12-27 21:51:25

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]
查看完整版本: SD卡启动mDDR SDRAM初始化