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 driver Overview
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的中断
....................................................................等等
DMA descriptor 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];
/**
* @brief ETH DMA Desciptors data structure definition
*/
typedef struct {
uint32_t Status; /*!< Status */
uint32_t ControlBufferSize; /*!< Control and Buffer1, Buffer2 lengths */
uint32_t Buffer1Addr; /*!< Buffer1 address pointer */
uint32_t Buffer2NextDescAddr; /*!< 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中定义,默认情况下该功能被使能。