📄 net_nic.c
字号:
/* ---------------------- 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 + -