📄 net_nic.c
字号:
* 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) { /* If init NOT complete, exit tx (see Note #1). */
*perr = NET_ERR_INIT_INCOMPLETE;
return;
}
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED) /* --------------------- VALIDATE PTR -------------------- */
if (ppkt == (void *)0) {
NetNIC_TxPktDiscard(perr);
return;
}
#endif
EMAC_TxPkt(ppkt, size, perr); /* Hardware transmit routine */
if (*perr != NET_NIC_ERR_NONE) {
NetNIC_TxPktDiscard(perr);
return;
}
NET_CTR_STAT_INC(NetNIC_StatTxPktCtr);
}
/*
*********************************************************************************************************
* NetNIC_TxPktDiscard()
*
* Description : On any Transmit errors, set error.
*
* Argument(s) : pbuf Pointer to network buffer.
*
* perr Pointer to variable that will hold the return error code from this function :
*
* NET_ERR_TX Transmit error; packet discarded.
*
* Return(s) : none.
*
* Caller(s) : NetNIC_TxPkt().
*********************************************************************************************************
*/
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;
}
/*
*********************************************************************************************************
*********************************************************************************************************
* PHY FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NetNIC_PhyRegRd()
*
* Description : Read PHY data value.
*
* Argument(s) : phy PHY address, normally 0.
* reg PHY register.
*
* perr Pointer to variable that will hold the return error code from this function :
*
* NET_NIC_ERR_NONE Physical register successfully read.
*
* Return(s) : Data read from PHY register.
*
* Caller(s) : NetNIC_PhyInit(),
* NetNIC_PhyISR_Handler().
*
* Note(s) : Register ALWAYS reads 16-bit data values.
*********************************************************************************************************
*/
CPU_INT16U NetNIC_PhyRegRd (CPU_INT08U phy,
CPU_INT08U reg,
NET_ERR *perr)
{
while ((MACMCTL & MACMCTL_START) > 0) {
;
}
MACMADD = 0x0000;
MACMCTL = (reg << 3) | MACMCTL_START;
while ((MACMCTL & MACMCTL_START) > 0) {
;
}
*perr = NET_PHY_ERR_NONE;
return (MACMRXD & 0x0000FFFF);
}
/*
*********************************************************************************************************
* NetNIC_PhyRegWr()
*
* Description : Write PHY data value.
*
* Argument(s) : phy PHY address, normally 0.
* reg PHY register.
* val Data to write to PHY register.
*
* perr Pointer to variable that will hold the return error code from this function :
*
* NET_NIC_ERR_NONE Physical register successfully written.
*
* Return(s) : none.
*
* Caller(s) : NetNIC_PhyInit(),
* NetNIC_PhyISR_Handler().
*
* Note(s) : Register ALWAYS writes 16-bit data values.
*********************************************************************************************************
*/
void NetNIC_PhyRegWr (CPU_INT08U phy,
CPU_INT08U reg,
CPU_INT16U val,
NET_ERR *perr)
{
while ((MACMCTL & MACMCTL_START) != 0) {
;
}
MACMADD = 0x0000;
MACMTXD = (val & 0xFFFF);
MACMCTL = (reg << 3) | MACMCTL_WRITE | MACMCTL_START;
while ((MACMCTL & MACMCTL_START) != 0) {
;
}
*perr = NET_PHY_ERR_NONE;
}
/*
*********************************************************************************************************
*********************************************************************************************************
* LOCAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* EMAC_Init()
*
* Description : (1) Initialize the LM3Snnnn integrated EMAC
*
* (a) Disable interrupts
* (b) Initialize MAC address
* (c) Initialize PHY
* (d) Initialize MAC
* (e) Enable Receiver/Transmitter
*
* Argument(s) : perr a return error code indicating the result of initialization
* NET_NIC_ERR_NONE - success
* NET_NIC_ERR_NIC_OFF - link is down, or init failure occured
*
* Return(s) : none.
*
* Caller(s) : NetNIC_Init().
*
* Note(s) : (1) (a) Assumes MAC address to set has previously been initialized by
* (1) Application code for EMAC_MAC_ADDR_SEL_CFG
*
* (2) Interrupts MUST be enabled ONLY after ALL network initialization is complete (see also
* 'net.c Net_Init() Note #4d').
*
* (3) Interrupts are enabled by uC/TCP-IP, Net_Init() calling NetNIC_IntEn().
*
*********************************************************************************************************
*/
static void EMAC_Init (NET_ERR *perr)
{
CPU_INT32U reg_val;
CPU_INT32U div;
/* ------------ Reset and configure the EMAC -------------- */
*perr = NET_NIC_ERR_NONE; /* Initialize the returned error code to NO Error */
if (SysCtlPeripheralPresent(SYSCTL_PERIPH_ETH) == DEF_FALSE) {
*perr = EMAC_ERR_NO_EMAC;
NetNIC_ConnStatus = DEF_OFF;
}
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH); /* Enable the ethernet periphereal */
NetBSP_PHY_HW_Init(); /* Initialize the HW for the LEDs */
#ifdef SYSCTL_PERIPH_PHY
if (SysCtlPeripheralPresent(SYSCTL_PERIPH_PHY) == DEF_TRUE) {
SysCtlPeripheralEnable(SYSCTL_PERIPH_PHY); /* Enable the PHY periphereal */
}
SysCtlPeripheralReset( SYSCTL_PERIPH_PHY);
#endif
MACIM = 0; /* Disable all interrupts */
reg_val = MACIS; /* Clear any interrupts */
MACIS = reg_val;
/* Initialize clock divider */
div = (SysCtlClockGet() / 2) / 2500000;
MACMDV = (div & MACMDV_DIV);
#if EMAC_CFG_MAC_ADDR_SEL == EMAC_CFG_MAC_ADDR_SEL_CFG /* Set MAC address, if so configured */
MACIA0 = (NetIF_MAC_Addr[3] << 24)
| (NetIF_MAC_Addr[2] << 16)
| (NetIF_MAC_Addr[1] << 8)
| (NetIF_MAC_Addr[0] );
MACIA1 = (NetIF_MAC_Addr[5] << 8)
| (NetIF_MAC_Addr[4] );
#endif
NetNIC_PhyInit(perr); /* ---------------- Initialize the PHY -------------------- */
/* -------- Configure the transmitter and receiver -------- */
MACTCTL = MACTCTL_PADEN /* Configure EMAC receiver */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -