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


/* sysSerial.c - PrPMC600 BSP serial device initialization */ 
 
/* Copyright 1984-2000 Wind River Systems, Inc. */ 
/* Copyright 1996-2000 Motorola, Inc. All Rights Reserved */ 
#include "copyright_wrs.h" 
 
/* 
modification history 
-------------------- 
01a,28feb00,rhk  created from version 01c, MV2100 BSP. 
*/ 
 
/* 
The sysSerial.c file is normally included as part of the sysLib.c file. 
This code segment configures the serial ports for the BSP. 
 
This BSP can support a single I8250 DUSART.  
*/ 
 
#include "vxWorks.h" 
#include "logLib.h" 
#include "iv.h" 
#include "intLib.h" 
#include "config.h" 
#include "sysLib.h" 
#include "st16552Sio.c" 
#include "BspCpusApi.h" 
 
/* externals */ 
 
IMPORT UCHAR	sysInByte(ULONG); 
IMPORT void	sysOutByte(ULONG, UCHAR); 
IMPORT int	intEnable (int intLevel); 
IMPORT void    led11(unsigned short ); 
/* device initialization structures */ 
 
typedef struct 
    { 
    USHORT vector;			/* Interrupt vector */ 
    ULONG  baseAdrs;		/* Register base address */ 
    USHORT regSpace;		/* Address Interval */ 
    USHORT intLevel;		/* Interrupt level */ 
    } I8250_CHAN_PARAS; 
 
/* Local data structures */ 
static ST16552_CHAN  st16552Chan[N_UART_CHANNELS]; 
static ST16552_MUX   st16552Mux; 
/*static I8250_CHAN  i8250Chan[N_UART_CHANNELS];*/ 
 
static I8250_CHAN_PARAS devParas[] =  
    { 
    	{COM1_INT_VEC, COM1_BASE_ADR, UART_REG_ADDR_INTERVAL, COM1_INT_LVL},/* in pmc8240 */ 
		{COM2_INT_VEC, COM2_BASE_ADR, UART_REG_ADDR_INTERVAL, COM2_INT_LVL},/* in PC97307, UART1 */ 
		{COM3_INT_VEC, COM3_BASE_ADR, UART_REG_ADDR_INTERVAL, COM3_INT_LVL} /* in PC97307, UART2 */ 
    }; 
 
#define UART_REG(reg,chan) \ 
		(devParas[chan].baseAdrs + reg * devParas[chan].regSpace) 
 
/* globals */ 
     
 
void sysSerialHwInit (void) 
{ 
    int i; 
	 
	/* 使能DUART模式,仅用于824x子卡 */ 
	*((unsigned char *)(COM1_BASE_ADR + 0x11)) = 0x01; 
	 
    for (i = 0; i < N_UART_CHANNELS; i++) 
    { 
		st16552Chan[i].regs = (char *)devParas[i].baseAdrs; 
        st16552Chan[i].level	= devParas[i].intLevel; 
        st16552Chan[i].regDelta = devParas[i].regSpace; 
        st16552Chan[i].baudRate = CONSOLE_BAUD_RATE; 
        /* st16552Chan[i].xtal = 66700000; */ /*devParas[i].xtal*/ 
		st16552Chan[i].xtal = sysGetBusSpdHertz();  /* modify by zou 03-3-1 10:48 */ 
		 
        st16552Chan[i].channelMode = 0; 
         
        st16552DevInit(&st16552Chan[i]); 
    } 
     
    st16552Mux.nextChan = 0; 
    st16552Mux.pChan = st16552Chan; 
     
     
	 
} 
 
/****************************************************************************** 
* 
* sysSerialHwInit2 - connect BSP serial device interrupts 
* 
* This routine connects the BSP serial device interrupts.  It is called from 
* sysHwInit2().   
*  
* Serial device interrupts cannot be connected in sysSerialHwInit() because 
* the kernel memory allocator is not initialized at that point, and 
* intConnect() calls malloc(). 
* 
* RETURNS: N/A 
* 
* SEE ALSO: sysHwInit2() 
*/ 
 
#if 1 
void sysSerialHwInit2 (void) 
{ 
    int i; 
 
    /* connect serial interrupts N_UART_CHANNELS*/ 
    for (i = 0; i < 1; i++) 
    { 
        if (st16552Chan[i].level) 
        { 
            intConnect ( INUM_TO_IVEC ((unsigned int)(st16552Chan[i].level)), 
                                st16552Int, (int)&st16552Chan[i]  
                               ); 
 
            intEnable (devParas[i].intLevel);  
        } 
    } 
} 
#endif 
 
/* ST16C552的两个通道共用一个中断 */ 
#if 0 
void sysSerialHwInit2 (void) 
    { 
    /* Connect the multiplexed interrupt handler */ 
 
      intConnect (INUM_TO_IVEC((int)(devParas[0].vector)), 
			st16552MuxInt, (int) &st16552Mux); 
     
    intEnable (devParas[0].intLevel); 
} 
#endif 
/****************************************************************************** 
* 
* 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 >= N_UART_CHANNELS) ) 
        return (SIO_CHAN *)ERROR; 
 
    return ((SIO_CHAN *) &st16552Chan[channel]); 
} 
 
/****************************************************************************** 
* 
* sysSerialReset - reset all serial devices to a quiescent state 
* 
* This routine resets all serial devices to a quiescent state.  It is called  
* by sysToMonitor(). 
* 
* RETURNS: N/A 
* 
* SEE ALSO: sysToMonitor() 
*/ 
 
void sysSerialReset (void) 
{ 
    int i; 
 
    for (i = 0; i < N_UART_CHANNELS; i++) 
	{ 
        st16552DevInit(&st16552Chan[i]); 
	} 
} 
 
 
/***************以下为测试代码****************************/ 
/* 使能自环方式 */ 
void EnableLoop(unsigned char ucChan ) 
{     
    ST16552_CHAN *	pChan = &st16552Chan[ucChan]; 
    ST16552_REG_WRITE(pChan, IER, 0);  
	/*     
    ioctl (STD_IN, FIOFLUSH, 0 ); 
    ioctl (STD_OUT, FIOFLUSH, 0 ); 
	*/     
    ST16552_REG_WRITE(pChan, MCR, MCR_INT | MCR_LOOP);  
    /* ST16552_REG_WRITE(pChan, IER, RxFIFO_BIT | TxFIFO_BIT); */ 
 
} 
 
/* 非自环方式 */ 
void DisableLoop(unsigned char ucChan ) 
{ 
    ST16552_CHAN *	pChan = &st16552Chan[ucChan]; 
    ST16552_REG_WRITE(pChan, IER, 0);  
	/*     
    ioctl (STD_IN, FIOFLUSH, 0 ); 
    ioctl (STD_OUT, FIOFLUSH, 0 ); 
	*/     
    ST16552_REG_WRITE(pChan, MCR, MCR_INT | MCR_DTR);  
    /* ST16552_REG_WRITE(pChan, IER, RxFIFO_BIT | TxFIFO_BIT); */ 
 
}