📄 bootinit.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 = ©Longs; #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 + -