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

📄 net_nic.c

📁 从Luminary官方网站下载的LM3S6000系列的UCos+Tcp/IP的源码, 经本人稍微修改后可直接在IAR6.2下编译通过,里面包括了LM3S6000系列的所有外设UART, PWn....
💻 C
📖 第 1 页 / 共 4 页
字号:
             | MACTCTL_DUPLEX
             | MACTCTL_CRC;
    MACRCTL  = MACRCTL_BADCRC;                                          /* Configure EMAC transmitter                               */

                                                                        /* -------- Enable the transmitter and receiver ----------- */
    MACRCTL |= MACRCTL_RSTFIFO;                                         /* Reset the EMAC FIFO                                      */
    MACRCTL |= MACRCTL_RXEN;                                            /* Enable receiver                                          */
    MACTCTL |= MACTCTL_TXEN;                                            /* Enable transmitter                                       */
    MACRCTL |= MACRCTL_RSTFIFO;                                         /* Reset the EMAC FIFO                                      */

   *perr     = NET_NIC_ERR_NONE;                                        /* NO error, if we made it this far                         */
}

/*
*********************************************************************************************************
*                                 EMAC_RxIntDis() & EMAC_RxIntDis()
*
* Description : Disable EMAC Receiver and Transmitter.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : EMAC_Init(),
*               NetNIC_ISR_Handler().
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  EMAC_RxIntDis (void)
{
    MACIM &= ~(MACIM_RXINTM | MACIM_FOVM | MACIM_RXERM);
}

static  void  EMAC_RxIntEn (void)
{
    MACIM |=   MACIM_RXINTM | MACIM_FOVM | MACIM_RXERM;
}

/*
*********************************************************************************************************
*                                        EMAC_RxPkt()
*
* Description : (1) Read network packet from NIC into buffer:
*
*                   (a) Check if packet is avaialble.
*                   (b) Read network packet from FIFO into buffer.
*                   (c) Check if another packet has been received.
*
* Argument(s) : ppkt        Pointer to memory buffer to receive NIC packet.
*               ----        Argument checked in NetNIC_RxPkt().
*
*               size        Number of packet frame octets to read into buffer.
*               ----        Argument checked in NetNIC_RxPkt().
*
*               perr        Pointer to variable that will hold the return error code from this function :
*
*                               NET_NIC_ERR_NONE                Packet successfully transmitted.
*                               NET_ERR_RX                      Error Reading Buffers (EOF not found)
*
* Return(s)   : none.
*
* Caller(s)   : NetNIC_RxPkt().
*********************************************************************************************************
*/

static  void  EMAC_RxPkt (void        *ppkt,
                          CPU_INT16U   size,
                          NET_ERR     *perr)
{
              CPU_INT08U   *p8;
    volatile  CPU_INT32U    temp;
              CPU_INT32U    npkts;




    if ((MACNP & MACNP_NPR) == 0) {                                     /* There is no packet in the FIFO                           */
       *perr =  EMAC_ERR_RX_NO_PACKET;                                  /*  ... Assign error                                        */
        EMAC_RxIntEn();                                                 /*  ... Enable receive interrupts                           */
        return;
    }

    p8    = (CPU_INT08U *)ppkt;                                         /* Convert to pointer to 8-bit data                         */

   *p8++  = (EMAC_DataTemp & 0xFF);                                     /* Store first  byte of packet, saved in RxPktGetSize()     */
   *p8++  = EMAC_DataTemp >> 8;                                         /* Store second byte of packet, saved in RxPktGetSize()     */
    size -= 2;                                                          /* Decrement size                                           */


    while (size >= 4) {                                                 /* Store remainder of packet data                           */
        temp  = MACDATA;
       *p8++  = (temp      ) & 0x000000FF;
       *p8++  = (temp >>  8) & 0x000000FF;
       *p8++  = (temp >> 16) & 0x000000FF;
       *p8++  = (temp >> 24) & 0x000000FF;
        size -= 4;                                                      /* ... Decrement size                                       */
    }

    if (size > 0) {                                                     /* Store last bytes of packet data                          */
        temp     = MACDATA;                                             /* ... Read word from FIFO                                  */

        if (size == 3) {                                                /* ... If three bytes are left                              */
           *p8++ = (temp      ) & 0x000000FF;
           *p8++ = (temp >>  8) & 0x000000FF;
           *p8++ = (temp >> 16) & 0x000000FF;
        } else if (size == 2) {                                         /* ... If two bytes are left                                */
           *p8++ = (temp      ) & 0x000000FF;
           *p8++ = (temp >>  8) & 0x000000FF;
        } else {                                                        /* ... If one byte is left                                  */
           *p8++ = (temp      ) & 0x000000FF;
        }
    }

    temp  = MACDATA;                                                    /* Read FCS                                                 */

    npkts = (MACNP & MACNP_NPR);                                        /* Determine if packets remain to be read                   */

    if (npkts > 0) {                                                    /* If packets remain to be read                             */
        NetOS_IF_RxTaskSignal(perr);                                    /* ... Signal RX task                                       */
    } else {                                                            /* If no packets remain to be read                          */
        EMAC_RxIntEn();                                                 /* ... Enable receive interrupts                            */
    }

   *perr  = NET_NIC_ERR_NONE;                                           /* Assign error                                             */
}

/*
*********************************************************************************************************
*                                    EMAC_RxPktDiscard()
*
* Description : Discard network packet from EMAC receive FIFO to free EMAC FIFO for new receive packets.
*
* Argument(s) : size        Number of packet frame octets to discard.
*
* Return(s)   : none.
*
* Caller(s)   : NetNIC_RxPktDiscard().
*********************************************************************************************************
*/

void  EMAC_RxPktDiscard (CPU_INT16U  size)
{
    volatile  CPU_INT32U    temp;
              CPU_INT32U    npkts;
              NET_ERR       err;


    if (size == 0) {
        npkts = (MACNP & MACNP_NPR);                                    /* Determine if packets remain to be read                   */
        if (npkts > 0) {                                                /* If packets remain to be read                             */
            NetOS_IF_RxTaskSignal(&err);                                /* ... Signal RX task                                       */
        } else {                                                        /* If no packets remain to be read                          */
            EMAC_RxIntEn();                                             /* ... Enable receive interrupts                            */
        }
        return;
    }

    size += 2;                                                          /* Bytes to read = size + 4 (for FCS)                       */
                                                                        /*                      - 2 (for bytes read in RxPktGetSize)*/

    while (size >= 4) {                                                 /* Read out bytes of packet                                 */
        temp  = MACDATA;                                                /* ... Read word from FIFO                                  */
        size -= 4;                                                      /* ... Decrement size                                       */
    }

    if (size > 0) {                                                     /* If bytes remain                                          */
        temp  = MACDATA;                                                /* ... Read words from FIFO                                 */
    }

    npkts = (MACNP & MACNP_NPR);                                        /* Determine if packets remain to be read                   */

    if (npkts > 0) {                                                    /* If packets remain to be read                             */
        NetOS_IF_RxTaskSignal(&err);                                    /* ... Signal RX task                                       */
    } else {                                                            /* If no packets remain to be read                          */
        EMAC_RxIntEn();                                                 /* ... Enable receive interrupts                            */
    }
}

/*
*********************************************************************************************************
*                                        EMAC_TxPkt()
*
* Description : (1) Instruct LM3Snnnn EMAC to send network packet :
*
*                   (a) Check if EMAC transmit FIFO is available (i.e., if no  transmission is in
*                       progress).
*                   (b) Write packet into FIFO.
*                   (c) Inform EMAC that new packet is in FIFO.
*
* Argument(s) : ppkt        Pointer to memory buffer to transmit NIC packet.
*               ----        Argument checked in NetNIC_TxPkt().
*
*               size        Number of packet frame octets to write to frame.
*
*               perr        Pointer to variable that will hold the return error code from this function :
*
*                               NET_NIC_ERR_NONE                Packet successfully transmitted.
*                               EMAC_ERR_TX_BUSY                Transmitter not ready.
* Return(s)   : none.
*********************************************************************************************************
*/

static  void  EMAC_TxPkt (void        *ppkt,
                          CPU_INT16U   size,
                          NET_ERR     *perr)
{
              CPU_INT08U     *p8;
    volatile  CPU_INT32U      temp;


    if ((MACTR & MACTR_NEWTX) != 0) {
       *perr = EMAC_ERR_TX_BUSY;
        return;
    }

    p8       = (CPU_INT08U *)ppkt;                                      /* Convert to pointer to 8-bit data                         */
                                                                        /* Form first word of FIFO                                  */
    temp     = size - 14;                                               /* ... Stored length = size - 6 (for sender MAC)            */
                                                                        /*                          - 6 (for dest.  MAC)            */
                                                                        /*                          - 2 (for length/type code)      */
    temp    |= (*p8++ << 16);                                           /* ... Store first  byte of packet                          */
    temp    |= (*p8++ << 24);                                           /* ... Store second byte of packet                          */
    MACDATA  = temp;                                                    /* Write first word into FIFO                               */
    size    -= 2;                                                       /* Decrement size                                           */


    while (size >= 4) {                                                 /* Store remainder of packet                                */
        temp     = (*p8++      );
        temp    |= (*p8++ <<  8);
        temp    |= (*p8++ << 16);
        temp    |= (*p8++ << 24);
        MACDATA  = temp;

        size    -= 4;                                                   /* ... Decrease size                                        */
    }

    if (size > 0) {                                                     /* If more bytes remain                                     */
        temp      = 0;

        if (size == 3) {                                                /* ... If there are three bytes left                        */
            temp  = (*p8++      );
            temp |= (*p8++ <<  8);
            temp |= (*p8++ << 16);
        } else if (size == 2) {                                         /* ... If there are two   bytes left                        */
            temp  = (*p8++      );
            temp |= (*p8++ <<  8);
        } else if (size == 1) {                                         /* ... If there is  one   byte  left                        */
            temp  = (*p8++      );
        }

        MACDATA   = temp;                                               /* ... Write into FIFO                                      */
    }

    MACTR = MACTR_NEWTX;                                                /* Transmit packet                                          */
   *perr  = NET_NIC_ERR_NONE;                                           /* Assign error                                             */
}

⌨️ 快捷键说明

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