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

📄 net_nic.c

📁 从Luminary官方网站下载的LM3S6000系列的UCos+Tcp/IP的源码, 经本人稍微修改后可直接在IAR6.2下编译通过,里面包括了LM3S6000系列的所有外设UART, PWn....
💻 C
📖 第 1 页 / 共 4 页
字号:
*               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 + -