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”等测试命令可供上层开发人员进行基础的测试。
7.11.5.3. 关键流程设计
以太网在初始化过程中会创建三个任务, 三个任务的优先级由高到低分别是:线路链接状态检测任务、 网卡数据包输入任务、以及协议栈处理任务、
- 线路链接状态检测任务
线路链路状态检测任务是周期轮询的任务,轮询时间一般为1S或2S。主要功能是实时检测当前 网络链路的链接状态,一旦网络链路状态发生改变,就通过当前的链路状态选择当前以太网的打开状态
- 网卡数据包输入任务
网络包接收任务可以是周期轮询的任务也可以是事件驱动型的任务,主要取决于产品需求。 主要功能是与硬件DMA进行协作,读取当前DMA已经搬运完成的数据包,并将缓冲区还给DMA。 然后再将接收完成的数据包交给协议栈任务进行处理
- 协议栈处理任务
协议栈处理任务为事件驱动型任务,为以太网驱动的核心。事件的来源可以是网络包接收任务、 超时事件、也可以是协议栈自身发出的请求。主要处理数据包的解包、封包、TCP/IP协议等
7.11.5.3.1. 初始化流程
MAC模块初始化一般发生在协议栈初始化之后,驱动层通过 netif_add 接口将 ethernetif_init 传入,并在设置完LwIP属性之后调用ethernetif_init接口,然后开始执行模块的初始化流程
7.11.5.3.2. 启动流程
MAC初始化完成后,不会直接使能MAC的发送与接收,而是当 PHY 自协商完成后,才需要打开MAC 的全部功能。
7.11.5.3.3. 发送流程
当有数据需要发送时,LwIP协议栈会组织好待发送的网卡数据包,然后调用low_level_output接口 完成数据包的发送过程
网卡数据包实际的发送过程只有一种,就是 MAC 内部集成的DMA通过发送描述符将数据包发送至网卡 内部的FIFO(先入先出缓冲区),再由FIFO将数据包发送至 PHY 芯片。因此实际的数据包发送过程一 般都是组装 DMA 发送描述符的过程
7.11.5.3.4. 接收流程
与发送过程类似,接收过程也需要完全依赖MAC内部的DMA。当一帧完整的以太网数据帧到来时,DMA 将从MAC内部的FIFO中将数据拷贝至接收描述符描述的缓存地址中,当DMA传输完成时,会触发一个 DMA接收完成中断,软件获取到这一中断事件后,就需要根据当前的描述符找到当前网卡的缓存,并将 以太网数据帧取出。并将DMA描述符归还至DMA
7.11.5.3.5. 中断流程
能触发MAC中断的事件很多,但在实时系统中一般只开启MAC 的DMA接收完成中断。因此MAC的中断 流程设计会相对较简单,只判断是否是接收中断,然后如果是接收中断就释放一个信号量通知网卡 数据包输入任务去DMA缓存中取数据