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

📄 rominit.s

📁 kedin bsp for vxWorks
💻 S
字号:
/* romInit.s - KS8695P demo board ROM initialization module *//* Copyright 1999-2001 Wind River Systems, Inc. *//*modification history--------------------9/22/2003  Ritter Yeh  created *//*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.*/#define	_ASMLANGUAGE#include "vxWorks.h"#include "sysLib.h"#include "asm.h"#include "regs.h"	#include "config.h"#include "arch/arm/mmuArmLib.h"        .data        .globl   VAR(copyright_wind_river)        .long    VAR(copyright_wind_river)/* internals */	.globl	FUNC(romInit)		/* start of system code */	.globl	VAR(sdata)		/* start of data */        .globl  _sdata	.globl	VAR(integratorMemSize)	/* actual memory size *//* externals */	.extern	FUNC(romStart)	/* system initialization routine */_sdata:VAR_LABEL(sdata)	.asciz	"start of data"	.balign	4/* variables */	.dataVAR_LABEL(integratorMemSize)	.long	0	.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: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 2003 Micrel, Inc."	.ascii   "\nCopyright 1999-2001 Wind River Systems, Inc."	.balign 4start:	/*	 * Set processor and MMU to known state as follows (we may have not	 * been entered from a reset). We must do this before setting the CPU	 * mode as we must set PROG32/DATA32.	 *	 * MMU Control Register layout.	 *	 * bit	 *  0 M 0 MMU disabled	 *  1 A 0 Address alignment fault disabled, initially	 *  2 C 0 Data cache disabled	 *  3 W 0 Write Buffer disabled	 *  4 P 1 PROG32	 *  5 D 1 DATA32	 *  6 L 1 Should Be One (Late abort on earlier CPUs)	 *  7 B 0 Endianness (1 => little)	 *  8 S 0 System bit to zero } Modifies MMU protections, not really	 *  9 R 1 ROM bit to one     } relevant until MMU switched on later.	 * 10 F 0 Should Be Zero	 * 11 Z 0 Should Be Zero (Branch prediction control on 810)	 * 12 I 0 Instruction cache control	 */	/* Setup MMU Control Register */	MOV	r1, #MMU_INIT_VALUE		/* Defined in mmuArmLib.h */	MCR	CP_MMU, 0, r1, c1, c0, 0	/* Write to MMU CR */	/*	 * If MMU was on before this, then we'd better hope it was set	 * up for flat translation or there will be problems. The next	 * 2/3 instructions will be fetched "translated" (number depends	 * on CPU).	 *	 * We would like to discard the contents of the Write-Buffer	 * altogether, but there is no facility to do this. Failing that,	 * we do not want any pending writes to happen at a later stage,	 * so drain the Write-Buffer, i.e. force any pending writes to	 * happen now.	 */	MOV	r1, #0				/* data SBZ */	MCR	CP_MMU, 0, r1, c7, c10, 4	/* drain write-buffer */	/* Flush (invalidate) both I and D caches */	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 */        LDR  r4, =REG_IO_BASE      /* load register base address */   	LDR  r5, =REG_INT_ENABLE          	ADD  r5, r5, r4            	LDR  r8, =INIT_INT                STR  r8, [r5] 	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_SVC32 | I_BIT | F_BIT	MSR	cpsr, r1/* --- Initialise stack pointer registers, no memory can be accessed at  this time. */        /* Enter ABT mode and set up the ABT stack pointer */	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_ABT | I_BIT | F_BIT	MSR	cpsr, r1        LDR     SP, =ABT_STACK        /* Enter UNDEF mode and set up the UNDEF stack pointer */	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_UNDEF | I_BIT | F_BIT        LDR     SP, =UNDEF_STACK        /* Enter FIQ mode and set up the FIQ stack pointer */	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_FIQ | I_BIT | F_BIT        LDR     SP, =FIQ_STACK        /* Enter IRQ mode and set up the IRQ stack pointer */	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_IRQ | I_BIT | F_BIT        LDR     SP, =IRQ_STACK        /* Enter SVC mode and set up the SVC stack pointer */ 	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_SVC | I_BIT | F_BIT        LDR     SP, =SVC_STACK        /* Enter SYS mode and set up the SYS stack pointer for temperary use */	MRS	r1, cpsr	BIC	r1, r1, #MASK_MODE	ORR	r1, r1, #MODE_SYS | I_BIT | F_BIT        LDR     SP, =RAM_LIMIT_TMP                LDR  r4, =REG_IO_BASE      /* load register base address */         LDR  r5, =REG_SDRAM_CTRL0      /* set up SDRAM bank 0 */	ADD  r5, r5, r4	LDR  r8, =TMP_SDRAM_REG0                         	STR  r8, [r5]  	  	LDR  r5, =REG_SDRAM_CTRL1      /* set up SDRAM bank 1 */	ADD  r5, r5, r4	LDR  r8, =TMP_SDRAM_REG1            	STR  r8, [r5]                       /* set up SDRAM control */	LDR  r5, =REG_SDRAM_GENERAL        	ADD  r5, r5, r4	LDR  r8, =SDRAM_RASCAS	STR  r8, [r5]               /* set up SDRAM buffer control */        LDR  r5, =REG_SDRAM_BUFFER                ADD  r5, r5, r4        LDR  r8, =SDRAM_NOP_COMD   /* send NOP command */                             STR  r8, [r5]        LDR  r7, =SDRAM_NOP_COMDsr01:	        LDR   r8, [r5]        ANDS  r8, r8, r7        BNE   sr01        NOP        LDR  r8, =SDRAM_PRECHARGE_CMD /* send precharge command */        STR  r8, [r5]sr02:	LDR   r8, [r5]        LDR   r7, =SDRAM_NOP_COMD        ANDS  r8, r8, r7        BNE   sr02        NOP        /* set up SDRAM refresh timer */        LDR  r5, =REG_SDRAM_REFRESH        ADD  r5, r5, r4          MOV  r8, #20       /* quick refresh at least twice */                         STR  r8, [r5]      /* before sending Mode command */        /* wait for two refresh to complete */    	MOV   r8, #10sr05:		SUBS  r8, r8, #1	BNE   sr05   	NOP               LDR  r8, =SDRAM_REFRESH_TIMER  /* set back normal refresh timer */                         STR  r8, [r5]       	LDR  r5, =REG_SDRAM_BUFFER        	ADD  r5, r5, r4	LDR  r8, =SDRAM_MODE_COMD      /* send Mode command */                     	STR  r8, [r5]       sr03:	LDR   r8, [r5]        ANDS  r8, r8, r7        BNE   sr03        NOP/*========================================================; Here is memory remapping code,; First copy two instuctions to SDRAM and jump to the ; first, the second intruction will jump the pc back to; remapped flash.;======================================================== */  	LDR  r5, =REG_MEM_CTRL0          	ADD  r5, r5, r4                  /* remapp rom bank 0 start at 0x02800000 */	LDR  r8, =REM_FLASH_REG                  STMFD r13!, {r3-r6}        ADR   r3, map_instruc	LDR   r4, =SDRAM_START	LDMIA r3, {r5-r6}	STMIA r4, {r5-r6}	LDMFD r13!, {r3-r6}	ADR   r10, jump_to_here 	LDR   r1, =FLASH_ROM_START	ADD   r10, r10, r1	LDR   pc, =SDRAM_STARTmap_instruc:        STR  r8, [r5]    	MOV  pc, r10HiPosn:jump_to_here:	        LDR  r5, =REG_SDRAM_BUFFER                ADD  r5, r5, r4        LDR  r8, =SDRAM_PRECHARGE_CMD     /* send precharge command */        STR  r8, [r5]j107:	LDR   r8, [r5]        LDR   r7, =SDRAM_NOP_COMD        ANDS  r8, r8, r7        BNE   j107            NOP   	LDR  r5, =REG_SDRAM_CTRL0          /* set up SDRAM bank 0 */	ADD  r5, r5, r4	LDR  r8, =REM_SDRAM_REG0                         	STR  r8, [r5]  	LDR  r5, =REG_SDRAM_CTRL1          /* set up SDRAM bank 1 */	ADD  r5, r5, r4	LDR  r8, =REM_SDRAM_REG1                    STR  r8, [r5]                 /* enable all the ext i/o flash and rom banks */	LDR  r5, =REG_MEM_GENERAL        	ADD  r5, r5, r4	LDR  r8, =ROM_GENERAL_SETTING              	STR  r8, [r5]               /* change system clock here if you need more speed. */	LDR  r5, =REG_SYSTEN_BUS_CLOCK	ADD  r5, r5, r4	LDR  r8, =SYSTEN_BUS_CLOCK_125        STR  r8, [r5]                   LDR  r5, =REG_GPIO_DATA        ADD  r5, r5, r4        LDR  r1, =INIT_GPIO_DATA        STR  r1, [r5]         LDR  r5, =REG_GPIO_CTRL        ADD  r5, r5, r4        LDR  r1, =INIT_GPIO_CTRL        STR  r1, [r5] 	         /* set the MODE register last to */	LDR  r5, =REG_GPIO_MODE 	ADD  r5, r5, r4        LDR  r1, =INIT_GPIO_MODE        STR  r1, [r5]        /* enable FIFO write and read */	LDR  r5, =REG_SDRAM_BUFFER        	ADD  r5, r5, r4        LDR  r8, =0x1F00000   /* enable FIFOs */                             STR  r8, [r5]       	/* 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           		/* r1 now contains memory size: store this in Memory_Size variable */        LDR     r1, =SDRAM_TOTAL_SIZE	LDR	r3, L$_memSize	STR	r1, [r3]	MOV	r3, r1		/* Need to return size in both these registers*/	/*	 * Initialize the stack pointer to just before where the	 * uncompress code, copied from ROM to RAM, will run.	 */	LDR	sp, L$_STACK_ADDR	MOV	fp, #0			/* zero frame pointer */        LDR  r5, =REG_GPIO_DATA        ADD  r5, r5, r4        LDR  r1, =0x00008000        STR  r1, [r5] 	/* jump to C entry point in ROM: routine - entry point + ROM base */	LDR	pc, L$_rStrtInRom/******************************************************************************//* * PC-relative-addressable pointers - LDR Rn,=sym is broken * note "_" after "$" to stop preprocessor performing substitution */	.balign	4L$_HiPosn:	.long	ROM_TEXT_ADRS + HiPosn - FUNC(romInit)L$_rStrtInRom:	.long	ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit)L$_STACK_ADDR:	.long	STACK_ADRSL$_memSize:	.long	VAR(integratorMemSize)

⌨️ 快捷键说明

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