📄 net_nic.c
字号:
/*
*********************************************************************************************************
* 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().
*********************************************************************************************************
*/
static void NetNIC_TxPktDiscard (NET_ERR *perr)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
NET_CTR_ERR_INC(NetNIC_ErrTxPktDiscardedCtr);
*perr = NET_ERR_TX;
}
/*
*********************************************************************************************************
* NetNIC_TxPktPrepare()
*
* Description : Prepare to transmit data packets from network driver layer to network interface card.
*
* Argument(s) : ppkt Pointer to memory buffer to transmit NIC packet.
*
* 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.
* 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_TxPktPrepare() blocked until network initialization completes; perform NO action.
*********************************************************************************************************
*/
void NetNIC_TxPktPrepare (void *ppkt,
CPU_INT16U size,
NET_ERR *perr)
{
*perr = NET_NIC_ERR_NONE;
}
/*
*********************************************************************************************************
* 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
*
* Return(s) : Data read from PHY register.
*
* Caller(s) : DM9000EP_EMAC_Init()
*
* Note(s) : Register reads are ALWAYS 16-bit and performed 8 bits at a time.
*********************************************************************************************************
*/
CPU_INT16U NetNIC_PhyRegRd (CPU_INT08U phy,
CPU_INT08U reg,
NET_ERR *perr)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_INT16U reg_val;
CPU_CRITICAL_ENTER();
NetNIC_WrReg_8(DM9000EP_EPAR, phy | reg); /* Write PHY register offset into register (0x0C) */
NetNIC_WrReg_8(DM9000EP_EPCR, EPCR_ERPRR | EPCR_EPOS); /* Write PHY + READ command into register (0x0B) */
CPU_CRITICAL_EXIT();
NetBSP_DlyU(100);
CPU_CRITICAL_ENTER();
NetNIC_WrReg_8(DM9000EP_EPCR, EPCR_EPOS); /* Write PHY command into register (0x0B) */
reg_val = NetNIC_RdReg_8(DM9000EP_EPDRL); /* Read low byte from register (0x0D) */
reg_val |= NetNIC_RdReg_8(DM9000EP_EPDRH) << 8; /* Read high byte from register (0x0E) */
CPU_CRITICAL_EXIT();
*perr = NET_ERR_NONE;
return (reg_val);
}
/*
*********************************************************************************************************
* NetNIC_PhyRegWr()
*
* Description : Write PHY data value.
*
* Argument(s) : phy PHY address, depends on your hardware schematics.
* reg PHY register.
* val Data to write to PHY register.
* perr Pointer to variable that will hold the return error code from this function :
*
* Return(s) : None.
*
* Caller(s) : None.
*
* Note(s) : Register writes are ALWAYS 16-bit and performed 8 bits at a time.
*********************************************************************************************************
*/
void NetNIC_PhyRegWr (CPU_INT08U phy,
CPU_INT08U reg,
CPU_INT16U val,
NET_ERR *perr)
{
CPU_INT08U val_high;
CPU_INT08U val_low;
val_high = (CPU_INT08U)(val >> 8);
val_low = (CPU_INT08U)(val & 0x0F);
NetNIC_WrReg_8(DM9000EP_EPAR, phy | reg); /* Write PHY register offset into register (0x0C) */
NetNIC_WrReg_8(DM9000EP_EPDRH, val_high); /* Write high byte to register (0x0E) */
NetNIC_WrReg_8(DM9000EP_EPDRL, val_low); /* Write low byte to register (0x0D) */
NetNIC_WrReg_8(DM9000EP_EPCR, EPCR_EPOS | EPCR_ERPRW); /* Write PHY + WRITE command into register (0x0B) */
NetBSP_DlyU(500);
NetNIC_WrReg_8(DM9000EP_EPCR, EPCR_EPOS); /* Write PHY into register (0x0B) */
*perr = NET_ERR_NONE;
}
/*
*********************************************************************************************************
* NetNIC_ConnStatusGet()
*
* Description : Get NIC's network connection status.
*
* (1) Obtaining the NIC's network connection status is encapsulated in this function for the
* possibility that obtaining a NIC's connection status requires a non-trivial procedure.
*
*
* Argument(s) : None.
*
* Return(s) : NIC network connection status :
*
* DEF_OFF Network connection DOWN.
* DEF_ON Network connection UP.
*
* Caller(s) : NetIF_Pkt_Tx().
*********************************************************************************************************
*/
CPU_BOOLEAN NetNIC_ConnStatusGet (void)
{
return (NetNIC_ConnStatus);
}
/*
*********************************************************************************************************
* DM9000EP_Reset()
*
* Description : Reset the DM9000EP MAC registers ONLY. This function is called when a bus error occurs
* such that the DM9000 driver is no longer in synchronization with the frame data
* within the DM9000 SRAM. An example of this may occur when the driver attempts to
* check if another Rx frame is present in SRAM. Only 0x00 or 0x01 should be read
* from the DM9000. If another value is read, a synchronization error has occured.
* Argument(s) : None.
*
* Returns : None.
*
* Caller(s) : Various.
*
* Notes : This function enables the receiver, Rx and Tx interrupts and should not be called
* from DM9000EP_Init().
*********************************************************************************************************
*/
static void DM9000EP_Reset (void)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_CRITICAL_ENTER(); /* Global interrupts disabled, critical section below */
NetNIC_WrReg_8(DM9000EP_IMR, IMR_PAR); /* Disable interrupts */
NetNIC_WrReg_8(DM9000EP_ISR, ISR_ALL); /* Clear all DM9000 interrupt sources */
NetNIC_WrReg_8(DM9000EP_RCR, 0x00); /* Disable the receiver */
NetNIC_WrReg_8(DM9000EP_NCR, NCR_RST | NCR_LBK_MAC); /* Perform a reset, loopback enabled to internal MAC */
CPU_CRITICAL_EXIT(); /* Re-enable global interrupts, dont block high prio tasks */
NetBSP_DlyU(50); /* Delay for a short while (20uS required) */
CPU_CRITICAL_ENTER(); /* Global interrupts disabled, critical section below */
NetNIC_WrReg_8(DM9000EP_NCR, NCR_RST | NCR_LBK_MAC); /* Perform a reset, loopback enabled to internal MAC */
CPU_CRITICAL_EXIT(); /* Re-enable global interrupts, dont block high prio tasks */
NetBSP_DlyU(50); /* Delay for a short while (20uS required) */
CPU_CRITICAL_ENTER(); /* Disable interrupts to finish the reset procedure */
NetNIC_WrReg_8(DM9000EP_NCR, NCR_LBK_NORMAL); /* Put the NIC into Normal Operation Mode (no loopback) */
DM9000EP_EMAC_RxEn(); /* Re-enable the receiver (disabled after reset) */
CPU_CRITICAL_EXIT(); /* Re-enable global interrupts */
}
/*
*********************************************************************************************************
* DM9000EP_Info()
*
* Description : Return the values of the DM9000EP identification registers to confirm the presence
* of an appropriate chip.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : DM9000EP_Init().
*********************************************************************************************************
*/
static CPU_INT32U DM9000EP_Info (void)
{
CPU_INT32U id_val;
id_val = NetNIC_RdReg_8(DM9000EP_VIDL);
id_val |= NetNIC_RdReg_8(DM9000EP_VIDH) << 8;
id_val |= NetNIC_RdReg_8(DM9000EP_PIDL) << 16;
id_val |= NetNIC_RdReg_8(DM9000EP_PIDH) << 24;
return (id_val);
}
/*
*********************************************************************************************************
* DumpRegs()
*
* Description : Prints the content of all DM9000 internal registers (NIC and PHY) to the IAR console
*
* Argument(s) : none.
*
* Return(s) : none.
*********************************************************************************************************
*/
void DumpRegs (void)
{
CPU_INT16U reg_val;
CPU_INT16U i;
NET_ERR err;
printf("NIC Registers:\r\n");
for (i = 0x00; i <= 0x2F; i++) {
reg_val = NetNIC_RdReg_8(i);
printf("Reg Address %2X: Value: %2X\r\n", i, reg_val);
}
for (i = 0xF0; i <= 0xFF; i++) {
reg_val = NetNIC_RdReg_8(i);
printf("Reg Address %2X: Value: %2X\r\n", i, reg_val);
}
printf("\r\nPHY Registers:\r\n");
for (i = 0x00; i <= 0x06; i++) {
reg_val = NetNIC_PhyRegRd(DM9000EP_PHY, i, &err);
printf("Reg Address %2X: Value: %4X\r\n", i, reg_val);
}
for (i = 0x10; i <= 0x12; i++) {
reg_val = NetNIC_PhyRegRd(DM9000EP_PHY, i, &err);
printf("Reg Address %2X: Value: %4X\r\n", i, reg_val);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -