嵌入式爱好者

查看: 5738|回复: 0

[裸机程序] SD卡启动mDDR SDRAM初始化

[复制链接]

7

主题

15

帖子

28

积分

扫一扫,手机访问本帖
发表于 2013-12-27 21:51:25 | 显示全部楼层 |阅读模式
本帖最后由 dragonnk 于 2013-12-27 21:57 编辑

      前一帖子已经介绍了我使用的开发环境和下载程序在mDDR SDRAM 中运行,但是程序在RAM中运行不是长久之道,能把程序存在非易失性介质中并从中启动程序才是长久之道。查找了资料之后发现最便捷的做法就是从SD卡启动并将SD卡中保存的程序拷贝到内存中运行了。
      S3C6410  SD卡启动的过程:在开发板上设置从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,[r0]   

    ldr r0,=SPCONSLP
    ldr r1,=0x30
    str r1,[r0]  

    ldr r0,=P1MEMCCMD   /*开始配置控制器*/
    ldr r1,=0x04
    str r1,[r0]   

    LDR  R0,=P1REFRESH        
    LDR  R1,=0x40d
    STR  R1,[R0]  

    LDR     R0,=P1CASLAT         
    LDR     R1,=0x6  
    STR     R1,[R0]   
      
    LDR     R0,=P1T_DQSS  
    LDR     R1,=0x1
    STR     R1,[R0]  
      
    LDR     R0,=P1T_MRD  
    LDR     R1,=0x2
    STR     R1,[R0]  

    LDR     R0,=P1T_RAS  
    LDR     R1,=0x100
    STR     R1,[R0]  
  
    LDR     R0,=P1T_RC  
    LDR     R1,=0xA  
    STR     R1,[R0]  
  
    LDR     R0,=P1T_RCD  
    LDR     R1,=0x1D
    STR     R1,[R0]  
      
    LDR     R0,=P1T_RFC  
    LDR     R1,=0x21f
    STR     R1,[R0]  
  
    LDR     R0,=P1T_RP  
    LDR     R1,=0x1D
    STR     R1,[R0]  
      
    LDR     R0,=P1T_RRD  
    LDR     R1,=0xf
    STR     R1,[R0]  
      
    LDR     R0,=P1T_WR  
    LDR     R1,=0x7  
    STR     R1,[R0]  
      
    LDR     R0,=P1T_WTR  
    LDR     R1,=0x7
    STR     R1,[R0]  
      
    LDR     R0,=P1T_XP  
    LDR     R1,=0x2
    STR     R1,[R0]  
      
    LDR     R0,=P1T_XSR  
    LDR     R1,=0x1f
    STR     R1,[R0]  
      
    LDR     R0,=P1T_ESR  
    LDR     R1,=0x1f
    STR     R1,[R0]  
      
    LDR     R0,=P1MEMCFG  
    LDR     R1,=0x10012
    STR     R1,[R0]  
      
    LDR     R0,=P1MEMCFG2  
    LDR     R1,=0xB41 /**/
    STR     R1,[R0]   
      
    LDR     R0,=P1_chip_0_cfg  
    LDR     R1,=0x150F0
    STR     R1,[R0]  
      
    LDR     R0,=P1_user_cfg  
    LDR     R1,=0x0  
    STR     R1,[R0]  

    LDR     R0,=P1DIRECTCMD  
    LDR     R1,=0xC0000  
    STR     R1,[R0]  
      
    LDR     R0,=P1DIRECTCMD  
    LDR     R1,=0x00000  
    STR     R1,[R0]  

    LDR     R0,=P1DIRECTCMD  
    LDR     R1,=0x40000  
    STR     R1,[R0]  

    LDR     R0,=P1DIRECTCMD  
    LDR     R1,=0x40000
    STR     R1,[R0]  

    LDR     R0,=P1DIRECTCMD   
    LDR     R1,=0xA0000
    STR     R1,[R0]  

    LDR     R0,=P1DIRECTCMD  
    LDR     R1,=0x80032
    STR     R1,[R0]  

    LDR     R0,=P1MEMCCMD  
    LDR     R1,=0x0  
    STR     R1,[R0]

    LDR     R0,=P1MEMSTAT   
    DRAM_WAIT:  
    LDR     R1,[R0]  
    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 搜一下网上就能下到,不好意思了!

3.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-31 00:01

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表