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描述符链
文章图片
文章图片
文章图片
文章图片
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
文章图片
文章图片
在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和底层驱动概览】