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

📄 syslib.c

📁 VxWorks BSP for S3C44B0X
💻 C
📖 第 1 页 / 共 2 页
字号:
/* sysLib.c - Samsung s3c44b0x ARM7 system-dependent routines *//* Copyright 1984-2002 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01a,12apr01,m_h  created from snds100 template.*//*DESCRIPTION*//* includes */#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 "wrSbcArm7.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   s3c44b0xCacheFuncs;unsigned char syss3c44b0xMacAddr[] = ETHERNET_MAC_ADRS;/* locals */#if S3C44B0X_INTNUMLEVELS != 26//#   error sbcIntLvlMask is wrong size for number of levels#endif/* defines */    /* externals */IMPORT void   s3c44b0xIntDevInit (void);IMPORT void   sysIntStackSplit (char *, long);/*local defines*/#ifndef S3C44B0X_CTRL_REG_READ#   define S3C44B0X_CTRL_REG_READ(x,result) \        ((result) = *(volatile UINT32 *)(x))#endif    /*S3C44B0X_READ*/#ifndef S3C44B0X_CTRL_REG_WRITE#   define S3C44B0X_CTRL_REG_WRITE(x,data) \        (*((volatile UINT32 *)(x)) = (data))#endif /*S3C44B0X_WRITE*//* globals *//* forward LOCAL functions declarations *//* forward declarations */char *    sysPhysMemTop (void);#ifdef INCLUDE_CACHE_SUPPORT    STATUS s3c44b0xCacheLibInit(CACHE_MODE instMode, CACHE_MODE dataMode);    FUNCPTR sysCacheLibInit = s3c44b0xCacheLibInit;    void   sysDebug (char *str);    void   s3c44b0xCacheFlush    (void);      void * s3c44b0xCacheDmaMalloc(size_t bytes);    STATUS s3c44b0xCacheDmaFree  (void *pBuf);    void   s3c44b0xCacheEnable   (void);    void   s3c44b0xCacheDisable  (void);    void * s3c44b0xPhysToVirtRtn (void *adrs);    void * s3c44b0xVirtToPhysRtn (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 "s3c44b0xTimer.c"#include "s3c44b0xIntrCtl.c"#ifdef INCLUDE_NETWORK    #ifdef INCLUDE_END        #include "sbcCksum.c"        #include "sysEnd.c"    #endif /* INCLUDE_END */#endif /* INCLUDE_NETWORK */#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);/******************************************************************************* portInit - 针对硬板,初始化CPU各端口*/staticvoid portInit(void){    #if 0  /*  BIT   9   8   7   6   5   4   3   2   1   0 */  /*  A24   A23 A22 A21 A20 A19 A18 A17 A16 A0  */          /*  0   1 1 1 1 1 1 1 1 1 */  rPCONA = 0x3ff;   rPDATA = 0x3ff;  /*  BIT 10  9   8   7   6   5   4   3   2   1   0   */  /*  /CS5  /CS4  /CS3  /CS2  /CS1  nWBE3 nWBE2 /SRAS /SCAS SCLK  SCKE  */  /*  EXT   NIC   USB   IDE   SMC   NC    NC    Sdram Sdram Sdram Sdram */  /*      0,        0,   0,   0,    1,    0,       0,     1,    1,    1,   1          */  rPDATB = 0x7ff;  rPCONB = 0x7ff;  /*  PC15    14    13    12    11    10    9   8 */  /*  o   o   RXD1  TXD1  o   o   o   o */  /*  NC    NC    Uart1 Uart1 NC    NC    NC    NC  */  /*   11   11    11    11    11    11    01    00  */  /*  PC7   6   5   4   3   2   1   0 */  /*   o    o   o   o   o   o   o   o */  /*   NC   NC    NC    NC    SMCALE  SMCCLE  SMCCE SMCRB*/  /*   01   01    01    01    01    01    01    01  */  rPDATC = 0x0000;    rPCONC = 0xFFF5FFFF;    rPUPC  = 0xFC00;    /*  PORT D GROUP(I/O OR LCD)                    */  /*  BIT7    6   5   4   3   2   1   0 */  /*      VF    VM    VLINE VCLK  VD3   VD2   VD1   VD0 */  /*     01   01    01    01    01    01    01    01  */  rPDATD= 0x55;  rPCOND= 0xaaaa;   rPUPD = 0x00;  /*  Bit 8   7   6   5   4   3   2   1   0   */  /*    ENDLAN  LED3  LED2  LED1  LED0  BEEP  RXD0  TXD0  CLKOUT  */   /*      00    01    01    01    01    01    10    10    00    */  rPDATE  = 0x157;  rPCONE  = 0x25569;   rPUPE = 0xff;  /*  Bit8    7   6   5    4    3   2   1   0   */     /*  IISCLK  IISDI IISDO IISLRCK Input Input Input IICSDA  IICSCL  */  /*  100   100   100   100   00    01    01    10    10    */  rPDATF = 0x0;  rPCONF = 0x1B6D5A;  rPUPF  = 0x1E3;  /*  BIT7    6   5   4   3   2   1   0  */  /*  INT7    INT6    INT5    INT4    INT3    INT2    INT1    INT0  */  /*    S3    S4    S5    S6    NIC   EXT   IDE   USB */  /*      11      11      11      11      11      11      11      11       */  rPDATG = 0xFF;  rPCONG = 0xFFFF;  rPUPG  = 0x00;    rSPUCR=0x7;    /*定义非Cache区*/  /*rNCACHBE0 = 0xc0002000; */  rEXTINT=0x0444;	/*网卡使用EXTINT1,上升沿触发*/    #endif}/******************************************************************************** sysModel - return the model name of the CPU board** This routine returns the model name of the CPU board.* * RETURNS: A pointer to a string identifying the board and CPU.*/char *sysModel (void)    {#if (_BYTE_ORDER == _LITTLE_ENDIAN)#if   (CPU == ARMARCH4)    return    "wrSbcArm7 - ARM7TDMI (ARM)";#elif (CPU == ARMARCH4_T)    return    "wrSbcArm7 - ARM7TDMI (Thumb)";#else#error CPU not supported#endif /* (CPU == ARMARCH4) */#else /*(_BYTE_ORDER == _LITTLE_ENDIAN)*/#if   (CPU == ARMARCH4)    return    "wrSbcArm7 - ARM7TDMI (ARM) Big Endian";#elif (CPU == ARMARCH4_T)    return    "wrSbcArm7 - ARM7TDMI (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** This routine initializes various features of the hardware.* Normally, it is called from usrInit() in usrConfig.c.** NOTE: This routine should not be called directly by the user.** RETURNS: N/A*/void sysHwInit (void)    {    /* install the IRQ/SVC interrupt stack splitting routine */    _func_armIntStackSplit = sysIntStackSplit;    /* Set the MAC address based on DIP setting     * The least significant byte of the address is changed to     * the value of the user DIP switch setting. SW4-D0 is the     * least significant bit of this byte.  We invert the bits     * so Open=0.     *//*    syss3c44b0xMacAddr[5] = ~READ_USERDIP();*/#ifdef  FORCE_DEFAULT_BOOT_LINE    strncpy(sysBootLine,DEFAULT_BOOT_LINE,strlen(DEFAULT_BOOT_LINE)+1);#elif defined INCLUDE_VWARE_LAUNCH    sysVwareBuildBootLine((char*)&syss3c44b0xMacAddr);#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)    {    /* initialize the interrupt library and interrupt driver */    intLibInit (S3C44B0X_INTNUMLEVELS, S3C44B0X_INTNUMLEVELS, INT_MODE);    s3c44b0xIntDevInit();    /* connect sys clock interrupt and auxiliary clock interrupt */    (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** This routine returns the address of the first missing byte of memory,* which indicates the top of memory.** Normally, the user specifies the amount of physical memory with the* macro LOCAL_MEM_SIZE in config.h.  BSPs that support run-time* memory sizing do so only if the macro LOCAL_MEM_AUTOSIZE is defined.* If not defined, then LOCAL_MEM_SIZE is assumed to be, and must be, the* true size of physical memory.** NOTE: Do no adjust LOCAL_MEM_SIZE to reserve memory for application* use.  See sysMemTop() for more information on reserving 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        /* If auto-sizing is possible, this would be the spot.  */#    error   "Dynamic memory sizing not supported"#else        /* Don't do autosizing, if size is given */        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** This routine returns a pointer to the first byte of memory not* controlled or used by VxWorks.** The user can reserve memory space by defining the macro USER_RESERVED_MEM* in config.h.  This routine returns the address of the reserved memory* area.  The value of USER_RESERVED_MEM is in bytes.** 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** This routine transfers control to the ROM monitor.  It is usually called* only by reboot() -- which services ^X -- and bus errors at interrupt* level.  However, in some circumstances, the user may wish to introduce a* new <startType> to enable special boot ROM facilities.** 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_S3C44B0X_END    END_OBJ *   pEnd;#endif#ifdef INCLUDE_CACHE_SUPPORT    s3c44b0xCacheDisable();#endif /* INCLUDE_CACHE_SUPPORT */    /*     * Examine ROM - if it's a VxWorks boot ROM, jump to the warm boot entry     * point; otherwise jump to the start of the ROM.     * A VxWorks boot ROM begins     *    MOV    R0,#BOOT_COLD     *    B    ...     *    DCB    "Copyright"     * We check the first and third words only. This could be tightened up     * if required (see romInit.s).     */#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_S3C44B0X_END    /*     * Reset Ethernet controller to prevent it doing anything     * before jumping to the bootrom.     */    pEnd = endFindByName ("sng", 0);    if (pEnd != NULL)        pEnd->pFuncTable->stop(pEnd->devObject.pDevice);#endif /* INCLUDE_S3C44B0X_END */    (*pRom)(startType);    /* jump to bootrom */    return OK;        /* in case we ever continue from ROM monitor */    }/****************************************************************************** sysProcNumGet - get the processor number** This routine returns the processor number for the CPU board, which is* set with sysProcNumSet().** RETURNS: The processor number for the CPU board.** SEE ALSO: sysProcNumSet()*/int sysProcNumGet (void)    {    return 0;    }/****************************************************************************** sysProcNumSet - set the processor number*

⌨️ 快捷键说明

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