首先需要说明的是这个驱动是基于LPC17XX 的芯片。很多代码会涉及到lpc17xx mac寄存器的操作。
驱动文件名:LPC18xx_43xx_emac.c
先看下结构体lpc_enetdata_t信息:
/* LPC EMAC driver data structure*/
typedef struct {
/* prxs must be 8 bytealigned! */
ENET_RXSTAT_Tprxs[LPC_NUM_BUFF_RXDESCS]; /*< Pointer to RXstatuses */
ENET_RXDESC_T prxd[LPC_NUM_BUFF_RXDESCS]; /*Pointer to RX descriptor list */
ENET_TXSTAT_Tptxs[LPC_NUM_BUFF_TXDESCS]; /*< Pointer to TXstatuses */
ENET_TXDESC_Tptxd[LPC_NUM_BUFF_TXDESCS]; /* Pointer to TXdescriptor list */
struct netif *pnetif; /**< Reference back to LWIP parentnetif */
struct pbuf*rxb[LPC_NUM_BUFF_RXDESCS]; //RX pbuf pointer list, zero-copy mode */
u32_trx_fill_desc_index; /**< RX descriptornext available index */
volatile u32_trx_free_descs; /**< Count of freeRX descriptors */
struct pbuf*txb[LPC_NUM_BUFF_TXDESCS]; /*< TX pbuf pointerlist, zero-copy mode */
u32_t lpc_last_tx_idx; /* TX last descriptor index, zero-copy mode */
#if NO_SYS == 0
sys_sem_t rx_sem; /**< RX receive thread wakeup semaphore */
sys_sem_t tx_clean_sem; /**<TX cleanup thread wakeup semaphore */
sys_mutex_ttx_lock_mutex; /**< TX criticalsection mutex */
sys_mutex_trx_lock_mutex; /**< RX criticalsection mutex */
xSemaphoreHandlextx_count_sem; /**< TX free buffercounting semaphore */
#endif
} lpc_enetdata_t;
这个结构体是描述LPC驱动的数据项:包括了Rx状态、Rx描述符表、Tx状态、Tx描述符表、网卡配置结构体(用于将数据传递给相应的函数处理)、数据缓存区、等等。
第一个函数:将一个pbuf加入接收描述符队列
功能分析:
RX descriptor Queues:接收描述符队列,接收描述符由一个数组组成,而描述符的使用则是循环的使用这个数组。(即到达数组的末尾处,会重新回到数组的[0]位置)。
此函数的功能:设置emac的接收描述符寄存器,将emac描述符所指向的缓冲区指针指向参数pbuf的空数据块。(即用pbuf来初始化下一个空闲的描述符)
/*将一个pbuf加入到接收描述符的队列中
* Queues a pbuf into the RXdescriptor list
*/
STATIC void lpc_rxqueue_pbuf(lpc_enetdata_t*lpc_enetif, struct pbuf *p)
{
u32_tidx;
/* 取得下一个可用的描述符的序号
*Get next free descriptorindex
*/
idx = lpc_enetif->rx_fill_desc_index;
/* Setup descriptorand clear statuses */
lpc_enetif->prxd[idx].Control= ENET_RCTRL_INT | ((u32_t) ENET_RCTRL_SIZE(p->len));
lpc_enetif->prxd[idx].Packet= (u32_t) p->payload;