您的位置:首页 > 其它

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

2013-06-14 23:15 323 查看
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中定义,默认情况下该功能被使能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: