导 航┆主 站┆文 章┆资 料┆下 载┆美 食┆读 书┆笑 话┆博 客┆论 坛
>> Tony嵌入式开发论坛静态版首页
查看完全版本:Tony嵌入式开发论坛

 

    基于S3C4510B的BSP入口函数romInit.s详解
    作者:lastwing 时间:2008-9-9 21:02:28



    S3C4510B的BSP入口函数解释


    (一) romInit.s

    /********************** romInit.s 的ROM初始化模块 ***************/

    .data
    .globl _copyright_wind_river
    .long _copyright_wind_river

    /****************************************************************************************/
    描述:
    (1) 该模块包含bootrom和vxworks_rom(从rom中启动的vxworks映象)的入口,入口函数
    是romInit(),该函数是在系统上电时第一个被执行的函数,它进行最小的初始化工作,为C函
    数的运行准备条件,该函数最后调用all/bootInit.c文件中的romStart()函数,并传递启动
    类型参数BOOT_COLD(冷启动)给romStart();

    (2)ronInit()屏蔽处理器中断和中断控制器,设置初始的堆栈指针到STACK_ADRS(该地址在
    all/configAll.h中定义),其他的硬件初始化工作(如串口的初始化)在sysLib.c中的
    sysHwInit()中完成;

    (3)sysLib.c中的函数sysToMonitor()只是把pc指针跳转到romInit标号后面进行系统的热启动
    (跳转地址为ROM_WARM_ADRS),并把启动类型传递到romStart();
    ******************************************************************************************/

    #define _ASMLANGUAGE
    #include "vxWorks.h"
    #include "sysLib.h"
    #include "arch/arm/arm.h"
    #include "arch/arm/mmuArmLib.h"
    #include "config.h"
    #include "regs.h"

    /* internals */

    .globl _romInit /* 只是申明_romInit为全局标号 */
    .globl _sdata /* 申明_sdata全局标号 */

    /* externals */

    .globl _romStart /* 申明外部函数romStart */

    _sdata: /* _sdata的真正定义在此处 */
    .asciz "start of data"
    .balign 4

    .text
    .balign 4


    _ARM_FUNCTION(_romInit) /* _romInit的真正定义在此处 */

    cold:
    MOV r0, #BOOT_COLD /* 保存启动类型BOOT_COLD到r0中 */

    warm: /* sysToMonitor()函数跳转到此处进行热启动 */
    B start

    /*下面的该字符串不要随便更改,在sysToMonitor()处进行了检查 */

    .ascii "Copyright 1984-1998 Wind River Systems, Inc."
    .balign 4

    start:

    MRS r1, cpsr
    BIC r1, r1, #MASK_MODE
    ORR r1, r1, #MODE_SVC32 | I_BIT | F_BIT
    MSR cpsr, r1 /*这几个语句禁止中断,设置为管理模式*/

    MOV r13, r0 /* 保存启动类型到r13中,后面要使用r0寄存器 */


    LDR r2, L$_SndsIntmsk /* 0x4008为4510B的INTMASK中断屏蔽寄存器地址 */
    MVN r1, #0 /* &FFFFFFFF */
    STR r1, [r2] /* 屏蔽所有的中断源(4510B共计支持21个中断源) */


    CMP r0, #BOOT_COLD /* 如果不是冷启动,则不重新进行内存的配置,跳过下面的代码*/
    BNE HiPosn


    MOV r0, #DRAM_TYPE /* 在config.h中配置为0x01,即SDRAM */
    CMP r0, #0x01 /* SDRAM = 0x01, EDO DRAM = 0x00 */
    BNE EDO_RAM /* 如果不是SDRAM则跳过下面的语句 */

    SYNC_DRAM:

    LDR r0, L$_SndsSyscfg /*0x3ff0000为4510B的系统管理配置寄存器:SYSCFG */
    LDR r1, L$_SysCfgSdram
    STR r1, [r0]

    /********************对此处SYSCFG配置值的说明*****************************************
    L$_SysCfgSdram的值为1000,0111,1111,1111,1111,1111,1001,0000,
    CE:0 即屏蔽cache,WE:0,即屏蔽写缓冲,CM:01:即cache模式为8K cache;
    内部SRAM基地址为11,1111,1110,即0x3FE,0000
    特殊寄存器基地址为:11,1111,1111,即:3FF0000,
    产品号PD_ID为:00001,即S3C4510X,
    SDRAM模式为1:4个DRAM组均为SDRAM接口
    *************************************************************************************/


    LDR r1, L$_SystemInitDataSDRAM

    LDR r2, L$_SystemInitDataSDRAM + 0x04
    LDR r3, L$_SystemInitDataSDRAM + 0x08
    LDR r4, L$_SystemInitDataSDRAM + 0x0c
    LDR r5, L$_SystemInitDataSDRAM + 0x10
    LDR r6, L$_SystemInitDataSDRAM + 0x14
    LDR r7, L$_SystemInitDataSDRAM + 0x18

    LDR r8, L$_SystemInitDataSDRAM + 0x1c
    LDR r9, L$_SystemInitDataSDRAM + 0x20
    LDR r10,L$_SystemInitDataSDRAM + 0x24
    LDR r11,L$_SystemInitDataSDRAM + 0x28
    LDR r12,L$_SystemInitDataSDRAM + 0x2c
    LDR r0, L$_SndsExtdbwth /* Extdbwth Offset : 0x3010 */
    STMIA r0, {r1-r12} /*r1->[r0],r2->[r0+4],r3->[r0+8],.... */

    /************ 对此处配置的说明,具体的配置值在snds100.h中定义 ****************************
    数据总线宽度寄存器EXTDBWTH(0x3010):ROM0和ROM1为半字(16位)宽度,其余ROM和DRAM的都是32位宽度!
    ROM/SRAM/FLASH组0控制寄存器 ROMCON0(0X3014):ROM0的起始地址为0,结束地址为0x80000;
    ROM/SRAM/FLASH组1控制寄存器 ROMCON1(0X3018):0x60,普通ROM,页访问周期5个周期,可编程访问周期7个周期,首尾地址都为0
    ROM/SRAM/FLASH组2控制寄存器 ROMCON2(0X301C):0x60,普通ROM,页访问周期5个周期,可编程访问周期7个周期,首尾地址都为0
    ROM/SRAM/FLASH组3控制寄存器 ROMCON3(0X3020):0x60,普通ROM,页访问周期5个周期,可编程访问周期7个周期,首尾地址都为0
    ROM/SRAM/FLASH组4控制寄存器 ROMCON4(0X3024):0x60,普通ROM,页访问周期5个周期,可编程访问周期7个周期,首尾地址都为0
    ROM/SRAM/FLASH组5控制寄存器 ROMCON5(0X3028):0x60,普通ROM,页访问周期5个周期,可编程访问周期7个周期,首尾地址都为0

    DRAM组0控制寄存器 DRAMCON0(0X302C):基地址为0x1000000,结束地址为:0x1400000,即实际内存大小为4M
    DRAM组0控制寄存器 DRAMCON1(0X3030):0x00,无效
    DRAM组0控制寄存器 DRAMCON2(0X3034):0x00,无效
    DRAM组0控制寄存器 DRAMCON3(0X3038):0x00,无效
    外部IO组基地址控制寄存器REFEXTCON(0X303C):外部IO基地址为0x3600000
    ***************************************************************************************/


    MOV r0, #RESET_ROM_START /* ROM的起始地址:0x0,在snds100.h中定义 */
    MOV r1, #ROM_SIZE /* 0x0080000,在config.h中定义,512K*/
    MOV r2, #RESET_DRAM_START /* SDRAM起始地址:0x1000000,在snds100.h中定义 */

    ROM2SDRAM_COPY_LOOP:
    LDR r3, [r0], #4 /*[r0]->r3,r0+4->r0 */
    STR r3, [r2], #4 /*[r2]<-r3,r2+4->r2 */
    SUBS r1, r1, #4 /* Down Count */
    BNE ROM2SDRAM_COPY_LOOP /* 把代码从ROM中的0地址处拷贝到SDRAM中起始地址处,拷贝512K长度*/


    /*注意:代码运行到此处,在ROM中和在SDRAM中各存在一份代码,但执行的还是ROM中的代码*/

    LDR r1, L$_SystemInitDataSDRAM_S
    LDR r2, L$_SystemInitDataSDRAM_S + 0x04
    LDR r3, L$_SystemInitDataSDRAM_S + 0x08
    LDR r4, L$_SystemInitDataSDRAM_S + 0x0c
    LDR r5, L$_SystemInitDataSDRAM_S + 0x10
    LDR r6, L$_SystemInitDataSDRAM_S + 0x14
    LDR r7, L$_SystemInitDataSDRAM_S + 0x18
    LDR r8, L$_SystemInitDataSDRAM_S + 0x1c
    LDR r9, L$_SystemInitDataSDRAM_S + 0x20
    LDR r10,L$_SystemInitDataSDRAM_S + 0x24
    LDR r11,L$_SystemInitDataSDRAM_S + 0x28
    LDR r12,L$_SystemInitDataSDRAM_S + 0x2c
    LDR r0, L$_SndsExtdbwth /* ROMCntr Offset : 0x3010 */
    STMIA r0, {r1-r12}
    /*此处重新映射系统的ROM和SDRAM的地址,把ROM的起始地址映射到0x1000000~0x1800000,即16M开始的512K空间 SDRAM1映射到0~0x400000,即4M的地址空间,其余的不作改变 */

    LDR PC, L$_HiPosn

    /*到此处时,由于系统的地址进行了重新的映射,所以需要重新进行定位,其实就是到HiPosn进行执行*/


    /*下面的代码进行EDORAM的初始化配置,过程与SDRAM相同,不在说明*/
    EDO_RAM:

    LDR r0, L$_SndsSyscfg
    LDR r1, L$_SysCfg
    STR r1, [r0]

    LDR r1, L$_SystemInitData
    LDR r2, L$_SystemInitData + 0x04
    LDR r3, L$_SystemInitData + 0x08
    LDR r4, L$_SystemInitData + 0x0c
    LDR r5, L$_SystemInitData + 0x10
    LDR r6, L$_SystemInitData + 0x14
    LDR r7, L$_SystemInitData + 0x18
    LDR r8, L$_SystemInitData + 0x1c
    LDR r9, L$_SystemInitData + 0x20
    LDR r10,L$_SystemInitData + 0x24
    LDR r11,L$_SystemInitData + 0x28
    LDR r12,L$_SystemInitData + 0x2c
    LDR r0, L$_SndsExtdbwth /* ROMCntr Offset : 0x3010 */
    STMIA r0, {r1-r12}


    MOV r0, #RESET_ROM_START /* Get pointer to ROM data */
    MOV r1, #ROM_SIZE /* and RAM copy */
    MOV r2, #RESET_DRAM_START /* Copy DRAM area base */

    ROM2DRAM_COPY_LOOP:
    LDR r3, [r0], #4
    STR r3, [r2], #4
    SUBS r1, r1, #4 /* Down Count */
    BNE ROM2DRAM_COPY_LOOP

    LDR r1, L$_SystemInitData_S
    LDR r2, L$_SystemInitData_S + 0x04
    LDR r3, L$_SystemInitData_S + 0x08
    LDR r4, L$_SystemInitData_S + 0x0c
    LDR r5, L$_SystemInitData_S + 0x10
    LDR r6, L$_SystemInitData_S + 0x14
    LDR r7, L$_SystemInitData_S + 0x18
    LDR r8, L$_SystemInitData_S + 0x1c
    LDR r9, L$_SystemInitData_S + 0x20
    LDR r10,L$_SystemInitData_S + 0x24
    LDR r11,L$_SystemInitData_S + 0x28
    LDR r12,L$_SystemInitData_S + 0x2c
    LDR r0, L$_SndsExtdbwth
    STMIA r0, {r1-r12}
    LDR PC, L$_HiPosn

    /* 上面的代码完成了EDO_RAM的配置、代码的拷贝、地址的重映射工作 */

    HiPosn:


    MOV r0, r13 /* 把启动类型重新保存到R0中 */
    LDR sp, L$_STACK_ADDR /* 初始化堆栈指针 */
    MOV fp, #0 /* 把C语言的FRAME置0 */

    /*下面的代码跳转到romStart()函数 */

    #if (CPU == ARM7TDMI_T)
    LDR r12, L$_rStrtInRom
    ORR r12, r12, #1
    BX r12
    #else
    LDR pc, L$_rStrtInRom /* 跳转到romStart()中执行 */
    #endif /* (CPU == ARM7TDMI_T) */

    .balign 4

    L$_HiPosn:
    .long ROM_TEXT_ADRS + HiPosn - _romInit
    /* 此时地址进行了重新的映射,所有需要进行重新定位,注意ROM_TEXT_ADRS的值需要与程序中的实际情况相一致 */

    L$_rStrtInRom:
    .long ROM_TEXT_ADRS + _romStart - _romInit
    /* 得到romStart重新映射后的地址 */


    L$_STACK_ADDR:
    .long STACK_ADRS

    L$_SndsIntmsk:
    .long SNDS_INTMASK

    L$_IopModReg:
    .long SNDS_IOPMOD

    L$_IopConReg:
    .long SNDS_IOPCON

    L$_IopDat:
    .long SNDS_IOPDATA

    L$_SndsRomcon0:
    .long SNDS_ROMCON0

    L$_SndsExtdbwth:
    .long SNDS_EXTDBWTH

    L$_SndsSyscfg:
    .long SNDS_SYSCFG

    L$_SysCfg:
    .long SYSCONFIG_VAL

    L$_SysCfgSdram:
    .long SYSCONFIG_VAL_SDRAM

    L$_SystemInitData:
    .long rEXTDBWTH /* DRAM1(Half), ROM5(Byte), ROM1(Half), else 32bit */
    .long rROMCON0 /* 0x0000000 ~ 0x40000, ROM0,256K,2cycle */
    .long rROMCON1
    .long rROMCON2
    .long rROMCON3
    .long rROMCON4
    .long rROMCON5
    .long rDRAMCON0 /* 0x1000000 ~ 0x13FFFFF, DRAM0 4M, */
    .long rDRAMCON1
    .long rDRAMCON2
    .long rDRAMCON3
    .long rREFEXTCON /* External I/O, Refresh */

    L$_SystemInitData_S:
    .long rEXTDBWTH /* DRAM1(Half), ROM5(Byte), ROM1(Half), else 32bit */
    .long rROMCON0_S /* 0x1000000 ~ 0x1040000, ROM0,256K,2cycle */
    .long rROMCON1
    .long rROMCON2
    .long rROMCON3
    .long rROMCON4
    .long rROMCON5
    .long rDRAMCON0_S /* 0x0000000 ~ 0x03FFFFF, DRAM0 */
    .long rDRAMCON1
    .long rDRAMCON2
    .long rDRAMCON3
    .long rREFEXTCON /* External I/O, Refresh */

    /*======================================================
    * SDRAM System Initialize Data (KS32C50100 only)
    *======================================================
    */
    L$_SystemInitDataSDRAM:
    .long rEXTDBWTH /* DRAM1(Half), ROM5(Byte), ROM1(Half), else 32bit */
    .long rROMCON0 /* 0x0000000 ~ 0x40000, ROM0,256K,2cycle */
    .long rROMCON1
    .long rROMCON2
    .long rROMCON3
    .long rROMCON4
    .long rROMCON5
    .long rSDRAMCON0 /* 0x1000000 ~ 0x13FFFFF, DRAM0 4M, */
    .long rSDRAMCON1
    .long rSDRAMCON2
    .long rSDRAMCON3
    .long rSREFEXTCON /* External I/O, Refresh */

    L$_SystemInitDataSDRAM_S:
    .long rEXTDBWTH /* DRAM1(Half), ROM5(Byte), ROM1(Half), else 32bit */
    .long rROMCON0_S /* 0x1000000 ~ 0x1040000, ROM0,256K,2cycle */
    .long rROMCON1
    .long rROMCON2
    .long rROMCON3
    .long rROMCON4
    .long rROMCON5
    .long rSDRAMCON0_S /* 0x0000000 ~ 0x03FFFFF, DRAM0 4M, */
    .long rSDRAMCON1
    .long rSDRAMCON2
    .long rSDRAMCON3
    .long rSREFEXTCON /* External I/O, Refresh */

    L$_pSystemInitData:
    .long L$_SystemInitData

    L$_pSystemInitData_S:
    .long L$_SystemInitData_S

    L$_pSystemInitDataSDRAM:
    .long L$_SystemInitDataSDRAM

    L$_pSystemInitDataSDRAM_S:
    .long L$_SystemInitDataSDRAM_S

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------


    作者:chenlei188 时间:2008-9-10 8:24:46

    恩,不错!~~

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------



查看完全版本:Tony嵌入式开发论坛
Copyright 2006-2008 Cevx.Com Cevx.Net 制作 版权所有
网友发帖仅代表个人观点,与本论坛立场无关