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

📄 m8260smc.c

📁 该源码为mpc8248处理器的BSP
💻 C
📖 第 1 页 / 共 2 页
字号:
            break;    case SIO_AVAIL_MODES_GET:            *(int *)arg = SIO_MODE_INT | SIO_MODE_POLL;            break;    default:            status = ENOSYS;    }    return (status);}/*********************************************************************************** m8260SmcInt - handle an SMC interrupt** This routine is called to handle SMC interrupts.**********************************************************************************/void m8260SmcInt    (    M8260_SMC_CHAN *pChan    ){    char        outChar;    FAST UINT16     dataLen = 0;    CACHE_PIPE_FLUSH ();    /* check for a receive event */    if (pChan->uart.pSmcReg->smce & M8260_SMCE_UART_RX_EVENT)    {        CACHE_PIPE_FLUSH ();        pChan->uart.pSmcReg->smce = M8260_SMCE_UART_RX_EVENT;   /* clear event,by kyf */        CACHE_PIPE_FLUSH();        while (!(pChan->uart.rxBdBase [pChan->uart.rxBdNext].statusMode &         BD_RX_EMPTY_BIT))        {            /* process all filled receive buffers */            CACHE_PIPE_FLUSH();            outChar = pChan->uart.rxBdBase[pChan->uart.rxBdNext].dataPointer[0];            CACHE_PIPE_FLUSH();            pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode |=                BD_RX_EMPTY_BIT;            /* incr BD count */            pChan->uart.rxBdNext = (pChan->uart.rxBdNext + 1) %                                  pChan->uart.rxBdNum;            /* acknowledge interrupt ??? multiple events ??? */            pChan->uart.pSmcReg->smce = M8260_SMCE_UART_RX_EVENT;            (*pChan->putRcvChar) (pChan->putRcvArg,outChar);            CACHE_PIPE_FLUSH ();            if (pChan->channelMode == SIO_MODE_POLL)    /* why not put it ahead? by kyf? */                break;        }    }    /* check for a transmit event and if a character needs to be output */    CACHE_PIPE_FLUSH ();    if ((pChan->uart.pSmcReg->smce & M8260_SMCE_UART_TX_EVENT) &&        (pChan->channelMode != SIO_MODE_POLL))      /* but the previous "rec" function has not this check? by kyf? */    {        CACHE_PIPE_FLUSH();        pChan->uart.pSmcReg->smce = M8260_SMCE_UART_TX_EVENT;        CACHE_PIPE_FLUSH();        if ((*pChan->getTxChar) (pChan->getTxArg, &outChar) == OK)        {            do            {                pChan->uart.txBdBase[pChan->uart.txBdNext].dataPointer[dataLen++]                            = outChar;                CACHE_PIPE_FLUSH ();                if (pChan->channelMode == SIO_MODE_POLL)                    break;            }while ((dataLen < pChan->uart.txBufSize) &&                   ((*pChan->getTxChar) (pChan->getTxArg, &outChar)                    == OK));            CACHE_PIPE_FLUSH();            pChan->uart.txBdBase[pChan->uart.txBdNext].dataLength = dataLen;            /* acknowledge interrupt */            pChan->uart.pSmcReg->smce = M8260_SMCE_UART_TX_EVENT;            /* send transmit buffer */            pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode |=                        BD_TX_READY_BIT;            /* incr BD count */            pChan->uart.txBdNext = (pChan->uart.txBdNext+ 1) %                            pChan->uart.txBdNum;            CACHE_PIPE_FLUSH ();        }    }    /* acknowledge all other interrupts - ignore events */    pChan->uart.pSmcReg->smce = (pChan->uart.pSmcReg->smce &        /* should write "1" to clear events,by kyf */                            ~(M8260_SMCE_UART_RX_EVENT | M8260_SMCE_UART_TX_EVENT));    CACHE_PIPE_FLUSH();    * M8260_SIPNR_L(pChan->regBase) = pChan->uart.intMask;    CACHE_PIPE_FLUSH ();}/*********************************************************************************** m8260SmcStartup - transmitter startup routine**********************************************************************************/static void m8260SmcStartup    (    M8260_SMC_CHAN *pChan       /* ty device to start up */    ){    char outChar;    FAST UINT16 dataLen = 0;    if (pChan->channelMode == SIO_MODE_POLL)    return;    CACHE_PIPE_FLUSH ();    /* check if buffer is ready and if a character needs to be output */    if ((!(pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode &       BD_TX_READY_BIT)) &&        ((*pChan->getTxChar) (pChan->getTxArg, &outChar) == OK))    {        do        {        CACHE_PIPE_FLUSH ();        pChan->uart.txBdBase[pChan->uart.txBdNext].dataPointer[dataLen++] =        outChar;        CACHE_PIPE_FLUSH ();        }        while ((dataLen < pChan->uart.txBufSize) &&               ((*pChan->getTxChar) (pChan->getTxArg, &outChar) == OK));                                /* fill buffer */        CACHE_PIPE_FLUSH ();        /* send transmit buffer */        pChan->uart.txBdBase[pChan->uart.txBdNext].dataLength  = dataLen;        pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode |= BD_TX_READY_BIT;        /* incr BD count */        pChan->uart.txBdNext = (pChan->uart.txBdNext + 1) % pChan->uart.txBdNum;        CACHE_PIPE_FLUSH ();    }}/*********************************************************************************** m8260SmcPollInput - poll the device for input.** RETURNS: OK if a character arrived, ERROR on device error, EAGAIN*          if the input buffer is empty.**********************************************************************************/static int m8260SmcPollInput    (    SIO_CHAN *  pSioChan,    char *  thisChar    ){    M8260_SMC_CHAN * pChan = (M8260_SMC_CHAN *) pSioChan;    CACHE_PIPE_FLUSH ();    if (!(pChan->uart.pSmcReg->smce & M8260_SMCE_UART_RX_EVENT))        return (EAGAIN);    CACHE_PIPE_FLUSH ();    if (pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode & BD_RX_EMPTY_BIT)        return (EAGAIN);    /* get a character */    *thisChar = pChan->uart.rxBdBase[pChan->uart.rxBdNext].dataPointer[0];    CACHE_PIPE_FLUSH ();    /* set the empty bit */    pChan->uart.rxBdBase[pChan->uart.rxBdNext].statusMode |= BD_RX_EMPTY_BIT;    /* 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 & BD_RX_EMPTY_BIT)    {        CACHE_PIPE_FLUSH ();        pChan->uart.pSmcReg->smce = M8260_SMCE_UART_RX_EVENT;        CACHE_PIPE_FLUSH ();    }    return (OK);}/*********************************************************************************** m8260SmcPollOutput - 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 m8260SmcPollOutput    (    SIO_CHAN *  pSioChan,    char    outChar    ){    M8260_SMC_CHAN *    pChan = (M8260_SMC_CHAN *) pSioChan;    int         i;    /* wait a bit for the last character to get out */    /* because the PPC604 is a very fast processor */    /* why not make the value "10000" a #define?, kyf */    i = 0;    while( (i<10000) && (pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode &    BD_TX_READY_BIT) )    {        i = i + 1;    }    /* is the transmitter ready to accept a character? */    /* if still not, we have a problem */    if (pChan->uart.txBdBase[pChan->uart.txBdNext].statusMode &            BD_TX_READY_BIT)        return(EAGAIN);    /* reset the transmitter status bit */    CACHE_PIPE_FLUSH ();    pChan->uart.pSmcReg->smce = M8260_SMCE_UART_TX_EVENT;    /* 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 |= BD_TX_READY_BIT;    pChan->uart.txBdNext = (pChan->uart.txBdNext + 1) % pChan->uart.txBdNum;    CACHE_PIPE_FLUSH ();    return (OK);}/*********************************************************************************** m8260SmcCallbackInstall - install ISR callbacks to get put chars.**********************************************************************************/static int m8260SmcCallbackInstall    (    SIO_CHAN *  pSioChan,    int     callbackType,    STATUS  (* callback)(),    void *  callbackArg    ){    M8260_SMC_CHAN * pChan = (M8260_SMC_CHAN *) pSioChan;    CACHE_PIPE_FLUSH ();    switch (callbackType)        {        case SIO_CALLBACK_GET_TX_CHAR:            pChan->getTxChar    = callback;            pChan->getTxArg     = callbackArg;            return (OK);        break;        case SIO_CALLBACK_PUT_RCV_CHAR:            pChan->putRcvChar   = callback;            pChan->putRcvArg    = callbackArg;            return (OK);        break;        default:            return (ENOSYS);        }}

⌨️ 快捷键说明

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