📄 syslib.c
字号:
/* sysLib.c - Samsung SBC ARM9 system-dependent routines *//* Copyright 2004-2005 *//* Copyright 1984-2002 Wind River Systems, Inc. */#include "copyright_wrs.h"#include "vxWorks.h"#include "config.h"#include "sysLib.h"#include "string.h"#include "intLib.h"#include "taskLib.h"#include "vxLib.h"#include "muxLib.h"#include "cacheLib.h"#include "memLib.h"#include "wrSbcArm9.h"/* imports */IMPORT char end; /* end of system, created by ld */IMPORT VOIDFUNCPTR _func_armIntStackSplit; /* ptr to fn to split stack *//* globals */int sysBus = BUS; /* system bus type (VME_BUS, etc) */int sysCpu = CPU; /* system cpu type */char * sysBootLine = BOOT_LINE_ADRS; /* address of boot line */char * sysExcMsg = EXC_MSG_ADRS; /* catastrophic message area */int sysProcNum; /* processor number of this cpu */int sysFlags; /* boot flags */char sysBootHost [BOOT_FIELD_LEN]; /* name of host from which we booted */char sysBootFile [BOOT_FIELD_LEN]; /* name of file from which we booted */CACHE_FUNCS s3c2410xCacheFuncs;/* : sysSngks32cMacAddr->ne2000EnetAddr */unsigned char ne2000EnetAddr[] = ETHERNET_MAC_ADRS;/* locals *//* : 21->26 */#if S3C2410X_INTLEVEL_NUM != 32# error sbcIntLvlMask is wrong size for number of levels#endif/* defines */#define _WR(ulADDR,usDATA) *((volatile unsigned short *)(ulADDR<<1))=(unsigned short)usDATA /* externals */IMPORT void s3c2410xIntDevInit (void);IMPORT void sysIntStackSplit (char *, long);/*local defines*/#ifndef SBCARM9_CTRL_REG_READ# define SBCARM9_CTRL_REG_READ(x,result) \ ((result) = *(volatile UINT32 *)(x))#endif /*SBCARM9_READ*/#ifndef SBCARM9_CTRL_REG_WRITE# define SBCARM9_CTRL_REG_WRITE(x,data) \ (*((volatile UINT32 *)(x)) = (data))#endif /*SBCARM9_WRITE*//* globals */unsigned char Verify(unsigned long ulRomAddr,unsigned long ulRamAddr,unsigned long ulRomSize);unsigned char _WAIT(unsigned long ulAddr) ;unsigned char SST39VF160_WordProg_Test(unsigned long ulAddr,unsigned short usData);unsigned char SST39VF160_ChipProg(unsigned long ulRomAddr,unsigned long ulRamAddr,unsigned long ulRomSize);unsigned char SST39VF160_SectorErase(unsigned long ulAddr);char * sysPhysMemTop (void);#ifdef INCLUDE_CACHE_SUPPORTSTATUS s3c2410xCacheLibInit(CACHE_MODE instMode, CACHE_MODE dataMode);FUNCPTR sysCacheLibInit = s3c2410xCacheLibInit;void sysDebug (char *str);void s3c2410xCacheFlush (void); void * s3c2410xCacheDmaMalloc(size_t bytes);STATUS s3c2410xCacheDmaFree (void *pBuf);void s3c2410xCacheEnable (void);void s3c2410xCacheDisable (void);void * s3c2410xPhysToVirtRtn (void *adrs);void * s3c2410xVirtToPhysRtn (void *adrs);#endif /*INCLUDE_CACHE_SUPPORT*//* included source files */#ifdef INCLUDE_FLASH#include "flashMem.c"#else /* INCLUDE_FLASH */#include "mem/nullNvRam.c"#endif /* INCLUDE_FLASH */#include "vme/nullVme.c"#include "sysSerial.c"#include "s3c2410xTimer.c"#include "s3c2410xIntrCtl.c"#ifdef INCLUDE_NETWORK#ifdef INCLUDE_END/*#include "sbcCksum.c"*/#include "sysEnd.c"#endif /* INCLUDE_END */#endif /* INCLUDE_NETWORK */#ifdef INCLUDE_LCD#include "sysLcd.c"#endif /* INCLUDE_LCD */#ifdef INCLUDE_LED#include "sysLed.c"#endif /* INCLUDE_LCD */#ifdef INCLUDE_VWARE_LAUNCH#include "sysVware.c"#endif /* INCLUDE_VWARE_LAUNCH */extern void excEnterUndef(void);extern void excEnterSwi(void);extern void excEnterPrefetchAbort(void);extern void excEnterDataAbort(void);extern void intEnt(void);/******************************************************************************** */static void portInit(void){ rPCONA = 0x01ffff; rPDATA = 0x000000; rPCONB = 0x2aa955; rPDATB = 0x000; rPUPB = 0xfff; rPCONC = 0x00005555; rPDATC = 0x0001; rPUPC = 0x4100; rPCOND= 0x55555555; rPDATD= 0x0000; rPUPD = 0xc040; rPCONE = 0xaa8002aa; rPDATE = 0x0000; rPUPE = 0xf81f; rPCONF = 0xaa8a; rPDATF = 0x00; rPUPF = 0xff; rPCONG = 0x00b000f0; rPDATG = 0x0000; rPUPG = 0x08fb; rPCONH= 0x15faaa; rPDATH= 0xFFDF; rPUPH= 0x7bf; rMISCCR=0x43550; rDCLKCON = 0x7f007f0; rEXTINT1 = 0x00000444; rEXTINT2 = 0x00000000; rEXINTFLT2 = 0x00000000; rEXINTFLT3 = 0x00000000; rEXINTMASK = 0x00fffff0; rEXINTPND = 0x00fffff0; }/********************************************************************************/static int delayLoopCount = 400;static void loopDelay(int time){ int i; for(;time>0;time--) for(i=0;i<delayLoopCount;i++);}static void rtl8019Init(void){ rPDATC |= 0x0004; loopDelay(500); rPDATC &= 0xFFFB; loopDelay(100); *(NETBASE+0x1f) = *(NETBASE+0x1f); loopDelay(500); *(NETBASE+0x00) = 0xc1; *(NETBASE+0x01) = 0xcf; *(NETBASE+0x04) = 0x80; *(NETBASE+0x05) = 0x00; *(NETBASE+0x06) = 0x70; *(NETBASE+0x01) = 0x0f; }/******************************************************************************** s3cExcVecSet - 构成RAM中向量表**/void s3cExcVecSet(void){ int i; i = (int)&excEnterUndef; *((volatile int*)(S3C_EXC_BASE + 0x0)) = i; i = (int)&excEnterSwi; *((volatile int*)(S3C_EXC_BASE + 0x4)) = i; i = (int)&excEnterPrefetchAbort; *((volatile int*)(S3C_EXC_BASE + 0x8)) = i; i = (int)&excEnterDataAbort; *((volatile int*)(S3C_EXC_BASE + 0xc)) = i; i = (int)&intEnt; *((volatile int*)(S3C_EXC_BASE + 0x14)) = i; return;}/********************************************************************************/unsigned char sysInByte (unsigned long port){ return (REG8(port));}void sysOutByte (unsigned long port, unsigned char data){ REG8(port) = data;}void sysInWordString (unsigned long port, unsigned short *pData, int count){ int i, byte_count; char *pbyte; pbyte = (char *)pData; byte_count = count*2; for(i=0; i<byte_count; i++){ *(pbyte) = REG8(port); pbyte++; }}void sysOutWordString(unsigned long port, unsigned short *pData, int count){ int i, byte_count; char *pbyte; pbyte = (char *)pData; byte_count = count*2; for(i=0; i<byte_count; i++){ REG8(port) = *(pbyte); pbyte++; }}char *sysModel (void) {#if (_BYTE_ORDER == _LITTLE_ENDIAN)#if (CPU == ARMARCH4) return "S3C2410X - ARM9TDMI (ARM,not Thumb) Little Endian"; #elif (CPU == ARMARCH4_T) return "wrSbcArm9 - ARM9TDMI (Thumb)";#else#error CPU not supported#endif /* (CPU == ARMARCH4) */#else /*(_BYTE_ORDER == _LITTLE_ENDIAN)*/#if (CPU == ARMARCH4) return "wrSbcArm9 - ARM9TDMI (ARM) Big Endian";#elif (CPU == ARMARCH4_T) return "wrSbcArm9 - ARM9TDMI (Thumb) Big Endian";#else#error CPU not supported#endif /* (CPU == ARMARCH4) */#endif /*(_BYTE_ORDER == _LITTLE_ENDIAN)*/ }/******************************************************************************** sysBspRev - return the bsp version with the revision eg 1.1/<x>** This function returns a pointer to a bsp version with the revision.* for eg. 1.1/<x>. BSP_REV is concatenated to BSP_VERSION to form the* BSP identification string.** RETURNS: A pointer to the BSP version/revision string.*/char * sysBspRev (void) { return (BSP_VERSION BSP_REV); }/******************************************************************************** sysHwInit - initialize the CPU board hardware* NOTE: This routine should not be called directly by the user.** RETURNS: N/A*/void sysHwInit (void) { portInit(); rtl8019Init(); s3cExcVecSet(); _func_armIntStackSplit = sysIntStackSplit;#ifdef INCLUDE_LCD /* : added */ sysLcdInit(); /* initialize the LCD panel */ sysLcdWriteString(" WindRiver ", 1, 1);#if (_BYTE_ORDER == _LITTLE_ENDIAN)#if (CPU == ARMARCH4) sysLcdWriteString(" SBC ARM9 ", 2, 1);#else /* ARMARCH4 */ sysLcdWriteString(" SBC ARM9 (t) ", 2, 1);#endif /* ARMARCH4 */#else /* (_BYTE_ORDER == _LITTLE_ENDIAN) */#if (CPU == ARMARCH4) sysLcdWriteString(" SBC ARM9 (BE) ", 2, 1);#else /* ARMARCH4 */ sysLcdWriteString(" SBC ARM9 (tBE)", 2, 1);#endif /* ARMARCH4 */#endif /* (_BYTE_ORDER == _LITTLE_ENDIAN) */#endif /*INCLUDE_LCD*/#ifdef INCLUDE_LED /* : added */ sysLedInit(); /* initialize the LED */#endif /*INCLUDE_LED*/#ifdef FORCE_DEFAULT_BOOT_LINE strncpy(sysBootLine,DEFAULT_BOOT_LINE,strlen(DEFAULT_BOOT_LINE)+1);#elif defined INCLUDE_VWARE_LAUNCH sysVwareBuildBootLine((char*)&sysSngks32cMacAddr);#endif /* FORCE_DEFAULT_BOOT_LINE */ sysSerialHwInit (); /* initialize serial data structure */ }/******************************************************************************** sysHwInit2 - additional system configuration and initialization** This routine connects system interrupts and does any additional* configuration necessary.** RETURNS: N/A** NOMANUAL** Note: this is called from sysClkConnect() in the timer driver.*/void sysHwInit2 (void) { intLibInit (S3C2410X_INTLEVEL_NUM, S3C2410X_INTLEVEL_NUM, INT_MODE); s3c2410xIntDevInit(); (void)intConnect (INUM_TO_IVEC (INT_VEC_TIMER0), sysClkInt, 0); (void)intConnect (INUM_TO_IVEC (INT_VEC_TIMER1), sysAuxClkInt, 0); /* connect serial interrupt */ sysSerialHwInit2(); }/******************************************************************************** sysPhysMemTop - get the address of the top of physical memory*** RETURNS: The address of the top of physical memory.** SEE ALSO: sysMemTop()*/char * sysPhysMemTop (void) { static char * physTop = NULL; if (physTop == NULL) {#ifdef LOCAL_MEM_AUTOSIZE# error "Dynamic memory sizing not supported"#else physTop = (char *)(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE);#endif /* LOCAL_MEM_AUTOSIZE */ } return physTop; }/******************************************************************************** sysMemTop - get the address of the top of VxWorks memory*** RETURNS: The address of the top of VxWorks memory.*/char * sysMemTop (void) { static char * memTop = NULL; if (memTop == NULL) { memTop = sysPhysMemTop () - USER_RESERVED_MEM; } return memTop; }/******************************************************************************** sysToMonitor - transfer control to the ROM monitor*** RETURNS: Does not return.*/STATUS sysToMonitor ( int startType /* passed to ROM to tell it how to boot */ ) { FUNCPTR pRom; UINT32 * p = (UINT32 *)ROM_TEXT_ADRS;#ifdef INCLUDE_S3C2410X_END END_OBJ * pEnd;#endif#ifdef INCLUDE_CACHE_SUPPORT s3c2410xCacheDisable();#endif /* INCLUDE_CACHE_SUPPORT */#if (_BYTE_ORDER == _LITTLE_ENDIAN) if (p[0] == 0xE3A00002 && p[2] == 0x79706F43) pRom = (FUNCPTR)(ROM_TEXT_ADRS + 4); /* warm boot address */ else pRom = (FUNCPTR)ROM_TEXT_ADRS; /* start of ROM */#else /* (_BYTE_ORDER == _LITTLE_ENDIAN) */ if (p[0] == 0xE3A00002 && p[2] == 0x436F7079) pRom = (FUNCPTR)(ROM_TEXT_ADRS + 4); /* warm boot address */ else pRom = (FUNCPTR)ROM_TEXT_ADRS; /* start of ROM */#endif /* (_BYTE_ORDER == _LITTLE_ENDIAN) */#ifdef INCLUDE_S3C2410X_END pEnd = endFindByName ("sng", 0); if (pEnd != NULL) pEnd->pFuncTable->stop(pEnd->devObject.pDevice);#endif /* INCLUDE_S3C2410X_END */ (*pRom)(startType); /* jump to bootrom */ return OK; /* in case we ever continue from ROM monitor */ }/****************************************************************************** sysProcNumGet - get the processor number*** RETURNS: The processor number for the CPU board.** SEE ALSO: sysProcNumSet()*/int sysProcNumGet (void) { return 0; }/****************************************************************************** sysProcNumSet - set the processor number** NOTE* By convention, only processor 0 should dual-port its memory.** RETURNS: N/A** SEE ALSO: sysProcNumGet()*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -