LwIP之ethernet_if.c和底层驱动概览

ethernet_if.c用来连接LwIP栈和网络接口


ehternet_if.c中使用的函数
1.low_level_init调用以太网驱动来初始化处理器(ST)以太网外围接口
2.low_level_out调用以太网驱动来发送以外网数据包
3.low_level_input调用以太网驱动来接收以太网数据包
4.ethernetif_init调用low_level_inti来初始化以太网接口和netif结构体
5.ethernet_input调用low_level_input接收数据包并传递至LwIP协议栈


Low level driverOverview
ST的Libraries\STM32_ETH_Driver下存放了网络的驱动stm32_eth.c和stm32_eth.h
其中的函数可以分为以下几类:
1.全局的以太网MAC和DMA配置和控制函数
2.DMA描述符处理函数
3.DMA配置和控制函数
4.PHY控制函数
5.电源管理函数(PMT)
6.MAC管理计数函数(MMC --MAC Management Counters)




先来看下一个关于Ethernet的重要的结构体:ETH_InitTypeDef
ETH_InitTypeDef 是MAC的初始化结构体,对MAC和DMA进行相关的设置。
如:ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
ETH_Speed = ETH_Speed_100M

ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes
......
Global Ethernet MAC/DMA functions
1.ETH_StructInit---初始化ETH_InitTypeDef 结构体
2.ETH_Start---使能ETH的MAC和DMA接收和发送操作

|——ETH_MACTransmissionCmd(ENABLE); //使能MAC发送
|——ETH_FlushTransmitFIFO(); //清除FIFO
|——ETH_MACReceptionCmd(ENABLE);
|——ETH_DMATransmissionCmd(ENABLE);
|——ETH_DMAReceptionCmd(ENABLE);
3.ETH_GetMACFlagStatus---获取MAC的标志位是否被置位
4.ETH_GetMACITStatus---获取来自MAC的中断状态
5.ETH_MACITConfig---使能或失能来自MAC的中断

....................................................................等等


DMAdescriptor handing
DMA descriptors
以太网数据包在传输/接收FIFOs和内存之间使用传输描述符(trasnsfer descriptors)进行传输。
以太网DMA描述符链
LwIP之ethernet_if.c和底层驱动概览
文章图片


LwIP之ethernet_if.c和底层驱动概览
文章图片


LwIP之ethernet_if.c和底层驱动概览
文章图片



LwIP之ethernet_if.c和底层驱动概览
文章图片

Two arrays for the DMA descriptors, one for DMA Rx and another for DMA Tx:
/* Ethernet Rx & Tx DMA Descriptors */

ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];

/**
* @briefETH DMA Desciptors data structure definition
*/
typedef struct{
uint32_tStatus; /*!< Status */
uint32_tControlBufferSize; /*!< Control and Buffer1, Buffer2 lengths */
uint32_tBuffer1Addr; /*!< Buffer1 address pointer */
uint32_tBuffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */
} ETH_DMADESCTypeDef;


2.Two arrays of driver buffers, one array for receive buffers and another array for transmit buffers:
/* Ethernet buffers */

uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE];
uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE];

其中,ETH_RXBUFNB和ETH_TXBUFNB分别表示接收/发送的buffers的个数,好比N个柜子
ETH_RX_BUF_SIZE和ETH_TX_BUF_SIZE表示接收和发送缓冲区中的字节数,好比N个柜子中又M个抽屉
3.默认的设置
ETH_RXBUFNB=4
ETH_TXBUFNB=2
ETH_RX_BUF_SIZE=1524(max size of Ethernet packet (1522) + 2 bytes for 32-bit alignment)
ETH_TX_BUF_SIZE=1524


DMA descriptor handling functions
ETH_DMARxDescChainInit初始化DMA Rx描述符链,如上面第二张图所示

ETH_DMATxDescChainInit初始化DMA Tx描述符链

ETH_CheckFrameReceived检查是否一帧数据到来(轮询模式(polling method)下,OWN位和其他DMA RX描述符的标志位)

ETH_Get_Received_Frame获得接收到的帧(当使用轮询模式时)

ETH_Get_Received_Frame_interrupt获得接收到的帧,在中断方式下检测到接收数据帧时使用

ETH_Prepare_Transmit_Descriptors为发送数据包而准备DMA Tx描述符
ETH_GetRxPktSize获得接收到的数据包的大小

ETH_GetDMATxDescFlagStatus获得发送描述符的状态标志

ETH_GetDMARxDescFlagStatus获得接收描述符的状态标志

ETH_DMATxDescTransmitITConfig为发送描述符配置中断

ETH_DMARxDescReceiveITConfig 为发送描述符配置中断

ETH_DMATxDescChecksumInsertion Config

ETH_DMATxDescCRCCmd

ETH_DMATxDescShortFramePadding Cmd

以太网驱动维护两个全局指针跟踪Rx/Tx DMA descriptor,指向下一个接收或被发送的数据包,其示意图如下所示
Tracking DMA Rx/Tx descriptors to Get/Set

LwIP之ethernet_if.c和底层驱动概览
文章图片

LwIP之ethernet_if.c和底层驱动概览
文章图片


在Stm32_eth.c中定义了
/* Global pointers on Tx and Rx descriptor used to track transmit and receive descriptors */
ETH_DMADESCTypeDef*DMATxDescToSet;
ETH_DMADESCTypeDef*DMARxDescToGet;



PHY control functions

以太网PHY寄存器遵循相应的IEEE的规范,有些寄存器是以太网PHY共有的,另外一些根据芯片厂商的不同,有所区别。IEEE802.3定义了0-15这个16个寄存器的功能,常用的有
0.Control
1.Status
2,3. PHY Identifier
4.Auto-Negotiation Advertisement
... ...
ETH_ReadPHYRegister读取某个PHY的寄存器,原型

uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg),其中PHYAddress只能取0-31,是PHY寄存器的索引

ETH_WritePHYRegister写某个PHY寄存器,原型

uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)

ETH_PHYLoopBackCmd使能PHY回环模式

如果使能了PHY 自动协商功能,应用程序需要获得自动协商的结果(速度和工作模式-全双工还是半双工),通过轮询PHY或使用PHY中断获得该结果。


Hardware checksum

TCP、UDP、ICMP的校验在一个完整的帧结束后计算,并且插入到包头相应的区域中,该功能需要在发送FIFO工作在存储和转发模式下。因为在存储-转发模式下,只有当一个完整的帧写入FIFO之后,数据才会被送入MAC控制器(如果发送FIFO的长度小于要发送的以太网帧,那么在发送FIFO即将全满时,数据会被送入到MAC控制器)。
CHECKSUM_BY_HARDWARE在lwipopt.h中定义,默认情况下该功能被使能。


【LwIP之ethernet_if.c和底层驱动概览】

    推荐阅读