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

📄 sysalib.s

📁 ROM型的vxworksBSP包 编译测试通过
💻 S
字号:
/* sysALib.s - ARM Integrator system-dependent routines *//* Copyright 1999-2001 ARM Limited *//* Copyright 1999-2001 Wind River Systems, Inc. *//*modification history--------------------01h,09oct01,jpd  added clock speed setting for 946ES.01g,03oct01,jpd  tidied slightly.01f,28sep01,pr   added support for ARM946E.01g,04jun01,rec  memory clock rate changes for 740t01f,21feb01,h_k  added support for ARM966ES and ARM966ES_T.01e,23oct00,jpd  changed speeds on 920T; added conditional early		 enabling of instruction cache on 920T.01d,21feb00,jpd  added further initialisation code.01c,07feb00,jpd  added support for ARM720T and ARM920T.01b,13jan00,pr	 added support for ARM740T.01a,15nov99,ajb  copied from pid940t version 01h.*//*DESCRIPTIONThis module contains system-dependent routines written in assemblylanguage.  It contains the entry code, sysInit(), for VxWorks imagesthat start running from RAM, such as 'vxWorks'.  These images areloaded into memory by some external program (e.g., a boot ROM) and thenstarted.  The routine sysInit() must come first in the text segment.Its job is to perform the minimal setup needed to call the generic Croutine usrInit().sysInit() masks interrupts in the processor and the interruptcontroller and sets the initial stack pointer.  Other hardware anddevice initialisation is performed later in the sysHwInit routine insysLib.c.NOTEThe routines in this module don't use the "C" frame pointer %r11@ ! orestablish a stack frame.SEE ALSO:.I "ARM Architecture Reference Manual,".I "ARM 7TDMI Data Sheet,".I "ARM 720T Data Sheet,".I "ARM 740T Data Sheet,".I "ARM 920T Technical Reference Manual",.I "ARM 940T Technical Reference Manual",.I "ARM 946E-S Technical Reference Manual",.I "ARM 966E-S Technical Reference Manual",.I "ARM Reference Peripherals Specification,".I "ARM Integrator/AP User Guide",.I "ARM Integrator/CM7TDMI User Guide",.I "ARM Integrator/CM720T User Guide",.I "ARM Integrator/CM740T User Guide",.I "ARM Integrator/CM920T User Guide",.I "ARM Integrator/CM940T User Guide",.I "ARM Integrator/CM946E User Guide",.I "ARM Integrator/CM9x6ES Datasheet".*/#define _ASMLANGUAGE#include "vxWorks.h"#include "asm.h"#include "regs.h"#include "sysLib.h"#include "config.h"#include "s3c2410.h"#include "arch/arm/mmuArmLib.h"        .data        .globl   VAR(copyright_wind_river)        .long    VAR(copyright_wind_river)/* internals */	.globl	FUNC(sysInit)		/* start of system code */	.globl	FUNC(sysIntStackSplit)	/* routine to split interrupt stack *//* externals */	.extern	FUNC(usrInit)		/* system initialization routine */	.extern	FUNC(vxSvcIntStackBase) /* base of SVC-mode interrupt stack */	.extern	FUNC(vxSvcIntStackEnd)	/* end of SVC-mode interrupt stack */	.extern	FUNC(vxIrqIntStackBase) /* base of IRQ-mode interrupt stack */	.extern	FUNC(vxIrqIntStackEnd)	/* end of IRQ-mode interrupt stack */#if defined(CPU_720T) || defined(CPU_720T_T) || \    defined(CPU_740T) || defined(CPU_740T_T)/* variables */	.data	.balign	1			/* no alignment necessary */	/* variable used with a SWPB instruction to drain the write-buffer */sysCacheSwapVar:	.byte	0	.balign	4#endif /* defined(720T/720T_T740T/740T_T) */	.text	.balign 4/********************************************************************************* sysInit - start after boot** This routine is the system start-up entry point for VxWorks in RAM, the* first code executed after booting.  It disables interrupts, sets up* the stack, and jumps to the C routine usrInit() in usrConfig.c.** The initial stack is set to grow down from the address of sysInit().  This* stack is used only by usrInit() and is never used again.  Memory for the* stack must be accounted for when determining the system load address.** NOTE: This routine should not be called by the user.** RETURNS: N/A* sysInit ()              /@ THIS IS NOT A CALLABLE ROUTINE @/*/_ARM_FUNCTION(sysInit)	/* Setup MMU Control Register */	MOV	r1, #MMU_INIT_VALUE		/* Defined in mmuArmLib.h */	ORR	r1, r1, #MMUCR_I_ENABLE		/* enable Icache*/	MCR	CP_MMU, 0, r1, c1, c0, 0	/* Write to MMU CR */	MOV	r1, #0				/* data SBZ */	MCR	CP_MMU, 0, r1, c7, c10, 4	/* drain write-buffer */	MCR	CP_MMU, 0, r1, c7, c7, 0	/* R1 = 0 from above, data SBZ*/		/*	 * Set Process ID Register to zero, this effectively disables	 * the process ID remapping feature.	 */	MOV	r1, #0	MCR	CP_MMU, 0, r1, c13, c0, 0	        /* 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	        ldr   r0,=INTMSK        /*all interrupt disable(if  r1=0x00000000 all interrupt service)*/    	ldr   r1,=0xffffffff    	str   r1,[r0]	ldr   r0,=INTSUBMSK     /*all subinterrupt disable*/    	ldr   r1,=0x7ff            /*(only ten subinterrupt are valid in 2410 from low end*/    	str   r1,[r0]              /*so r1= 0x7ff)*/    	    	ldr   r0,=WTCON         /*disable watch dog*/    	ldr   r1,=0x0    	str   r1,[r0]    	    	/*turn on the led,and make it glitter*/    	ldr   r0,=GPBCON        /*config the I/O of port F*/    	ldr   r1,=0x55555555    	str   r1,[r0]		ldr   r0,=GPBUP	ldr   r1,=0xffffffff	ldr   r1,[r0]		ldr   r0,=0xffffffff	ldr   r1,=GPBDAT	str   r0,[r1]		ldr r0,=LOCKTIME        /* To reduce PLL lock time, adjust the LOCKTIME register.*/
        ldr r1,=0xffffff
        str r1,[r0]        	ldr   r0,=MPLLCON	/* config PLL */   	ldr   r1,=FCLKCFG	str   r1,[r0]   		ldr r0,=CLKDIVN         /* colck divider */ 
        ldr r1,=DIVCFG
        str r1,[r0]                  mrc CP_MMU,0,r0,c1,c0,0    /* clock mode */
        orr r0,r0,#R1_nF | R1_iA        mcr CP_MMU,0,r0,c1,c0,0             		/* set initial stack pointer so stack grows down from start of code */	ADR	sp, FUNC(sysInit)		/* initialise stack pointer */	/* now call usrInit */	MOV	fp, #0			/* initialise frame pointer */	MOV	r0, #BOOT_WARM_AUTOBOOT	/* pass startType */#if	(ARM_THUMB)	LDR	r12, L$_usrInit	BX	r12#else	B	FUNC(usrInit)#endif	/* (ARM_THUMB) *//********************************************************************************* sysIntStackSplit - split interrupt stack and set interrupt stack pointers** This routine is called, via a function pointer, during kernel* initialisation.  It splits the allocated interrupt stack into IRQ and* SVC-mode stacks and sets the processor's IRQ stack pointer. Note that* the pointer passed points to the bottom of the stack allocated i.e.* highest address+1.** IRQ stack needs 6 words per nested interrupt;* SVC-mode will need a good deal more for the C interrupt handlers.* For now, use ratio 1:7 with any excess allocated to the SVC-mode stack* at the lowest address.** Note that FIQ is not handled by VxWorks so no stack is allocated for it.** The stacks and the variables that describe them look like this.* .CS**         - HIGH MEMORY -*     ------------------------ <--- vxIrqIntStackBase (r0 on entry)*     |                      |*     |       IRQ-mode       |*     |    interrupt stack   |*     |                      |*     ------------------------ <--{ vxIrqIntStackEnd*     |                      |    { vxSvcIntStackBase*     |       SVC-mode       |*     |    interrupt stack   |*     |                      |*     ------------------------ <--- vxSvcIntStackEnd*         - LOW  MEMORY -* .CE** NOTE: This routine should not be called by the user.* void sysIntStackSplit*     (*     char *pBotStack   /@ pointer to bottom of interrupt stack @/*     long size		/@ size of stack @/*     )*/_ARM_FUNCTION_CALLED_FROM_C(sysIntStackSplit)	/*	 * r0 = base of space allocated for stacks (i.e. highest address)	 * r1 = size of space	 */	SUB	r2, r0, r1			/* r2->lowest usable address */	LDR	r3, L$_vxSvcIntStackEnd	STR	r2, [r3]			/*  == end of SVC-mode stack */	SUB	r2, r0, r1, ASR #3		/* leave 1/8 for IRQ */	LDR	r3, L$_vxSvcIntStackBase	STR	r2, [r3]	/* now allocate IRQ stack, setting irq_sp */	LDR	r3, L$_vxIrqIntStackEnd	STR	r2, [r3]	LDR	r3, L$_vxIrqIntStackBase	STR	r0, [r3]	MRS	r2, cpsr	BIC	r3, r2, #MASK_MODE	ORR	r3, r3, #MODE_IRQ32 | I_BIT	/* set irq_sp */	MSR	cpsr, r3	MOV	sp, r0	/* switch back to original mode and return */	MSR	cpsr, r2#if	(ARM_THUMB)	BX	lr#else	MOV	pc, lr#endif	/* (ARM_THUMB) */		/******************************************************************************//* * PC-relative-addressable pointers - LDR Rn,=sym is broken * note "_" after "$" to stop preprocessor preforming substitution */	.balign	4L$_vxSvcIntStackBase:	.long	VAR(vxSvcIntStackBase)L$_vxSvcIntStackEnd:	.long	VAR(vxSvcIntStackEnd)L$_vxIrqIntStackBase:	.long	VAR(vxIrqIntStackBase)L$_vxIrqIntStackEnd:	.long	VAR(vxIrqIntStackEnd)L$_INTMSK:	.long   INTMSK		/*int mask register*/L$_INTSUBMSK:	.long	INTSUBMSK	/*sub interrupt mask register*/#if	(ARM_THUMB)L$_usrInit:	.long	FUNC(usrInit)#endif	/* (ARM_THUMB) */#if defined(CPU_720T) || defined(CPU_720T_T) || \    defined(CPU_740T) || defined(CPU_740T_T)L$_sysCacheSwapVar:	.long   sysCacheSwapVar#endif#if defined(CPU_940T) || defined(CPU_940T_T)L$_sysCacheUncachedAdrs:	.long   SYS_CACHE_UNCACHED_ADRS#endif

⌨️ 快捷键说明

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