7.11.5. 设计说明

7.11.5.1. 代码结构

Ethernet 的源码牵涉三个目录

  • 硬件驱动相关

硬件驱动代码
packages/third-party/lwip/contrib/ports/drv/aic/
  • 操作系统相关

LwIP运行需要实现的操作系统相关接口及架构相关的定义
packages/third-party/lwip/contrib/ports/rt-thread/
  • LwIP内核相关

LwIP内核协议栈源码
packages/third-party/lwip/src/

7.11.5.1.1. 驱动文件说明

文件名称

用途

备注

aic_mac.c

实际操作MAC寄存器的MAC驱动源文件

aic_mac.h

MAC驱动头文件

aic_mac_ll.c

非操作MAC寄存器MAC驱动源文件

aic_mac_reg.h

MAC寄存器定义头文件

aic_phy.c

通用PHY驱动源文件

aic_phy.h

通用PHY驱动头文件

ethernetif.c

LwIP接口需要调用的核心MAC驱动源文件

ethernetif.h

LwIP接口需要调用的MAC驱动头文件

7.11.5.2. 驱动架构

7.11.5.2.1. 驱动架构图

ZX-RTT GMAC驱动架构如下图。应用程序可通过标准Socket接口或基于RAW的Callback接口编写应 用逻辑。除此之外,ZX-RTT在标准LwIP上封装了部分测试命令(ZX Tools),如”ping”、”iperf”、”ifconfig”、 “mqtt”等测试命令可供上层开发人员进行基础的测试。

../../../_images/mac-system.png

7.11.5.3. 关键流程设计

以太网在初始化过程中会创建三个任务, 三个任务的优先级由高到低分别是:线路链接状态检测任务、 网卡数据包输入任务、以及协议栈处理任务、

  • 线路链接状态检测任务

    线路链路状态检测任务是周期轮询的任务,轮询时间一般为1S或2S。主要功能是实时检测当前 网络链路的链接状态,一旦网络链路状态发生改变,就通过当前的链路状态选择当前以太网的打开状态

  • 网卡数据包输入任务

    网络包接收任务可以是周期轮询的任务也可以是事件驱动型的任务,主要取决于产品需求。 主要功能是与硬件DMA进行协作,读取当前DMA已经搬运完成的数据包,并将缓冲区还给DMA。 然后再将接收完成的数据包交给协议栈任务进行处理

  • 协议栈处理任务

    协议栈处理任务为事件驱动型任务,为以太网驱动的核心。事件的来源可以是网络包接收任务、 超时事件、也可以是协议栈自身发出的请求。主要处理数据包的解包、封包、TCP/IP协议等

7.11.5.3.1. 初始化流程

MAC模块初始化一般发生在协议栈初始化之后,驱动层通过 netif_add 接口将 ethernetif_init 传入,并在设置完LwIP属性之后调用ethernetif_init接口,然后开始执行模块的初始化流程

../../../_images/mac-init.png

7.11.5.3.2. 启动流程

MAC初始化完成后,不会直接使能MAC的发送与接收,而是当 PHY 自协商完成后,才需要打开MAC 的全部功能。

../../../_images/mac-startup.png

7.11.5.3.3. 发送流程

当有数据需要发送时,LwIP协议栈会组织好待发送的网卡数据包,然后调用low_level_output接口 完成数据包的发送过程

网卡数据包实际的发送过程只有一种,就是 MAC 内部集成的DMA通过发送描述符将数据包发送至网卡 内部的FIFO(先入先出缓冲区),再由FIFO将数据包发送至 PHY 芯片。因此实际的数据包发送过程一 般都是组装 DMA 发送描述符的过程

../../../_images/mac-send.png

7.11.5.3.4. 接收流程

与发送过程类似,接收过程也需要完全依赖MAC内部的DMA。当一帧完整的以太网数据帧到来时,DMA 将从MAC内部的FIFO中将数据拷贝至接收描述符描述的缓存地址中,当DMA传输完成时,会触发一个 DMA接收完成中断,软件获取到这一中断事件后,就需要根据当前的描述符找到当前网卡的缓存,并将 以太网数据帧取出。并将DMA描述符归还至DMA

../../../_images/mac-receive.png

7.11.5.3.5. 中断流程

能触发MAC中断的事件很多,但在实时系统中一般只开启MAC 的DMA接收完成中断。因此MAC的中断 流程设计会相对较简单,只判断是否是接收中断,然后如果是接收中断就释放一个信号量通知网卡 数据包输入任务去DMA缓存中取数据

../../../_images/mac-interrupt.png