📄 net_nic.c
字号:
DM9000A_EMAC_RxDis(); /* Disable the EMAC receiver */
CPU_CRITICAL_ENTER();
NetNIC_WrReg_8(DM9000A_GPR, GPR_PHYPU); /* Power up the PHY */
CPU_CRITICAL_EXIT();
NetBSP_DlyU(5);
DM9000A_Reset(); /* Reset the DM9000A */
DM9000A_Reset(); /* Reset the DM9000A */
CPU_CRITICAL_ENTER();
NetNIC_WrReg_8(DM9000A_GPR, GPR_PHYPD); /* Power down the PHY */
NetNIC_WrReg_8(DM9000A_GPR, GPR_PHYPU); /* Power up the PHY */
CPU_CRITICAL_EXIT();
DM9000A_PHY_SetMode(DM9000A_AUTO, perr); /* Activate PHY */
/* Init MAC Address */
CPU_CRITICAL_ENTER();
#if (EMAC_CFG_MAC_ADDR_SEL == EMAC_CFG_MAC_ADDR_SEL_EEPROM) /* Fetch MAC from EEPROM */
for (i = 0; i < 6; i++) {
NetIF_MAC_Addr[i] = NetNIC_RdReg_8(DM9000A_PAR0 + i);
}
#else /* MAC address is application-configured. */
for (i = 0; i < 6; i++) {
NetNIC_WrReg_8(DM9000A_PAR0 + i, NetIF_MAC_Addr[i]);
}
#endif
NetIF_MAC_AddrValid = DEF_YES;
NetNIC_WrReg_8(DM9000A_ISR, ISR_ALL); /* Clear interrupts (0xFE) */
/* SRAM pointer returns auto. to start */
NetNIC_WrReg_8(DM9000A_IMR, IMR_PAR); /* and disable all interrupts (0xFF[7]) */
#ifdef DM9000A_USE_FLOWCONTROL
/* Configure flow control: */
NetNIC_WrReg_8(DM9000A_BPTR, BPTR_BPHW(3) | BPTR_JPT_200u); /* . . .Set overflow threshold (0x08) */
NetNIC_WrReg_8(DM9000A_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8)); /* . . .Set flow control low/high thresholds (0x09) */
NetNIC_WrReg_8(DM9000A_FCR, FCR_TXPEN | FCR_FLCE); /* . . .Enable flow control (0x0A) */
#endif
CPU_CRITICAL_EXIT();
DM9000A_EMAC_RxEn(); /* Enable the EMAC receiver */
i = 100; /* 3 Retries to see if Auto Negotiation is complete */
reg_val = NetNIC_PhyRegRd(DM9000A_PHY_BMSR, DM9000A_PHY, perr) /* Read the AutoNeg from the PHY register #1 */
& PHY_BMSR_AN_COMP;
while ((reg_val != 0) && i != 0) { /* Wait until AUTONEG_COMP bit is set */
NetBSP_DlyM(5); /* Wait 5ms between retries */
reg_val = NetNIC_PhyRegRd(DM9000A_PHY_BMSR, DM9000A_PHY, perr) /* Read the link status from the PHY register */
& PHY_BMSR_AN_COMP;
i--;
}
if (i == 0) { /* If we are out of retires, and not linked ... */
*perr = NET_NIC_ERR_NIC_OFF; /* Set the return error to 'link down' */
return;
}
NetNIC_ConnStatus = DEF_ON; /* Regardless of the actual link state, inform the */
/* stack that the link is up so that it will be ready */
/* to transmit and receive packets when the comes up */
*perr = NET_NIC_ERR_NONE; /* If we made it this far, then no fatal errors */
}
/*
*********************************************************************************************************
* DM9000A_Restart()
*
* Description : (1) Initialize & start DM9000 (see DM9000A_Start())
* (2) Initialize interrupts
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : DM9000A_EMAC_RxPktGetSize().
*
* Note(s) : none.
*
*********************************************************************************************************
*/
static void DM9000A_Restart (NET_ERR *perr)
{
NetBSP_IntDis(); /* Disable interrupts from NIC */
NetNIC_ConnStatus = DEF_OFF;
DM9000A_Start(perr); /* Startup the DM9000A */
if (*perr != NET_NIC_ERR_NONE) {
return;
}
NetBSP_IntEn(); /* Enable interrupts from NIC */
#if DM9000A_TX_QUEUE_MODE == DM9000A_TX_QUEUE_TWO_PACKETS
NetNIC_TxNQueued = 0; /* No packets are currently queued. */
NetNIC_TxLenQueued = 0; /* Length value is not valid. */
#endif
NetNIC_IntEn(perr); /* Enable DM9000A interrupts */
}
/*
*********************************************************************************************************
* DM9000A_PHY_SetMode()
*
* Description : Sets the PHY media mode and enables phy.
*
* Argument(s) : mode is the phy media mode
* perr is a pointer to a NET_ERR object
*
* Return(s) : none.
*
* Caller(s) : DM9000A_Init().
*********************************************************************************************************
*/
static void DM9000A_PHY_SetMode (CPU_INT32U mode, NET_ERR *perr)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_CRITICAL_ENTER();
NetNIC_WrReg_8(DM9000A_GPCR, GPR_PHYPD); /* Powerdown PHY */
NetNIC_WrReg_8(DM9000A_GPR, GPR_PHYPU); /* Powerup PHY */
CPU_CRITICAL_EXIT();
switch (mode) {
case DM9000A_10MHD:
NetNIC_PhyRegWr(DM9000A_PHY_ANAR, DM9000A_PHY, 0x0021, perr); /* Set PHY media mode */
NetNIC_PhyRegWr(DM9000A_PHY_BMCR, DM9000A_PHY, 0x0000, perr);
break;
case DM9000A_10MFD:
NetNIC_PhyRegWr(DM9000A_PHY_ANAR, DM9000A_PHY, 0x0041, perr);
NetNIC_PhyRegWr(DM9000A_PHY_BMCR, DM9000A_PHY, 0x1100, perr);
break;
case DM9000A_100MHD:
NetNIC_PhyRegWr(DM9000A_PHY_ANAR, DM9000A_PHY, 0x0081, perr);
NetNIC_PhyRegWr(DM9000A_PHY_BMCR, DM9000A_PHY, 0x2000, perr);
break;
case DM9000A_100MFD:
NetNIC_PhyRegWr(DM9000A_PHY_ANAR, DM9000A_PHY, 0x0101, perr);
NetNIC_PhyRegWr(DM9000A_PHY_BMCR, DM9000A_PHY, 0x3100, perr);
break;
case DM9000A_AUTO:
default:
NetNIC_PhyRegWr(DM9000A_PHY_ANAR, DM9000A_PHY, 0x01E1, perr);
NetNIC_PhyRegWr(DM9000A_PHY_BMCR, DM9000A_PHY, 0x1200, perr);
break;
}
}
/*
*********************************************************************************************************
* NetNIC_IntEn()
*
* Description : Enable NIC interrupts.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : Net_Init().
*********************************************************************************************************
*/
void NetNIC_IntEn (NET_ERR *perr)
{
DM9000A_EMAC_TxIntEn();
DM9000A_EMAC_RxIntEn();
*perr = NET_NIC_ERR_NONE;
}
/*
*********************************************************************************************************
* DM9000A_EMAC_RxIntEn()
*
* Description : Enable DM9000A EMAC Receiver Interrupts.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : NetNIC_IntEn().
*
* Note(s) : none.
*********************************************************************************************************
*/
static void DM9000A_EMAC_RxIntEn (void)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_INT16U reg_val;
CPU_CRITICAL_ENTER(); /* See 'DM9000 REGISTERS Note #5b'. */
reg_val = NetNIC_RdReg_8(DM9000A_IMR);
reg_val |= IMR_PRI /* Enable packet received interrupt */
| IMR_ROI /* Enable receive overflow interrupt */
| IMR_ROOI; /* Enable receive overflow counter overflow interrupt */
NetNIC_WrReg_8(DM9000A_IMR, reg_val);
CPU_CRITICAL_EXIT();
}
/*
*********************************************************************************************************
* DM9000A_EMAC_TxIntEn()
*
* Description : Enable DM9000A EMAC Transmit Interrupts.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : NetNIC_IntEn().
*********************************************************************************************************
*/
static void DM9000A_EMAC_TxIntEn (void)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_INT08U reg_val;
CPU_CRITICAL_ENTER(); /* See 'DM9000 REGISTERS Note #5b'. */
reg_val = NetNIC_RdReg_8(DM9000A_IMR);
reg_val |= IMR_PTI; /* Enable packet transmitted interrupt */
NetNIC_WrReg_8(DM9000A_IMR, reg_val);
CPU_CRITICAL_EXIT();
}
/*
*********************************************************************************************************
* DM9000A_EMAC_RxEn()
*
* Description : Enable DM9000A EMAC Receiver.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : DM9000A_EMAC_Init().
*********************************************************************************************************
*/
static void DM9000A_EMAC_RxEn (void)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_CRITICAL_ENTER();
NetNIC_WrReg_8(DM9000A_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN); /* RX enable */
CPU_CRITICAL_EXIT();
}
/*
*********************************************************************************************************
* DM9000A_EMAC_RxDis()
*
* Description : Disable DM9000A EMAC Receiver.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : DM9000A_EMAC_Init().
*********************************************************************************************************
*/
static void DM9000A_EMAC_RxDis (void)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -