www.pudn.com > vXworksBSPfors3c44b0.rar > romInit.s


/* romInit.s - Samsung SBC ARM7 ROM initialization module */ 
 
 
/* Copyright 1984-2001 Wind River Systems, Inc. */ 
 
/* 
modification history 
-------------------- 
01o,05aug04,a_m  BSP定制 for 多刃剑开发板 
01f,18jan02,m_h  CLKCON initialization (74497), _sdata for vxWorks.res* 
01e,30nov01,m_h  additional label with "_" on entry point functions 
01d,15oct01,jb  Removing pre-pended underscores for new compilers (Diab/Gnu 
                 elf) 
01c,26apr01,m_h  fix thumb mode 
01b,26apr01,m_h  convert tabs to spaces for readability 
01a,12apr01,m_h  created from snds100 template. 
*/ 
 
/* 
DESCRIPTION 
This module contains the entry code for VxWorks images that start 
running from ROM, such as 'bootrom' and 'vxWorks_rom'.  The entry 
point, romInit(), is the first code executed on power-up.  It performs 
the minimal setup needed to call the generic C routine romStart() with 
parameter BOOT_COLD. 
 
romInit() masks interrupts in the processor and the interrupt 
controller and sets the initial stack pointer (to STACK_ADRS which is 
defined in configAll.h).  Other hardware and device initialisation is 
performed later in the sysHwInit routine in sysLib.c. 
 
The routine sysToMonitor() jumps to a location after the beginning of 
romInit, (defined by ROM_WARM_ADRS) to perform a "warm boot".  This 
entry point allows a parameter to be passed to romStart(). 
 
The routines in this module don't use the "C" frame pointer %r11@ ! or 
establish a stack frame. 
 
SEE ALSO: 
.I "ARM Architecture Reference Manual," 
.I "Samsung KS32C50100 Microcontroller User's Manual," 
.I "Samsung KS32C5000(A)/50100 Microcontroller Application Notes." 
*/ 
 
#define    _ASMLANGUAGE 
#include "vxWorks.h" 
#include "sysLib.h" 
#include "arch/arm/arm.h" 
#include "arch/arm/mmuArmLib.h" 
#include "config.h" 
#include "regs.h"     
 
    .data 
    .globl   FUNC(copyright_wind_river) 
    .long    FUNC(copyright_wind_river) 
 
/* internals */ 
 
    .globl    FUNC(romInit)    /* start of system code */ 
    .globl    FUNC(sdata)      /* start of data */ 
    .globl    _sdata 
 
/* externals */ 
 
    .globl    FUNC(romStart)    /* system initialization routine */ 
 
_sdata: 
FUNC_LABEL(sdata) 
    .asciz    "start of data" 
    .balign    4 
 
    .text 
    .balign 4 
 
/******************************************************************************* 
* 
* romInit - entry point for VxWorks in ROM 
* 
 
* romInit 
*     ( 
*     int startType    /@ only used by 2nd entry point @/ 
*     ) 
 
* INTERNAL 
* sysToMonitor examines the ROM for the first instruction and the string 
* "Copy" in the third word so if this changes, sysToMonitor must be updated. 
*/ 
 
_ARM_FUNCTION(romInit) 
_romInit: 
/*  : 在Flash存储器的开始处添加硬件中断入口,VxWorks只提供5个异常入口 */ 
    B       cold 
    B       _romUndef 
    B       _romSwi 
    B       _romPrefetch 
    B       _romDataAbort 
    B       cold		/* _romReserved */ 
    B       _romIRQ 
    B       cold		/* _romFIQ */ 
     
cold: 
    MOV    r0, #BOOT_COLD    /* fall through to warm boot entry */ 
warm: 
    B    start 
 
    /* copyright notice appears at beginning of ROM (in TEXT segment) */ 
    .ascii   "Copyright 1984-2001 Wind River Systems, Inc." 
    .balign 4 
 
