⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_nic.c

📁 ucos下的dm9000EP的tcp-ip驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
*********************************************************************************************************
*                                         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 + -