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

📄 net_nic.c

📁 在ST的ARM9上跑uCOS加uCTCPIP时要用的STR91X的内置网卡驱动
💻 C
📖 第 1 页 / 共 2 页
字号:

    if (Net_InitDone != DEF_YES) {             /* Ignore packet if we haven't completed stack init     */
        *perr = NET_ERR_INIT_INCOMPLETE;
        return;
    }

    ENET_HandleRxPkt(ppkt);

    NET_CTR_STAT_INC(NetNIC_StatRxPktCtr);
   *perr = NET_NIC_ERR_NONE;
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                        NetNIC_RxPktDiscard()
*
* Description : Discard network packet from NIC to free NIC packet frames for new receive packets.
*
* Argument(s) : size        Number of packet frame octets.
*
*               perr        Pointer to variable that will hold the return error code from this function :
*
*                               NET_NIC_ERR_NONE                Packet successfully discarded.
*                               NET_ERR_INIT_INCOMPLETE         Network initialization NOT complete.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_RxTaskHandler().
*********************************************************************************************************
*/

void  NetNIC_RxPktDiscard (CPU_INT16U   size,
                           NET_ERR     *perr)
{
#if ((NET_CTR_CFG_ERR_EN      == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR  cpu_sr = 0;
#endif


    if (Net_InitDone != DEF_YES) {
       *perr = NET_ERR_INIT_INCOMPLETE;
        return;
    }

    ENET_RxDscrInit();                         /* Re-initialize the Rx DMA descriptor                  */
                                               /* Initiate Rx DMA transfer                             */
    ENET_DMA->RXSTR = DMA_RX_START_RUNT | DMA_RX_START_FFAIL | DMA_RX_START_FETCH;

    NET_CTR_ERR_INC(NetNIC_ErrRxPktDiscardedCtr);

    *perr = NET_NIC_ERR_NONE;
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                             NetNIC_TxPkt()
*
* Description : Transmit data packets from network driver layer to network interface card.
*
* Argument(s) : ppkt        Pointer to memory buffer to transmit NIC packet.
*               ----        Argument validated in NetIF_Pkt_Tx().
*
*               size        Number of packet frame octets to write to frame.
*               ----        Argument checked   in NetIF_Tx().
*
*               perr        Pointer to variable that will hold the return error code from this function :
*
*                               NET_NIC_ERR_NONE                Packet successfully transmitted.
*                               NET_ERR_INIT_INCOMPLETE         Network initialization NOT complete.
*
*                                                               - RETURNED BY NetNIC_TxPktDiscard() : -
*                               NET_ERR_TX                      Transmit error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_Pkt_Tx().
*
* Note(s)     : (1) NetNIC_TxPkt() blocked until network initialization completes; perform NO action.
*********************************************************************************************************
*/

void  NetNIC_TxPkt (void        *ppkt,
                    CPU_INT16U   size,
                    NET_ERR     *perr)
{
#if ((NET_CTR_CFG_STAT_EN     == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR      cpu_sr;
#endif


    if (Net_InitDone != DEF_YES) {             /* Ignore packet if we haven't completed stack init.    */
        *perr = NET_ERR_INIT_INCOMPLETE;
        return;
    }

    ENET_TxPkt(ppkt, size);

    if (*perr != NET_NIC_ERR_NONE) {
        NetNIC_TxPktDiscard(perr);
        return;
    }

    NET_CTR_STAT_INC(NetNIC_StatTxPktCtr);
}

/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
*                                           LOCAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                       NetNIC_RxISR_Handler()
*
* Description : Signal Network Interface Receive Task that a receive packet is available.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : NetNIC_ISR_Handler().
*********************************************************************************************************
*/

void  NetNIC_RxISR_Handler (void)
{
    NET_ERR  err;


    NetOS_IF_RxTaskSignal(&err);

    switch (err) {
        case NET_IF_ERR_NONE:                  /* Clear the RX_CURR_DONE interrupt                     */
             ENET_DMA->ISR = 0x00008000;
             break;

        case NET_IF_ERR_RX_Q_FULL:
        case NET_IF_ERR_RX_Q_POST_FAIL:
        default:
             NetNIC_RxPktDiscard(0, &err);
             break;
    }
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                       NetNIC_TxISR_Handler()
*
* Description : Clear transmit interrupt &/or transmit errors :
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : NetNIC_ISR_Handler().
*********************************************************************************************************
*/

void  NetNIC_TxISR_Handler (void)
{
    ENET_DMA->ISR = 0x80000000;                /* Clear the TX_CURR_DONE interrupt                     */

    NetOS_NIC_TxRdySignal();
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                        NetNIC_TxPktDiscard()
*
* Description : If transmit errors occur, the packet should be discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetNIC_TxPkt().
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  NetNIC_TxPktDiscard (NET_ERR  *perr)
{
#if ((NET_CTR_CFG_ERR_EN      == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR  cpu_sr;
#endif


    NET_CTR_ERR_INC(NetNIC_ErrTxPktDiscardedCtr);

   *perr = NET_ERR_TX;
}

/*
*********************************************************************************************************
*                                              MAC_Init()
*
* Description: Perform initializations necessary to begin using the MAC/DMA Controller component.
*
* Arguments  : None
*
* Return(s)  : None
*********************************************************************************************************
*/

static  void  MAC_Init (void)
{
    SCU_APBPeriphClockConfig(__GPIO2, ENABLE);       /* Enable the appropriate devices' clock signals  */
    SCU_APBPeriphClockConfig(__GPIO5, ENABLE);
    SCU_APBPeriphClockConfig(__ENET,  ENABLE);

    SCU_APBPeriphReset(__GPIO2, DISABLE);            /* Remove the devices from reset state            */
    SCU_APBPeriphReset(__GPIO5, DISABLE);
    SCU_APBPeriphReset(__ENET,  DISABLE);

    NIC_Config.ReceiveALL              = DISABLE;
    NIC_Config.MIIPrescaler            = MIIPrescaler_1;
    NIC_Config.LoopbackMode            = DISABLE;
    NIC_Config.AddressFilteringMode    = MAC_Perfect_Muticast_Hash;
    NIC_Config.VLANFilteringMode       = VLANfilter_VLTAG;
    NIC_Config.PassWrongFrame          = DISABLE;
    NIC_Config.LateCollision           = ENABLE;
    NIC_Config.BroadcastFrameReception = ENABLE;
    NIC_Config.PacketRetry             = ENABLE;
    NIC_Config.RxFrameFiltering        = ENABLE;
    NIC_Config.AutomaticPadRemoval     = ENABLE;
    NIC_Config.DeferralCheck           = ENABLE;

    ENET_InitClocksGPIO();
    ENET_Init (PHY_FULLDUPLEX_100M);           /* Place the MAC in full duplex mode                    */
    ENET_MACControlConfig(&NIC_Config);
                                               /* Set the MAC address                                  */
    ENET_MAC->MAH  = ((CPU_INT32U)NetIF_MAC_Addr[4])        | (((CPU_INT32U)NetIF_MAC_Addr[5]) << 8);
    ENET_MAC->MAL  = ((CPU_INT32U)NetIF_MAC_Addr[0])        | (((CPU_INT32U)NetIF_MAC_Addr[1]) << 8)
                  | (((CPU_INT32U)NetIF_MAC_Addr[2]) << 16) | (((CPU_INT32U)NetIF_MAC_Addr[3]) << 24);

    ENET_MAC->MCHA = 0x00000000;
    ENET_MAC->MCLA = 0x00000000;
                                               /* Initialize the interrupt controller                  */
#if (NET_NIC_CFG_INT_CTRL_EN == DEF_ENABLED)
    NetNIC_IntInit();
#endif
}

⌨️ 快捷键说明

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