start: 
/*  : 设置CPU核心寄存器 */ 
    LDR    r2, L$_S3C44B0XWtcon		/*watch dog disable*/ 
    MOV    r1, #0  
    STR    r1, [r2] 
     
    LDR    r2, L$_SBCARM7Intmsk		/*all interrupt disable*/ 
    MOV    r1, #0x07ffffff 
    STR    r1, [r2] 
     
    LDR    r2, L$_SBCARM7Locktime	/*set clock control registers*/ 
    LDR    r1, L$_LockTime 
    STR    r1, [r2] 
	 
    LDR    r2, L$_SBCARM7Pllcon		/*temporary setting of PLL*/ 
    LDR    r1, L$_PllCon 
    STR    r1, [r2] 
 
    LDR    r2, L$_SBCARM7ClkCon		/*all unit block CLK enable*/ 
    LDR    r1, L$_ClkCon 
    STR    r1, [r2] 
/*  : 设置结束 */ 
       
    MOV    r13, r0    /* Save starttype in r13 so that r0 can be used for other purposes */ 
 
    /* 
     * If not BOOT_COLD, bypass memory configuration, memory region 
     * switching etc. 
     */ 
    CMP    r0, #BOOT_COLD 
    BNE    HiPosn 
SYNC_DRAM: 
 
    LDR    r0, L$_SBCARM7Syscfg 
    LDR    r1, L$_SysCfgSdram 
    STR    r1, [r0]             /* Cache,WB disable */ 
 
/* ROM and RAM Configuration(Multiple Load and Store).  Multiple load 
 * LDMIA instruction cannot be used as there is no way to load the 
 * address L$_SystemInitDataSDRAM into a register (LDR Rn,=sym is broken) 
 */ 
 
    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$_SBCARM7Extdbwth         /* Extdbwth Offset : 0x3010 */ 
    STMIA  r0, {r1-r12} 
 
    /*  : r13存储启动类型,不能使用 */ 
    LDR    r0, L$_SBCARM7Mrsrb7 
    LDR    r1, L$_SystemInitDataSDRAM +0x30 
    STR    r1, [r0] 
	 
/*============================================================= 
 * Copy to DRAM the section of ROM in which we are currently executing. 
 * Soon, we will set the base pointer of DRAM to where the base pointer of 
 * ROM used to be.  At that point the PC will suddenly be set in RAM and 
 * must have legitimate code to execute. 
 *============================================================= 
 */ 
 
    MOV    r0, #RESET_ROM_START         /* Get pointer to ROM data */ 
    LDR    r1, L$_RomCopySize           /* number of ROM bytes to copy into RAM */ 
    MOV    r2, #RESET_DRAM_START        /* Copy DRAM area base */ 
 
ROM2SDRAM_COPY_LOOP: 
    LDR    r3, [r0], #4 
    STR    r3, [r2], #4 
    SUBS   r1, r1, #4         /* Down Count */ 
    BNE    ROM2SDRAM_COPY_LOOP 
    LDR    PC, L$_HiPosn     
 
HiPosn: 
 
 
    /* 
     * Initialize the stack pointer to just before where the 
     * uncompress code, copied from ROM to RAM, will run. 
     */ 
 
    MOV    r0, r13        /* restore starttype to r0 from r13 */ 
    LDR    sp, L$_STACK_ADDR 
    MOV    fp, #0            /* zero frame pointer */ 
 
    /* jump to C entry point in ROM: routine - entry point + ROM base */ 
 
#if    (CPU == ARMARCH4_T) 
    LDR    r12, L$_rStrtInRom 
    ORR    r12, r12, #1        /* force Thumb state */ 
    BX     r12 
#else 
    LDR    pc, L$_rStrtInRom 
#endif    /* (CPU == ARMARCH4_T) */ 
 
/*  : 中断处理函数 */ 
_ARM_FUNCTION(romUndef) 
_romUndef: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promUndef 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc} 
 
_ARM_FUNCTION(romSwi) 
_romSwi: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promSwi 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc} 
 
_ARM_FUNCTION(romPrefetch) 
_romPrefetch: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promPrefetch 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc}   
 
_ARM_FUNCTION(romDataAbort) 
_romDataAbort: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promDataAbort 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc} 
  
_ARM_FUNCTION(romReserved) 
_romReserved: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promReserved 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc}  
 
_ARM_FUNCTION(romIRQ) 
_romIRQ: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promIRQ 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc}  
 
