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

📄 bootinit.c

📁 S3C2410开发板的VXWORKS开发包
💻 C
字号:
/* bootInit.c - ROM initialization module *//* Copyright 2004-2005  */#include "copyright_wrs.h"#include "vxWorks.h"#include "sysLib.h"#include "config.h"#include "errno.h"#include "sioLib.h"#define	UNCMP_RTN	inflate#ifndef USER_RESERVED_MEM#   define USER_RESERVED_MEM 0#endif#define	SYS_MEM_TOP \	(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE - USER_RESERVED_MEM)#define SYS_MEM_BOTTOM \	(LOCAL_MEM_LOCAL_ADRS + RESERVED)#define BINARRAYEND_ROUNDOFF	(ROUND_DOWN(binArrayEnd, sizeof(long))) #define WR_LONG_SDRAM(addr , data) *((volatile unsigned long *)(addr))=(unsigned long)data#define WR_SHORT_SDRAM(addr , data) *((volatile unsigned short *)(addr))=(unsigned short)data#define WR_CHAR_SDRAM(addr , data) *((volatile unsigned char *)(addr))=(unsigned char)data#define RD_LONG_SDRAM(addr) (*((volatile unsigned long *)(addr)))#define RD_SHORT_SDRAM(addr) (*((volatile unsigned short *)(addr)))#define RD_CHAR_SDRAM(addr) (*((volatile unsigned char *)(addr)))IMPORT void	romInit ();IMPORT STATUS	UNCMP_RTN ();IMPORT void	usrInit ();IMPORT void	sysInitAlt ();IMPORT void	start ();/**/IMPORT UCHAR	binArrayStart [];	IMPORT UCHAR	binArrayEnd [];		IMPORT char	etext [];		IMPORT char	end [];			IMPORT UCHAR	wrs_kernel_data_start [];  IMPORT UCHAR	wrs_kernel_data_end [];   #if	((CPU_FAMILY == MIPS) || (CPU_FAMILY==PPC) || \	 (CPU_FAMILY==COLDFIRE))#define	RESIDENT_DATA	RAM_DST_ADRS#else#define	RESIDENT_DATA 	wrs_kernel_data_start	#endif#ifndef RAM_DST_ADRS                #define RAM_DST_ADRS        RAM_HIGH_ADRS#endif#ifdef	BOOTCODE_IN_RAM			#undef	ROM_TEXT_ADRS#undef	ROM_BASE_ADRS#define	ROM_TEXT_ADRS	((UINT)romInit)#define	ROM_BASE_ADRS	((UINT)romInit)#endif	/* BOOTCODE_IN_RAM */#ifndef ROM_COPY_SIZE#define	ROM_COPY_SIZE	(ROM_SIZE - (ROM_TEXT_ADRS - ROM_BASE_ADRS))#endif#define ROM_OFFSET(adr)	(((UINT)adr - (UINT)romInit) + ROM_TEXT_ADRS)LOCAL void copyLongs (FAST UINT *source, FAST UINT *destination, UINT nlongs);#ifndef	BOOTCODE_IN_RAMLOCAL void fillLongs (FAST UINT *buf, UINT nlongs, FAST UINT val);#endif	/* BOOTCODE_IN_RAM */#if (CPU==XSCALE)int checkLongs (FAST UINT *source, FAST UINT *destination, UINT nlongs);#endifvoid romStart    (    FAST int startType		    )    {    	#if ((CPU_FAMILY==SPARC) || (CPU_FAMILY==MIPS) || (CPU_FAMILY==I80X86) || \     (CPU_FAMILY==PPC) || (CPU_FAMILY==ARM))    volatile			#endif     FUNCPTR absEntry;		#if (CPU_FAMILY==ARM) && (!defined(ROM_RESIDENT)) && !defined(BOOTCODE_IN_RAM)    VOIDFUNCPTR ramfillLongs = fillLongs;     #define fillLongs(a,b,c) ramfillLongs(a,b,c)#endif #if (CPU_FAMILY==MC680X0) && !defined(ROM_RESIDENT) && !defined(BOOTCODE_IN_RAM)    volatile VOIDFUNCPTR romcopyLongs = &copyLongs; #define copyLongs romcopyLongs#endif #ifdef ROM_RESIDENT         #if  (CPU_FAMILY == SPARC)    copyLongs ((UINT *)(etext + 8), (UINT *) RESIDENT_DATA,#else    copyLongs ((UINT *)etext, (UINT *) RESIDENT_DATA,#endif        ((UINT) wrs_kernel_data_end - (UINT) RESIDENT_DATA) / sizeof (long));#else	/* ROM_RESIDENT */	#ifdef UNCOMPRESS		#if	(CPU_FAMILY == MIPS)    ((FUNCPTR)ROM_OFFSET(copyLongs)) (ROM_TEXT_ADRS, (UINT)K0_TO_K1(romInit),		ROM_COPY_SIZE / sizeof (long));#else	/* CPU_FAMILY == MIPS */	#ifndef RAM_SIM 	    ((FUNCPTR)ROM_OFFSET(copyLongs)) (ROM_TEXT_ADRS, (UINT)romInit,		ROM_COPY_SIZE / sizeof (long));			#endif	#endif	#else	#if	(CPU_FAMILY == MIPS)    ((FUNCPTR)ROM_OFFSET(copyLongs)) (ROM_TEXT_ADRS, (UINT)K0_TO_K1(romInit),		((UINT)wrs_kernel_data_end - (UINT)romInit) / sizeof (long));#else	/* CPU_FAMILY == MIPS */    ((FUNCPTR)ROM_OFFSET(copyLongs)) (ROM_TEXT_ADRS, (UINT)romInit,		((UINT)binArrayStart - (UINT)romInit)/ sizeof (long));    ((FUNCPTR)ROM_OFFSET(copyLongs))            ((UINT *)((UINT)ROM_TEXT_ADRS + ((UINT)BINARRAYEND_ROUNDOFF -            (UINT)romInit)), (UINT *)BINARRAYEND_ROUNDOFF,            ((UINT)wrs_kernel_data_end - (UINT)binArrayEnd) / sizeof (long));#if (CPU==XSCALE)    ((FUNCPTR)ROM_OFFSET(checkLongs))                 (ROM_TEXT_ADRS, (UINT)romInit,                 ((UINT)binArrayStart - (UINT)romInit) / sizeof (long));    ((FUNCPTR)ROM_OFFSET(checkLongs))           ((UINT *)((UINT)ROM_TEXT_ADRS + ((UINT)BINARRAYEND_ROUNDOFF -             (UINT)romInit)), (UINT *)BINARRAYEND_ROUNDOFF,            ((UINT)wrs_kernel_data_end - (UINT)binArrayEnd) / sizeof (long));#endif#endif	/* CPU_FAMILY == MIPS */#endif	/* UNCOMPRESS */#endif	/* ROM_RESIDENT */	#if	(CPU_FAMILY != MIPS) && (!defined (BOOTCODE_IN_RAM))    if (startType & BOOT_CLEAR)	{#ifdef ROM_RESIDENT	fillLongs ((UINT *)SYS_MEM_BOTTOM,		((UINT) RESIDENT_DATA - STACK_SAVE - (UINT)SYS_MEM_BOTTOM)		/ sizeof(long), 0);	fillLongs (((UINT *) wrs_kernel_data_end),	((UINT)SYS_MEM_TOP - ((UINT) wrs_kernel_data_end)) / sizeof(long), 0);#else	/* ROM_RESIDENT */	fillLongs ((UINT *)(SYS_MEM_BOTTOM),		((UINT)romInit - STACK_SAVE - (UINT)SYS_MEM_BOTTOM) /		sizeof(long), 0);#if     defined (UNCOMPRESS)	fillLongs ((UINT *)((UINT)romInit + ROM_COPY_SIZE),		    ((UINT)SYS_MEM_TOP - ((UINT)romInit + ROM_COPY_SIZE))		    / sizeof(long), 0);#else	fillLongs ((UINT *)wrs_kernel_data_end,		((UINT)SYS_MEM_TOP - (UINT)wrs_kernel_data_end) / sizeof (long), 0);#endif 	/* UNCOMPRESS */#endif 	/* ROM_RESIDENT */	*(BOOT_LINE_ADRS) = EOS;	}#endif		#if	defined (UNCOMPRESS) || defined (ROM_RESIDENT)#if	(CPU_FAMILY == I960)    absEntry = (FUNCPTR)sysInitAlt;			#else	    absEntry = (FUNCPTR)usrInit;				#endif	/* CPU_FAMILY == I960 */#else      {#if	(CPU_FAMILY == MIPS)    volatile FUNCPTR absUncompress = (FUNCPTR) UNCMP_RTN;    if ((absUncompress) ((UCHAR *)ROM_OFFSET(binArrayStart),			 (UCHAR *)K0_TO_K1(RAM_DST_ADRS),			 (int)((UINT)binArrayEnd - (UINT)binArrayStart)) != OK)#elif	(CPU_FAMILY == I80X86) || (CPU_FAMILY == ARM)    volatile FUNCPTR absUncompress = (FUNCPTR) UNCMP_RTN;    if ((absUncompress) ((UCHAR *)ROM_OFFSET(binArrayStart),	            (UCHAR *)RAM_DST_ADRS, binArrayEnd - binArrayStart) != OK)#else    if (UNCMP_RTN ((UCHAR *)ROM_OFFSET(binArrayStart),	            (UCHAR *)RAM_DST_ADRS, binArrayEnd - binArrayStart) != OK)#endif		return;		    absEntry = (FUNCPTR)RAM_DST_ADRS;			    }#endif	#if	((CPU_FAMILY == ARM) && ARM_THUMB)    absEntry = (FUNCPTR)((UINT32)absEntry | 1);		/* force Thumb state */#endif	/* CPU_FAMILY == ARM */	    (absEntry) (startType);}#if     (CPU_FAMILY==ARM) && (!defined(ROM_RESIDENT))#undef fillLongs#endif #if (CPU_FAMILY==MC680X0) && !defined(ROM_RESIDENT) && !defined(BOOTCODE_IN_RAM)#undef copyLongs	#endif /* CPU_FAMILY==MC680X0 *//********************************************************************************/LOCAL void copyLongs (source, destination, nlongs)    FAST UINT *source;		    FAST UINT *destination;	    UINT nlongs;		{    FAST UINT *dstend = destination + nlongs;    FAST UINT nchunks;    for (nchunks = nlongs / 8; nchunks; --nchunks)	{#if (CPU_FAMILY == MC680X0)	*destination++ = *source++;	/* 0 */	*destination++ = *source++;	/* 1 */	*destination++ = *source++;	/* 2 */	*destination++ = *source++;	/* 3 */	*destination++ = *source++;	/* 4 */	*destination++ = *source++;	/* 5 */	*destination++ = *source++;	/* 6 */	*destination++ = *source++;	/* 7 */#else	destination[0] = source[0];	destination[1] = source[1];	destination[2] = source[2];	destination[3] = source[3];	destination[4] = source[4];	destination[5] = source[5];	destination[6] = source[6];	destination[7] = source[7];	destination += 8, source += 8;	#endif /* CPU_FAMILY == MC680X0 */	}    while (destination < dstend)	*destination++ = *source++;}#ifndef	BOOTCODE_IN_RAM/********************************************************************************/LOCAL void fillLongs (buf, nlongs, val)    FAST UINT *buf;    UINT nlongs;	    FAST UINT val;	{    FAST UINT *bufend = buf + nlongs;    FAST UINT nchunks;    for (nchunks = nlongs / 8; nchunks; --nchunks)	{#if (CPU_FAMILY == MC680X0)	*buf++ = val;	/* 0 */	*buf++ = val;	/* 1 */	*buf++ = val;	/* 2 */	*buf++ = val;	/* 3 */	*buf++ = val;	/* 4 */	*buf++ = val;	/* 5 */	*buf++ = val;	/* 6 */	*buf++ = val;	/* 7 */#else	buf[0] = val;	buf[1] = val;	buf[2] = val;	buf[3] = val;	buf[4] = val;	buf[5] = val;	buf[6] = val;	buf[7] = val;	buf += 8;#endif /* CPU_FAMILY == MC680X0 */	}    while (buf < bufend)	*buf++ = val;}#endif	/* BOOTCODE_IN_RAM */#if (CPU==XSCALE)int checkLongs (source, destination, nlongs)    FAST UINT *source;             FAST UINT *destination;        UINT nlongs;              {    int fine = 1;    FAST UINT *dstend = destination + nlongs;    while (destination < dstend)    {        if (*destination++ != *source++)        {            fine = 0;            break;        }    }    return fine;}#endif

⌨️ 快捷键说明

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