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

📄 syslib.c

📁 base on vxworks and ARM7TDMI
💻 C
📖 第 1 页 / 共 2 页
字号:
/* sysLib.c - Samsung SBC ARM7 system-dependent routines */

/* Copyright 1984-2002 Wind River Systems, Inc. */
#include "copyright_wrs.h"

/*
modification history
--------------------
01k,26mar02,m_h  rename glbEnetAddr to sysSngks32cMacAddr
01j,17jan02,m_h  fix cache issues and diab build warnings
01i,27sep01,m_h  base MAC address on user DIP setting, Big Endian Support
01h,23jul01,m_h  builds in UNIX
01g,17jul01,g_h  add visionWARE 2.00 support
01f,11jul01,g_h  disable cache in sysToMonitor()
01e,10jul01,g_h  add INCLUDE_LCD & INCLUDE_LED & INCLUDE_NETWORK macros
01d,09jul01,g_h  add #include "sbcCksum.c" instead of the makefile
01c,26apr01,m_h  convert tabs to spaces for readability
01b,25apr01,m_h  add comments to cache functions
01a,12apr01,m_h  created from snds100 template.
*/

/*
DESCRIPTION
This library provides board-specific routines for the WindRiver SBC ARM7
Ver 1.0 Development Board BSP for the Samsung KS32C chip.

It #includes the following chip drivers:
    nullVme.c         -     dummy VMEbus routines
    sngks32cTimer.c   -     SNGKS32CARM7 timer driver
    sngks32cIntrCtl.c -     SNGKS32CARM7 interrupt controller driver
    nullNvRam.c       -     dummy NVRAM routines

It #includes the following BSP files:
    sysSerial.c       -     serial device initialization routines
    sysEnd.c          -     END network driver support routines.

INCLUDE FILES: sysLib.h string.h intLib.h taskLib.h vxLib.h muxLib.h

SEE ALSO:
<Configuration>
<ARM Architecture Reference Manual>,
<Samsung KS32C50100 Microcontroller User's Manual>,
<Samsung KS32C5000(A)/50100 Microcontroller Application Notes>
*/

/* 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   sngks32cCacheFuncs;

unsigned char sysSngks32cMacAddr[] = ETHERNET_MAC_ADRS;

/* locals */


#if SNGKS32C_INTNUMLEVELS != 21
#   error sbcIntLvlMask is wrong size for number of levels
#endif


/* defines */

    
/* externals */

IMPORT void   sngks32cIntDevInit (void);
IMPORT void   sysIntStackSplit (char *, long);

/*local defines*/
#ifndef SBCARM7_CTRL_REG_READ
#   define SBCARM7_CTRL_REG_READ(x,result) \
        ((result) = *(volatile UINT32 *)(x))
#endif    /*SBCARM7_READ*/

#ifndef SBCARM7_CTRL_REG_WRITE
#   define SBCARM7_CTRL_REG_WRITE(x,data) \
        (*((volatile UINT32 *)(x)) = (data))
#endif /*SBCARM7_WRITE*/



/* globals */


/* forward LOCAL functions declarations */


/* forward declarations */

char *    sysPhysMemTop (void);

#ifdef INCLUDE_CACHE_SUPPORT
STATUS sngks32cCacheLibInit(CACHE_MODE instMode, CACHE_MODE dataMode);
FUNCPTR sysCacheLibInit = sngks32cCacheLibInit;

void   sysDebug (char *str);
void   sngks32cCacheFlush    (void);  
void * sngks32cCacheDmaMalloc(size_t bytes);
STATUS sngks32cCacheDmaFree  (void *pBuf);
void   sngks32cCacheEnable   (void);
void   sngks32cCacheDisable  (void);
void * sngks32cPhysToVirtRtn (void *adrs);
void * sngks32cVirtToPhysRtn (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 "sngks32cTimer.c"
#include "sngks32cIntrCtl.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 */

/******************************************************************************
*
* 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;

   /* sysLcdInit();  initialize the LCD panel */

  /*  sysLcdWriteString("   WindRiver    ", 1, 1);*/
/*
#if (_BYTE_ORDER == _LITTLE_ENDIAN)
#if   (CPU == ARMARCH4)
    sysLcdWriteString("   SBC ARM7     ", 2, 1);
#else  /8 ARMARCH4 8/
    sysLcdWriteString("   SBC ARM7 (t) ", 2, 1);
#endif  /8 ARMARCH4 8/
#else /8 (_BYTE_ORDER == _LITTLE_ENDIAN) 8/
#if   (CPU == ARMARCH4)
    sysLcdWriteString("  SBC ARM7 (BE) ", 2, 1);
#else  /8 ARMARCH4 8/
    sysLcdWriteString("  SBC ARM7 (tBE)", 2, 1);
#endif  /8 ARMARCH4 8/
#endif /8 (_BYTE_ORDER == _LITTLE_ENDIAN) 8/
*/
  /*  sysLedInit();  initialize the LED */

    /* 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.
     */

  /*  sysSngks32cMacAddr[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*)&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)
    {
    /* initialize the interrupt library and interrupt driver */


    intLibInit (SNGKS32C_INTNUMLEVELS, SNGKS32C_INTNUMLEVELS, INT_MODE);
    sngks32cIntDevInit();

    /* 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_SNGKS32C_END
    END_OBJ *   pEnd;
#endif

#ifdef INCLUDE_CACHE_SUPPORT
    sngks32cCacheDisable();
#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_SNGKS32C_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_SNGKS32C_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 + -