?? sysserial.c
字號(hào):
/* sysSerial.c - MPC860 SMC UART BSP serial device initialization *//* Copyright 1984-1998 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01g,19feb99,cn fixed mangen error.01f,28jan99,cn Added support for the second SMC channel (SPR# 10005).01e,08may98,gls Added clearing of serial interrupts to sysSerialHwInit01d,06nov96,tpr replaced SYS_CPU_FREQ by BRGCLK_FREQ.01c,20jun96,tpr added sysSerialReset().01b,28may96,dzb tweaked setting of portB registers.01a,19apr86,cah created*//*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 up to two SMC channels in UART mode only.*/ #include "vxWorks.h"#include "iv.h"#include "intLib.h"#include "config.h"#include "sysLib.h"#include "drv/sio/ppc860Sio.h"#include "drv/multi/ppc860Cpm.h"#include "860sar.h"#include "mpc860p.h"/*#include "ppc860scc.c"*//* defines *//* Local data structures */ /*static UINT8 chanNum = NUM_TTY; *//* number of channels actually used */static PPC860SMC_CHAN ppc860Chan;/*static PPC860SCC_CHAN ppc860SccChan;*//*extern int immrVal;*//******************************************************************************** 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*/void sysSerialHwInit (void){ int immrVal = vxImmrGet(); /**************** SMC1 serial port ******************/ /* BRGCLK freq (Hz) */ ppc860Chan.clockRate = BRGCLK_FREQ; /* IMMR reg has base adr */ ppc860Chan.regBase = immrVal; /* use BRG1 for channel 1 */ ppc860Chan.bgrNum = 3; /* SMC1 wired for rs232 */ ppc860Chan.uart.smcNum = 1; /* init the number of TBDs */ ppc860Chan.uart.txBdNum = UART_TBD_NUM; /* init the number of RBDs */ ppc860Chan.uart.rxBdNum = UART_RBD_NUM; /* transmit BD base adrs */ ppc860Chan.uart.txBdBase = (SMC_BUF *) (MPC860_REGB_OFFSET + SMC1_TBD_OFF); /* receive BD base adrs */ ppc860Chan.uart.rxBdBase = (SMC_BUF *) (MPC860_REGB_OFFSET + SMC1_RBD_OFF); /* tx buf base */ ppc860Chan.uart.txBufBase = (u_char *) (MPC860_DPRAM_BASE (immrVal) + SMC1_TX_BUF_OFF); /* rx buf base */ ppc860Chan.uart.rxBufBase = (u_char *) (MPC860_DPRAM_BASE (immrVal) + SMC1_RX_BUF_OFF); /* transmit buffer size */ ppc860Chan.uart.txBufSize = UART_TX_BUF_SZ; /* DPRAM addr of SMC1 params */ ppc860Chan.uart.pSmc = (SMC *) ((UINT32) PPC860_DPR_SMC1 (MPC860_DPRAM_BASE (immrVal))); /* SMCMR1 for SMC1 */ ppc860Chan.uart.pSmcReg = (SMC_REG *) ((UINT32) MPC860_SMCMR1 (immrVal)); /* Mask interrupt */ ppc860Chan.uart.pSmcReg->smcm = 0x00; ppc860Chan.pBaud = (UINT32 *) ((UINT32) MPC860_BRGC3 (immrVal)); ppc860Chan.channelMode = 0; /* select rs232 pins */ *MPC860_PBPAR(immrVal) |= 0x000000c0; /******************* SCC3 for serial port ****************/ /* BRGCLK freq (Hz) *//* ppc860SccChan.clockRate = BRGCLK_FREQ; ppc860SccChan.regBase = immrVal;*/ /* use BRG2 for channel 2 *//* ppc860SccChan.bgrNum = 2;*/ /* SCC3 wired for rs232 *//* ppc860SccChan.uart.sccNum = 3;*/ /* init the number of TBDs *//* ppc860SccChan.uart.txBdNum = UART_TBD_NUM;*/ /* init the number of RBDs *//* ppc860SccChan.uart.rxBdNum = UART_RBD_NUM;*/ /* transmit BD base adrs *//* ppc860SccChan.uart.txBdBase = (SCC_BUF *) (MPC860_REGB_OFFSET + SCC3_TBD_OFF);*/ /* receive BD base adrs *//* ppc860SccChan.uart.rxBdBase = (SCC_BUF *) (MPC860_REGB_OFFSET + SCC3_RBD_OFF);*/ /* tx buf base *//* ppc860SccChan.uart.txBufBase = (u_char *) (MPC860_DPRAM_BASE (immrVal) + SCC3_TX_BUF_OFF);*/ /* rx buf base *//* ppc860SccChan.uart.rxBufBase = (u_char *) (MPC860_DPRAM_BASE (immrVal) + SCC3_RX_BUF_OFF);*/ /* transmit buffer size *//* ppc860SccChan.uart.txBufSize = UART_TX_BUF_SZ;*/ /* DPRAM addr of SCC3 params *//* ppc860SccChan.uart.pScc = (SCC *) ((UINT32) PPC860_DPR_SCC3 (MPC860_DPRAM_BASE (immrVal))); GSMR_L3 for SCC3 *//* ppc860SccChan.uart.pSccReg = (SCC_REG *) ((UINT32)MPC860_GSMR_L3(immrVal));*/ /* Mask interrupts *//* ppc860SccChan.uart.pSccReg->sccm = 0x0000; ppc860SccChan.pBaud = (UINT32 *)((UINT32) MPC860_BRGC2(immrVal)); ppc860SccChan.channelMode = 0;*/ /* select RS232 pins *//* *MPC860_PDPAR(immrVal) |= 0x0030;*/ /* set it to normal operations */ *MPC860_SDCR(immrVal) = SDCR_RAID_BR5; /* reset the chip */ ppc860DevInit(&(ppc860Chan));/* ppc860SccDevInit(&(ppc860SccChan));*/ }/******************************************************************************** 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() calls malloc().** RETURNS: N/A*/ void sysSerialHwInit2 (void) { (void) intConnect (IV_SMC1, (VOIDFUNCPTR) ppc860Int, (int) &ppc860Chan);/* (void) intConnect (IV_SCC3, (VOIDFUNCPTR) ppc860SccInt, (int) &ppc860SccChan);*/ *CIMR(vxImmrGet()) |= CIMR_SMC1;/* | CIMR_SCC3;*/ }/******************************************************************************** sysSerialChanGet - get the SIO_CHAN device associated with a serial channel** This routine gets the SIO_CHAN device associated with a specified 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 */ ) { switch (channel) { case 0: return ((SIO_CHAN *)&ppc860Chan); break;/* case 1: return ((SIO_CHAN *)&ppc860SccChan); break; */ default: return ((SIO_CHAN *) ERROR); break; } }/********************************************************************************* sysSerialReset - reset the serail device ** This function calls sysSerialHwInit() to reset the serail device** RETURNS: N/A**/void sysSerialReset (void) { sysSerialHwInit (); }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -