www.pudn.com > vXworksBSPfors3c44b0.rar > sysSerial.c


/* sysSerial.c - Samsung SBC ARM7 serial device initialization */ 
 
/* Copyright 1984-2001 Wind River Systems, Inc. */ 
#include "copyright_wrs.h" 
 
/* 
modification history 
-------------------- 
01c,10jul01,g_h  add #include "sngks32cSio.c" instead of the makefile 
01b,26apr01,m_h  convert tabs to spaces for readability 
01a,12apr01,m_h  created from snds100 template. 
*/ 
 
/* 
DESCRIPTION 
This file contains the board-specific routines for serial channel 
initialization of the Samsung SBC ARM7 development board. 
 
INCLUDES: 
sngks32cSio.h 
 
SEE ALSO: 
 
*/ 
 
 
#include "vxWorks.h" 
#include "iv.h" 
#include "intLib.h" 
#include "config.h" 
#include "sysLib.h" 
#include "sngks32cSio.h" 
 
#include "wrSbcArm7.h" 
 
#include "sngks32cSio.c" 
 
/* device initialization structure */ 
 
typedef struct 
    { 
    UINT  vectorRx; 
    UINT  vectorTx; 
    UINT32 *baseAdrs; 
    UINT  regSpace; 
    UINT  intLevelRx; 
    UINT  intLevelTx; 
    } SBCARM7_CHAN_PARAS; 
 
 
/* Local data structures */ 
 
LOCAL SBCARM7_CHAN_PARAS devParas[] = 
    { 
      {INT_VEC_UARTRX0, INT_VEC_UARTTX0, (UINT32 *)SERIAL_A_BASE_ADR, UART_REG_ADDR_INTERVAL, 
       INT_LVL_UARTRX0, INT_LVL_UARTTX0}, 
      {INT_VEC_UARTRX1, INT_VEC_UARTTX1, (UINT32 *)SERIAL_B_BASE_ADR, UART_REG_ADDR_INTERVAL, 
      INT_LVL_UARTRX1, INT_LVL_UARTTX1} 
    }; 
  
LOCAL SNGKS32C_CHAN sngks32cChan[N_SBCARM7_UART_CHANNELS]; 
 
/* 
 * Array of pointers to all serial channels configured in system. 
 * See sioChanGet(). It is this array that maps channel pointers 
 * to standard device names.  The first entry will become "/tyCo/0", 
 * the second "/tyCo/1", and so forth. 
 */ 
 
SIO_CHAN * sysSioChans [] = 
    { 
    &sngks32cChan[0].sio, /* /tyCo/0 */ 
    &sngks32cChan[1].sio, /* /tyCo/1 */ 
    }; 
 
 
/* forward declarations */ 
 
/****************************************************************************** 
* 
* sysSerialHwInit - initialize the BSP serial devices to a quiesent state 
* 
* This routine initializes the BSP serial device descriptors and puts the 
* devices in a quiesent state.  It is called from sysHwInit() with 
* interrupts locked. 
* 
* RETURNS: N/A 
* 
* SEE ALSO: sysHwInit() 
*/ 
 
void sysSerialHwInit (void) 
    { 
    int i; 
 
    for (i = 0; i < N_SBCARM7_UART_CHANNELS; i++) 
        { 
        sngks32cChan[i].regDelta = devParas[i].regSpace; 
        sngks32cChan[i].regs = devParas[i].baseAdrs; 
        sngks32cChan[i].baudRate = CONSOLE_BAUD_RATE; 
        sngks32cChan[i].intLevelRx = devParas[i].intLevelRx; 
        sngks32cChan[i].intLevelTx = devParas[i].intLevelTx; 
 
        /* 
         * Initialize driver functions, getTxChar, putRcvChar and channelMode 
         * and initialize UART 
         */ 
 
        sngks32cDevInit(&sngks32cChan[i]); 
        } 
    } 
 
/****************************************************************************** 
* 
* sysSerialHwInit2 - connect BSP serial device interrupts 
* 
* This routine connects the BSP serial device interrupts.  It is called from 
* sysHwInit2().  Serial device interrupts could not be connected in 
* sysSerialHwInit() because the kernel memory allocator was not initialized 
* at that point, and intConnect() may call malloc().  
*  
* RETURNS: N/A  
* 
* SEE ALSO: sysHwInit2() 
*/ 
 
void sysSerialHwInit2 (void) 
    { 
    int i; 
 
    for (i = 0; i < N_SBCARM7_UART_CHANNELS; i++) 
        { 
        /* 
         * Connect and enable the interrupt. 
         * We would like to check the return value from this and log a message 
         * if it failed. However, logLib has not been initialized yet, so we 
         * cannot log a message, so there's little point in checking it. 
         */ 
 
        (void) intConnect (INUM_TO_IVEC(devParas[i].vectorTx), 
                           sngks32cIntTx, (int) &sngks32cChan[i] ); 
        (void) intConnect (INUM_TO_IVEC(devParas[i].vectorRx), 
                           sngks32cIntRcv, (int) &sngks32cChan[i] ); 
 
        intEnable (devParas[i].intLevelRx); 
        sngks32cDevInit2(&sngks32cChan[i]); 
        } 
    } 
 
/****************************************************************************** 
* 
* sysSerialChanGet - get the SIO_CHAN device associated with a serial channel 
* 
* This routine returns a pointer to the SIO_CHAN device associated with 
* a specified serial channel.  It is called by usrRoot() to obtain 
* pointers when creating the system serial devices '/tyCo/x'.  It is also 
* used by the WDB agent to locate its serial channel. 
* 
* RETURNS: A pointer to the SIO_CHAN structure for the channel, or ERROR 
* if the channel is invalid. 
*/ 
 
SIO_CHAN * sysSerialChanGet 
    ( 
    int channel         /* serial channel */ 
    ) 
    { 
    if (channel < 0 || channel >= (int)(NELEMENTS(sysSioChans))) 
        return (SIO_CHAN *)ERROR; 
 
    return sysSioChans[channel]; 
    } 
 
/****************************************************************************** 
* 
* sysSerialReset - reset the sio devices to a quiet state 
* 
* Reset all devices to prevent them from generating interrupts. 
* 
* This is called from sysToMonitor to shutdown the system gracefully before 
* transferring to the bootroms. 
* 
* RETURNS: N/A. 
*/ 
 
void sysSerialReset (void) 
    { 
    int i; 
 
    for (i = 0; i < N_SBCARM7_UART_CHANNELS; i++) 
        { 
        /* disable serial interrupts */ 
 
        intDisable (devParas[i].intLevelTx); 
        intDisable (devParas[i].intLevelRx); 
        } 
    }