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

📄 m68360sio.c

📁 IXP425的BSP代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		{                *M360_CPM_CISR(pChan->regBase) = pChan->uart.intMask                    ;   /* reset the SCC's interrupt status bit */		*M360_CPM_CIMR(pChan->regBase) |= pChan->uart.intMask                    ;   /* enable this SCC's interrupt  */		pChan->uart.pSccReg->scce = SCC_UART_SCCX_RX                    ;   /* reset the receiver status bit */                 pChan->uart.pSccReg->sccm = SCC_UART_SCCX_RX | SCC_UART_SCCX_TX                    ;   /* enables the receive and transmit interrupts */		}            else		{                pChan->uart.pSccReg->sccm = 0                    ;   /* mask off the receive and transmit interrupts */		*M360_CPM_CIMR(pChan->regBase) &= (~(pChan->uart.intMask));                    ;   /* mask off this SCC's interrupt */                 }            pChan->channelMode = arg;            intUnlock(oldlevel);            break;        case SIO_MODE_GET:            *(int *)arg = pChan->channelMode;            return (OK);        case SIO_AVAIL_MODES_GET:            *(int *)arg = SIO_MODE_INT | SIO_MODE_POLL;            return (OK);	default:	    status = ENOSYS;	}    return (status);    }/********************************************************************************* m68360Int - handle an SCC interrupt** This routine gets called to handle SCC interrupts.*/void m68360Int    (    M68360_CHAN *pChan    )    {    char outChar;    FAST UINT16 dataLen = 0;    /* check for a receive event */    if (pChan->uart.pSccReg->scce & SCC_UART_SCCX_RX)	{        pChan->uart.pSccReg->scce = SCC_UART_SCCX_RX;	while (!(pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode &		 SCC_UART_RX_BD_EMPTY))	    {	    /* process all filled receive buffers */	    outChar = pChan->uart.rxBdBase[pChan->uart.rxBdNext].dataPointer[0];            pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode |=                SCC_UART_RX_BD_EMPTY;            /* incr BD count */            pChan->uart.rxBdNext = (pChan->uart.rxBdNext + 1) %                                  pChan->uart.rxBdNum;            /* acknowledge interrupt */            pChan->uart.pSccReg->scce = SCC_UART_SCCX_RX;	    (*pChan->putRcvChar) (pChan->putRcvArg,outChar);	    if (pChan->channelMode == SIO_MODE_POLL)		break;	    }	}    /* check for a transmit event and if a character needs to be output */    if ( (pChan->uart.pSccReg->scce & SCC_UART_SCCX_TX) &&         (pChan->channelMode != SIO_MODE_POLL) )	{        pChan->uart.pSccReg->scce = SCC_UART_SCCX_TX;            if ((*pChan->getTxChar) (pChan->getTxArg, &outChar) == OK)	    {	    do	        {	        pChan->uart.txBdBase[pChan->uart.txBdNext].dataPointer[dataLen++]		    = outChar;                if (pChan->channelMode == SIO_MODE_POLL)                    break;	        }	    while ((dataLen < pChan->uart.txBufSize) &&                   ((*pChan->getTxChar) (pChan->getTxArg, &outChar)		       == OK));	    pChan->uart.txBdBase[pChan->uart.txBdNext].dataLength  = dataLen;            /* acknowledge interrupt */            pChan->uart.pSccReg->scce = SCC_UART_SCCX_TX;	    /* send transmit buffer */	    pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode |=	        SCC_UART_TX_BD_READY;	    /* incr BD count */ 	    pChan->uart.txBdNext = (pChan->uart.txBdNext+ 1) % pChan->uart.txBdNum;	    }	}    /* acknowledge all other interrupts - ignore events */    pChan->uart.pSccReg->scce = (pChan->uart.pSccReg->scce & ~(SCC_UART_SCCX_RX |                               SCC_UART_SCCX_TX));    *M360_CPM_CISR(pChan->regBase) = pChan->uart.intMask;    }/********************************************************************************* m68360Startup - transmitter startup routine*/static int m68360Startup    (    M68360_CHAN *pChan		/* ty device to start up */    )    {    char outChar;    FAST UINT16 dataLen = 0;    if (pChan->channelMode == SIO_MODE_POLL)	return (ENOSYS);    /* check if buffer is ready and if a character needs to be output */    if ((!(pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode &	   SCC_UART_TX_BD_READY)) &&        ((*pChan->getTxChar) (pChan->getTxArg, &outChar) == OK))	{	do	    {	    pChan->uart.txBdBase[pChan->uart.txBdNext].dataPointer[dataLen++] =		outChar;	    }	while ((dataLen < pChan->uart.txBufSize) &&               ((*pChan->getTxChar) (pChan->getTxArg, &outChar)               == OK));	/* fill buffer */	/* send transmit buffer */	pChan->uart.txBdBase[pChan->uart.txBdNext].dataLength  = dataLen;	pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode |=	    SCC_UART_TX_BD_READY;	/* incr BD count */        pChan->uart.txBdNext = (pChan->uart.txBdNext + 1) % pChan->uart.txBdNum;	}    return (OK);    }/******************************************************************************** m68360PollInput - poll the device for input.** RETURNS: OK if a character arrived, ERROR on device error, EAGAIN*          if the input buffer is empty.*/static int m68360PollInput    (    SIO_CHAN *   pSioChan,    char *      thisChar    )    {    M68360_CHAN * pChan = (M68360_CHAN *)pSioChan;    if ( !(pChan->uart.pSccReg->scce & SCC_UART_SCCX_RX) )        return (EAGAIN);     if (pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode &	 SCC_UART_RX_BD_EMPTY)        return (EAGAIN);    /* get a character */    *thisChar = pChan->uart.rxBdBase[pChan->uart.rxBdNext].dataPointer[0];    /* set the empty bit */    pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode |=                SCC_UART_RX_BD_EMPTY;    /* incr BD count */    pChan->uart.rxBdNext = (pChan->uart.rxBdNext + 1) %                                  pChan->uart.rxBdNum;    /* only clear RX event if no more characters are ready */    if (pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode &         SCC_UART_RX_BD_EMPTY)        pChan->uart.pSccReg->scce = SCC_UART_SCCX_RX;    return (OK);    }/******************************************************************************** m68360PollOutput - output a character in polled mode.** RETURNS: OK if a character arrived, ERROR on device error, EAGAIN*          if the output buffer if full.*/static int m68360PollOutput    (    SIO_CHAN *   pSioChan,    char        outChar    )    {    M68360_CHAN * pChan = (M68360_CHAN *)pSioChan;    /* is the transmitter ready to accept a character? */    if (pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode &	SCC_UART_TX_BD_READY)	return(EAGAIN);    /* reset the transmitter status bit */    pChan->uart.pSccReg->scce = SCC_UART_SCCX_TX;    /* write out the character */    pChan->uart.txBdBase[pChan->uart.txBdNext].dataPointer[0] = outChar;    pChan->uart.txBdBase[pChan->uart.txBdNext].dataLength  = 1;    /* send transmit buffer */    pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode |=							SCC_UART_TX_BD_READY;    pChan->uart.txBdNext = (pChan->uart.txBdNext + 1) % pChan->uart.txBdNum;    return (OK);    }/******************************************************************************** m68360CallbackInstall - install ISR callbacks to get put chars.*/static int m68360CallbackInstall    (    SIO_CHAN *  pSioChan,    int         callbackType,    STATUS      (*callback)(),    void *      callbackArg    )    {    M68360_CHAN * pChan = (M68360_CHAN *)pSioChan;    switch (callbackType)        {        case SIO_CALLBACK_GET_TX_CHAR:            pChan->getTxChar    = callback;            pChan->getTxArg     = callbackArg;            return (OK);        case SIO_CALLBACK_PUT_RCV_CHAR:            pChan->putRcvChar   = callback;            pChan->putRcvArg    = callbackArg;            return (OK);        default:            return (ENOSYS);        }    }

⌨️ 快捷键说明

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