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

📄 net_nic.c

📁 DM9000A的网卡驱动
💻 C
📖 第 1 页 / 共 5 页
字号:


    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 + -