_ARM_FUNCTION(romFIQ) 
_romFIQ: 
 sub sp, sp, #4 
 stmfd sp!, {r0} 
 ldr r0, L$_promFIQ 
 ldr r0, [r0]             
 str r0, [sp, #4] 
 ldmfd sp!, {r0, pc}  
    
/******************************************************************************/ 
 
/* 
 * PC-relative-addressable pointers - LDR Rn,=sym is broken 
 * note "_" after "$" to stop preprocessor preforming substitution 
 */ 
 
    .balign    4 
 
/*  : SDT调试,程序直接位于RAM中 */ 
#ifdef RAM_SIM 
L$_HiPosn: 
    .long    RAM_HIGH_ADRS + HiPosn - FUNC(romInit) 
L$_rStrtInRom: 
    .long    RAM_HIGH_ADRS + FUNC(romStart) - FUNC(romInit) 
#else 
L$_HiPosn: 
    .long    ROM_TEXT_ADRS + HiPosn - FUNC(romInit) 
 
L$_rStrtInRom: 
    .long    ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit) 
#endif 
 
L$_STACK_ADDR: 
    .long    STACK_ADRS 
 
L$_SBCARM7Intmsk: 
    .long    S3C44B0X_INTMASK 
 
/*  : added */ 
L$_SBCARM7Pllcon: 
    .long    S3C44B0X_PLLCON     
L$_SBCARM7Locktime: 
    .long    S3C44B0X_LOCKTIME     
L$_S3C44B0XWtcon: 
    .long    S3C44B0X_WTCON 
     
/*  : deleted */ 
/*L$_IopModReg: 
    .long    SNGKS32C_IOPMOD*/ 
/*  : deleted */ 
/*L$_IopConReg: 
    .long    SNGKS32C_IOPCON*/ 
/*  : deleted */ 
/*L$_IopDat: 
    .long    SNGKS32C_IOPDATA*/ 
 
L$_SBCARM7Romcon0: 
    .long    S3C44B0X_BANKCON0	/*  : SNGKS32C_ROMCON0->S3C44B0X_BANKCON0 */ 
 
L$_SBCARM7Extdbwth: 
    .long    S3C44B0X_BWSCON	/*  : SNGKS32C_EXTDBWTH->S3C44B0X_BWSCON */ 
 
L$_SBCARM7Mrsrb7:               /*  : added */ 
    .long    S3C44B0X_MRSRB7 
 
L$_SBCARM7Syscfg: 
    .long    S3C44B0X_SYSCFG 
/*  : deleted */ 
/*L$_SysCfg: 
    .long    SYSCONFIG_VAL*/ 
 
L$_SysCfgSdram: 
    .long    SYSCONFIG_VAL_SDRAM 
 
L$_SBCARM7ClkCon: 
    .long    S3C44B0X_CLKCON 
 
L$_ClkCon: 
    .long    rCLKCON 
 
/*  : added */     
L$_PllCon: 
    .long    rPLLCON 
L$_LockTime: 
    .long    rLOCKTIME 
 
/*  : deleted */      
/*L$_SBCARM7ExtACon: 
    .long    SNGKS32C_EXTACON0 
    .long    SNGKS32C_EXTACON1*/ 
/*  : deleted */ 
/*L$_ExtACon: 
    .long    rEXTACON0 
    .long    rEXTACON1*/ 
/*====================================================== 
 * 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 
 
    /*  : added */     
    .long    rSREFEXTCON 
    .long    rBANKSIZE 
    .long    rMRSRB6 
    .long    rMRSRB7 
         
 
L$_pSystemInitDataSDRAM: 
    .long    L$_SystemInitDataSDRAM 
 
 
/*  : RAM中断入口 */ 
L$_promUndef: 
    .long     S3C_EXC_BASE 
L$_promSwi: 
    .long     S3C_EXC_BASE + 4 
L$_promPrefetch: 
    .long     S3C_EXC_BASE + 8 
L$_promDataAbort: 
    .long     S3C_EXC_BASE + 12 
L$_promReserved: 
    .long     S3C_EXC_BASE + 16 
L$_promIRQ: 
    .long     S3C_EXC_BASE + 20 
L$_promFIQ: 
    .long     S3C_EXC_BASE + 24 
/*  : 在L$_RomCopySize之前,保证计算正确 */ 
     
L$_RomCopySize: 
    .long    L$_RomCopySize - FUNC(romInit)