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

📄 net_nic.c

📁 基于UCOS的AtmelMACB926x驱动程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                                                                /* ---------------------- MACB_RSR bits ----------------------- */
#define  MACB_RSR_BNA                     DEF_BIT_00
#define  MACB_RSR_REC                     DEF_BIT_01
#define  MACB_RSR_OVR                     DEF_BIT_02

                                                                /* ---------------------- MACB_ISR bits ----------------------- */
                                                                /* ---------------------- MACB_IER bits ----------------------- */
                                                                /* ---------------------- MACB_IDR bits ----------------------- */
                                                                /* ---------------------- MACB_IMR bits ----------------------- */
#define  MACB_ISR_MFD                     DEF_BIT_00
#define  MACB_ISR_RCOMP                   DEF_BIT_01
#define  MACB_ISR_RXUBR                   DEF_BIT_02
#define  MACB_ISR_TXUBR                   DEF_BIT_03
#define  MACB_ISR_TUNDR                   DEF_BIT_04
#define  MACB_ISR_RLEX                    DEF_BIT_05
#define  MACB_ISR_TXERR                   DEF_BIT_06
#define  MACB_ISR_TCOMP                   DEF_BIT_07
#define  MACB_ISR_LINK                    DEF_BIT_09
#define  MACB_ISR_ROVR                    DEF_BIT_10
#define  MACB_ISR_HRESP                   DEF_BIT_11
#define  MACB_ISR_PFRE                    DEF_BIT_12
#define  MACB_ISR_PTZ                     DEF_BIT_13

                                                                /* ---------------------- MACB_MAN bits ----------------------- */
#define  MACB_MAN_CODE             ((CPU_INT32U)   0x02 << 16)  /* IEEE Code. MUST have value of 10.                            */
#define  MACB_MAN_RW               ((CPU_INT32U)   0x03 << 28)
#define  MACB_MAN_WRITE            ((CPU_INT32U)   0x01 << 28)  /* 01: Transfer is a write.                                     */
#define  MACB_MAN_READ             ((CPU_INT32U)   0x02 << 28)  /* 10: Transfer is a read.                                      */
#define  MACB_MAN_SOF              ((CPU_INT32U)   0x03 << 30)
#define  MACB_MAN_REGA(_x_)         (_x_         << 18)         /* Specifies the register in the PHY to access.                 */
#define  MACB_MAN_PHYA(_x_)        ((_x_ & 0x1F) << 23)         /* PHY address. Normally 0.                                     */
#define  MACB_MAN_DATA(_x_)         (_x_ & 0xFFFF)              /* PHY Read/Write Data Mask.                                    */

                                                                /* --------------------- MACB_USRIO bits ---------------------- */
#define  MACB_USRIO_RMII                  DEF_BIT_00            /* Reduce MII                                                   */
#define  MACB_USRIO_CLKEN                 DEF_BIT_01            /* Clock Enable                                                 */

                                                                /* ---------------------- MACB_WOL bits ----------------------- */
#define  MACB_WOL_IP                ((CPU_INT32U) 0xFFFF <<  0) /* ARP request IP address                                       */
#define  MACB_WOL_MAG               ((CPU_INT32U)      1 << 16) /* Magic packet event enable                                    */
#define  MACB_WOL_ARP               ((CPU_INT32U)      1 << 17) /* ARP request event enable                                     */
#define  MACB_WOL_SA1               ((CPU_INT32U)      1 << 18) /* Specific address register 1 event enable                     */


/*
*********************************************************************************************************
*                                              DATA TYPES
*********************************************************************************************************
*/

typedef struct {
    CPU_INT32U  addr;                                                   /* Address of RX buffer.                                */
    CPU_INT32U  status;                                                 /* Status of RX buffer.                                 */
}  NIC_BUF_DESC;

/*
*********************************************************************************************************
*                                               GLOBALS
*********************************************************************************************************
*/

NIC_BUF_DESC  *NIC_RxBufDescPtrStart;                                   /* Pointer to the aligned list of Rx buffer descriptors */
NIC_BUF_DESC  *NIC_RxBufDescPtrEnd;                                     /* Pointer to the END of the Rx descriptor list         */
NIC_BUF_DESC  *NIC_TxBufDescPtr;                                        /* Pointer to the only Tx buffer descriptor (aligned)   */

NIC_BUF_DESC  *NIC_CurrentFrameStart;                                   /* Pointer to the 1st descriptor for the current frame  */
NIC_BUF_DESC  *NIC_CurrentFrameEnd;                                     /* Pointer to the last descriptor for the current frame */

NIC_BUF_DESC  *NIC_ExpectedFrameStart;                                  /* Pointer to the next expected SOF descriptor          */
                                                                        /* This is used to improve search / detection of frames */
                                                                        /* that need to be read from the descriptor buffers     */

CPU_INT16U     NIC_RxNRdyCtr;                                           /* Track # of frames are need to be read from memory    */

                                                                        /* MUST be aligned on a 32 byte boundaries              */
CPU_INT08U     NIC_RxBuf[NIC_RX_BUF_SIZE * NIC_RX_N_BUFS + 32];         /* RxBuffers & descriptors, Tx descriptors declarations */
CPU_INT08U     NIC_RxBufDesc[sizeof(NIC_BUF_DESC) * NIC_RX_N_BUFS + 32];
CPU_INT08U     NIC_TxBufDesc[sizeof(NIC_BUF_DESC) * 1 + 32];

