📄 net_nic.c
字号:
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 + -