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

📄 syslib.c

📁 三星S3C44b0开发板配套 vxworks
💻 C
📖 第 1 页 / 共 3 页
字号:
/* sysLib.c - Samsung SBC ARM7 system-dependent routines */


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

/*
modification history
--------------------
01o,29jul04,a_m  BSP定制 for 多刃剑开发板
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;
/*  : sysSngks32cMacAddr->ne2000EnetAddr */
unsigned char ne2000EnetAddr[] = ETHERNET_MAC_ADRS;

/* locals */

/*  : 21->26 */
#if S3C44B0X_INTNUMLEVELS != 26
#   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 */

/*  : added */
extern void excEnterUndef(void);
extern void excEnterSwi(void);
extern void excEnterPrefetchAbort(void);
extern void excEnterDataAbort(void);
extern void intEnt(void);

/******************************************************************************
*
* portInit - 针对硬板,初始化CPU各端口
* 
*/
static void portInit(void)
{
  /*  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,上升沿触发*/
}

/******************************************************************************
*
* rtl8019Init - RTL8019网络芯片初始化(与NE2000不兼容)
* loopDelay - 循环延时函数,每个时间单位为100us
*/
static int delayLoopCount = 400;
static void loopDelay(int time)
{
  int i;
  for(;time>0;time--)
    for(i=0;i<delayLoopCount;i++);
}
void NetTest(void)
{
  unsigned char c[]={0x21,0x41,0xa1,0xe1};
  int i,j;
  volatile unsigned char *p =(volatile unsigned char *)(NETBASE);
  
  printf("Start NET Controller Test!\n");
  printf("Read registers from controller!\n");
  for (i=0; i<4; i++) 
  	{
    *(volatile unsigned char *)(p) = c[i];
    printf("\nPage%c:",'0'+i);
    for (j=0;j<16;j++) 
		{
          printf("%02X ",(int)(*(volatile unsigned char *)(p+j)));
        }
    }
  
  printf("\nFinish NET Controller Test!\n");
  *(NETBASE+0x00) = 0x22;
}

static void rtl8019Init(void)
{
  /*Reset MAC*/
  *CPLDREG1 |= 0x20;
  loopDelay(500);
  *CPLDREG1 &= 0xDF;
  loopDelay(100);
  *(NETBASE+0x1e) = *(NETBASE+0x1e + 0x20);
  loopDelay(100);
  /* Page 3 Set power status & msic*/
  *(NETBASE+0x00) = 0xc1;
  *(NETBASE+0x20) = 0xcf;	/**(NETBASE+0x20) = 0xc0;*/
  *(NETBASE+0x04) = 0x80;
  *(NETBASE+0x24) = 0x00;
  *(NETBASE+0x06) = 0x70;
  /**(NETBASE+0x26) = 0xFF;*//*07H TEST R/W Reserved, Do not write*/
  *(NETBASE+0x20) = 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;
}

/******************************************************************************
*
* sysInByte,sysOutByte,sysInWordString,sysOutWordString
*
* NE2000驱动需要的输入输出函数.
* 
* 注意:sysInWordString和sysOutWordString的端口地址不累加,使用8位操作.
*/
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++;
	}
}

/******************************************************************************
*
* 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)";*/
	/*  : deleted and added */
	return    "S3C44B0X - ARM7TDMI (ARM,not Thumb) Little Endian";		
#elif (CPU == ARMARCH4_T)
    return    "wrSbcArm7 - ARM7TDMI (Thumb)";
#else

⌨️ 快捷键说明

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