/*
*********************************************************************************************************
*                                       LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void        NetNIC_RxISR_Handler            (void);             /* ISR for RX interrupts.                               */
static  void        NetNIC_TxISR_Handler            (void);             /* ISR for TX interrupts.                               */
static  void        NetNIC_TxPktDiscard             (NET_ERR     *perr);

static  CPU_INT16U  NIC_GetNRdy                     (void);

                                                                        /* -------------------- MACB FNCTS -------------------  */
static  void        MACB_Init                       (NET_ERR     *perr);


                                                                        /* ------------------ MACB RX FNCTS ------------------  */
static  void        MACB_RxBufInit                  (void);
static  void        MACB_RxEn                       (void);
static  void        MACB_RxDis                      (void);
static  void        MACB_RxIntEn                    (void);

static  void        MACB_RxPktDiscard               (CPU_INT16U   size);

static  void        MACB_RxPkt                      (void        *ppkt,
                                                     CPU_INT16U   size,
                                                     NET_ERR     *perr);

                                                                        /* ------------------ MACB TX FNCTS ------------------  */
static  void        MACB_TxBufInit                  (void);
static  void        MACB_TxEn                       (void);
static  void        MACB_TxDis                      (void);
static  void        MACB_TxIntEn                    (void);
static  void        MACB_TxPkt                      (void        *ppkt,
                                                     CPU_INT16U   size,
                                                     NET_ERR     *perr);

static  void        MACB_TxPktPrepare  (void        *ppkt,
                                                     CPU_INT16U   size,
                                                     NET_ERR     *perr);

/*
*********************************************************************************************************
*********************************************************************************************************
*                                            GLOBAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             NetNIC_Init()
*
* Description : (1) Initialize Network Interface Card :
*                   (a) Perform NIC Layer OS initialization
*                   (b) Initialize NIC status
*                   (c) Initialize NIC statistics & error counters
*                   (d) Initialize MACB
*
* Argument(s) : perr        Pointer to variable that will hold the return error code from this function :
*
*                               NET_NIC_ERR_NONE                    Network interface card successfully initialized.
*
*                                                                   -------- RETURNED BY NetOS_NIC_Init() : --------
*                               NET_OS_ERR_INIT_NIC_TX_RDY          NIC transmit ready signal NOT successfully
*                                                                       initialized.
*                               NET_OS_ERR_INIT_NIC_TX_RDY_NAME     NIC transmit ready name   NOT successfully
*                                                                       configured.
* Return(s)   : none.
*
* Caller(s)   : Net_Init().
*********************************************************************************************************
*/

void  NetNIC_Init (NET_ERR  *perr)
{
                                                                        /* --------------- PERFORM NIC/OS INIT ---------------  */
    NetOS_NIC_Init(perr);                                               /* Create NIC objs.                                     */
    if (*perr != NET_OS_ERR_NONE) {
         return;
    }

                                                                        /* ----------------- INIT NIC STATUS -----------------  */
    NetNIC_ConnStatus           =  DEF_OFF;

                                                                        /* ------------- INIT NIC STAT & ERR CTRS ------------  */
#if (NET_CTR_CFG_STAT_EN        == DEF_ENABLED)
    NetNIC_StatRxPktCtr         =  0;
    NetNIC_StatTxPktCtr         =  0;
#endif

#if (NET_CTR_CFG_ERR_EN         == DEF_ENABLED)
    NetNIC_ErrRxPktDiscardedCtr =  0;
    NetNIC_ErrTxPktDiscardedCtr =  0;
#endif

                                                                        /* -------------------- INIT MACB---------------------  */
    MACB_Init(perr);
}


/*
*********************************************************************************************************
*                                            NetNIC_IntEn()
*
* Description : Enable NIC interrupts.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : Net_Init().
*********************************************************************************************************
*/

void  NetNIC_IntEn (NET_ERR  *perr)
{
    MACB_RxIntEn();
    MACB_TxIntEn();

    *perr = NET_NIC_ERR_NONE;
}

/*
*********************************************************************************************************
*                                        EMAC Link Settings Update
*
* Description : This function is called by NetNIC_Init and the PHY ISR in order to update the
*             : speed and duplex settings for the EMAC.
*
* Arguments   : link_speed      Indicates link speed.  This can be one of
*                                   NET_PHY_SPD_0
*                                   NET_PHY_SPD_10
*                                   NET_PHY_SPD_100
*                                   NET_PHY_SPD_1000
*
*               link_duplex     Indicates link duplex.  This can be one of
*                                   NET_PHY_DUPLEX_UNKNOWN
*                                   NET_PHY_DUPLEX_HALF
*                                   NET_PHY_DUPLEX_FULL
*
* Return(s)   : none.
*********************************************************************************************************
*/

void  NetNIC_LinkChange (CPU_INT32U link_speed, CPU_INT32U link_duplex)
{
    CPU_INT32U reg_val;


                                                                        /* Get EMAC config, clear speed & duplex bits           */
    reg_val         =   MACB_NCFGR & ~(MACB_NCFGR_SPD | MACB_NCFGR_FD);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -