⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rominit.s

📁 44b0 vxwork5.5 bsp 支持基于flash 39VF3201的tffs驱动
💻 S
字号:
/************************************************ * modify 	: hugang hgxxx@51eda.com			* * data		: 2004-05-07						* ************************************************//* romInit.s - Samsung SBC ARM7 ROM initialization module *//* Copyright 1984-2001 Wind River Systems, Inc. *//*modification history--------------------01f,18jan02,m_h  CLKCON initialization (74497), _sdata for vxWorks.res*01e,30nov01,m_h  additional label with "_" on entry point functions01d,15oct01,jb  Removing pre-pended underscores for new compilers (Diab/Gnu                 elf)01c,26apr01,m_h  fix thumb mode01b,26apr01,m_h  convert tabs to spaces for readability01a,12apr01,m_h  created from snds100 template.*//*DESCRIPTIONThis module contains the entry code for VxWorks images that startrunning from ROM, such as 'bootrom' and 'vxWorks_rom'.  The entrypoint, romInit(), is the first code executed on power-up.  It performsthe minimal setup needed to call the generic C routine romStart() withparameter BOOT_COLD.romInit() masks interrupts in the processor and the interruptcontroller and sets the initial stack pointer (to STACK_ADRS which isdefined in configAll.h).  Other hardware and device initialisation isperformed later in the sysHwInit routine in sysLib.c.The routine sysToMonitor() jumps to a location after the beginning ofromInit, (defined by ROM_WARM_ADRS) to perform a "warm boot".  Thisentry point allows a parameter to be passed to romStart().The routines in this module don't use the "C" frame pointer %r11@ ! orestablish 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"    	.macro   LED, x                               ldr     r7,=S3C44B0X_PDATE                mov     r8, #(0xf0 & ((~(\x))<<4))		    str     r8, [r7]                                	.endm	    .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:    B       cold    B       _romUndef    B       _romSwi    B       _romPrefetch    B       _romDataAbort    B       _romReserved         /* _romReserved */    B       _romIRQ    B       _romFIQ              /* _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 4start:    /*watch dog disable*/    LDR    r2, L$_S3C44B0XWtcon    MOV    r1, #0     STR    r1, [r2]        /*all interrupt disable*/    LDR    r2, L$_SBCARM7Intmsk    MOV    r1, #0x07ffffff    STR    r1, [r2]        /*Set clock control registers*/    /*LDR    r0, L$_SBCARM7Locktime    MOV    r1, #0xfff    STR    r1, [r0]*/    LDR    r2, L$_SBCARM7Locktime    LDR    r1, L$_LockTime    STR    r1, [r2]       	/*temporary setting of PLL*/    LDR    r2, L$_SBCARM7Pllcon    LDR    r1, L$_PllCon    STR    r1, [r2]	/*All unit block CLK enable*/    LDR    r2, L$_SBCARM7ClkCon    LDR    r1, L$_ClkCon    STR    r1, [r2]    LDR    r2, L$_SBCARM7SysCfg    MOV    r1, #0x08    STR    r1, [r2]   	ldr     r1,=S3C44B0X_PCONE                                      	ldr     r2,=0x556b /* set led display to output */                str     r2,[r1]                                                     ldr     r1,=S3C44B0X_PUPE                                          ldr     r2,=0x6                                                     str     r2,[r1]                                                    ldr     r1,=S3C44B0X_PDATE                                        ldr     r2,=0x357                                                  str     r2,[r1]                                                    		                                                       #if 1        /* disable interrupts in CPU and switch to SVC32 mode */    MRS    r1, cpsr    BIC    r1, r1, #MASK_MODE    ORR    r1, r1, #MODE_SVC32 | I_BIT | F_BIT    MSR    cpsr, r1#endif    MOV    r14, r0    /* Save starttype in r13 so that r0 can be used for other purposes */#if 1    /*     * CPU INTERRUPTS DISABLED     *     * disable individual interrupts in the interrupt controller     */    LDR    r2, L$_SBCARM7Intmsk        /* R2->interrupt controller */    MVN    r1, #0                /* &FFFFFFFF */    STR    r1, [r2]            /* disable all interrupt sources */#endif            /*     * If not BOOT_COLD, bypass memory configuration, memory region     * switching etc.     */    CMP    r0, #BOOT_COLD    BNE    HiPosn    #if 0    LDR    r0, L$_SBCARM7Syscfg    LDR    r1, L$_SysCfgSdram    STR    r1, [r0]             /* Cache,WB disable */#endif/* 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    r13,L$_SystemInitDataSDRAM + 0x30    LDR    r0, L$_SBCARM7Extdbwth    STMIA  r0, {r1-r13}	/*============================================================= * 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. *============================================================= */#if 0    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#endif	/*    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, r14        /* 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:#if 1 sub sp, sp, #4 stmfd sp!, {r0} ldr r0, L$_promIRQ ldr r0, [r0]             str r0, [sp, #4] ldmfd sp!, {r0, pc} #else sub sp, sp, #4 stmfd sp!, {r0} ldr r0, L$_promIRQ    /*L$_promIRQ     */ ldr r0, [r0] str r0, [sp, #4]    stmfd  sp!, {r1}    ldr r1 ,=0x0c300020     /* 0020-0080 for irq */    str r0, [r1]            /* irq handler ==intEnt */    str r14, [r1,#0x4]                   mrs r0, cpsr    str r0, [r1,#0x8]    mrs r0, spsr    str r0, [r1,#0xc]    str sp, [r1,#0x10]    str r12, [r1,#0x14]          ldr r0, [r1,#0x18]    stmfd sp!, {r2,r3}    ldr r2, =S3C44B0X_INTPEND    ldr r2, [r2]    ldr r3, =0x0c400000    adds r3, r3,r0,LSL #2    str r2, [r3]    ldmfd sp!, {r2,r3}        add r0, r0,#0x1    str r0, [r1,#0x18]    #if 0    cmp r0, #0x1 /* first int */    bne byebye    str r14, [r1,#0x1c]        str r0, [r1, #0x20]        mrs r0, cpsr str r0, [r1,#0x24]  mrs r0, spsr str r0, [r1,#0x28]  str sp, [r1,#0x2c] str pc, [r1,#0x30]    ldr r0, L$_promIRQ    /*L$_promIRQ     */ ldr r0, [r0] str r0, [r1, #0x34]    byebye:    #endif        ldmfd sp!, {r1}  ldr r0, =0x0c30003c str pc,  [r0]  ldmfd sp!, {r0, pc}#endif_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#ifdef SIML$_HiPosn:    .long    RAM_HIGH_ADRS + HiPosn - FUNC(romInit)#elseL$_HiPosn:    .long    ROM_TEXT_ADRS + HiPosn - FUNC(romInit)#endif#ifdef SIML$_rStrtInRom:    .long    RAM_HIGH_ADRS + FUNC(romStart) - FUNC(romInit)#elseL$_rStrtInRom:        .long    ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit)#endif/* error */L$_STACK_ADDR:    .long    STACK_ADRSL$_SBCARM7Intmsk:    .long    S3C44B0X_INTMASKL$_SBCARM7Pllcon:    .long    S3C44B0X_PLLCON    L$_SBCARM7Locktime:    .long    S3C44B0X_LOCKTIME    L$_S3C44B0XWtcon:    .long    S3C44B0X_WATCHDOGL$_SBCARM7Romcon0:    .long    S3C44B0X_BANKCON0L$_SBCARM7Extdbwth:    .long    S3C44B0X_BWSCONL$_SBCARM7Syscfg:    .long    S3C44B0X_SYSCFGL$_SysCfgSdram:    .long    SYSCONFIG_VAL_SDRAML$_SBCARM7ClkCon:    .long    S3C44B0X_CLKCONL$_SBCARM7SysCfg:    .long    S3C44B0X_SYSCFG    L$_ClkCon:    .long    rCLKCONL$_PllCon:    .long    rPLLCON    L$_LockTime:    .long    rLOCKTIME/*====================================================== * SDRAM System Initialize Data (KS32C50100 only) *====================================================== */ L$_SystemInitDataSDRAM:    .long    rEXTDBWTH	    .long    rROMCON0	    .long    rROMCON1	    .long    rROMCON2        .long    rROMCON3        .long    rROMCON4	    .long    rROMCON5	    .long    rSDRAMCON0	    .long    rSDRAMCON1	    .long    rREFEXTCON	    .long    rBANKSIZE	    .long    rMRSRB6		    .long    rMRSRB7		        L$_pSystemInitDataSDRAM:    .long    L$_SystemInitDataSDRAML$_promUndef:    .long     S3C_EXC_BASEL$_promSwi:    .long     S3C_EXC_BASE + 4L$_promPrefetch:    .long     S3C_EXC_BASE + 8L$_promDataAbort:    .long     S3C_EXC_BASE + 12L$_promReserved:    .long     S3C_EXC_BASE + 16L$_promIRQ:    .long     S3C_EXC_BASE + 20L$_promFIQ:    .long     S3C_EXC_BASE + 24    L$_RomCopySize:    .long    L$_RomCopySize - FUNC(romInit)    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -