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

📄 syslib.c

📁 BSP for S3C2410
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -