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 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描述符链


LwIP之ethernet_if.c和底层驱动概览_第1张图片

LwIP之ethernet_if.c和底层驱动概览_第2张图片

                                                                                                                              

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

LwIP之ethernet_if.c和底层驱动概览_第3张图片

在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)