lwip驱动的分析(基于LPC17XX)

首先需要说明的是这个驱动是基于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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值