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