📄 syslib.c
字号:
/* 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 + -