设计说明
代码结构
Ethernet 的源码牵涉三个目录
- 硬件驱动相关
硬件驱动代码
packages/third-party/lwip/contrib/ports/drv/aic/
2
- 操作系统相关
LwIP运行需要实现的操作系统相关接口及架构相关的定义
packages/third-party/lwip/contrib/ports/rt-thread/
2
- LwIP内核相关
LwIP内核协议栈源码
packages/third-party/lwip/src/
2
驱动文件说明
文件名称 | 用途 | 备注 |
---|---|---|
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驱动头文件 |
驱动架构
驱动架构图
Luban-Lite GMAC驱动架构如下图。应用程序可通过标准Socket接口或基于RAW的Callback接口编写应 用逻辑。除此之外,Luban-Lite在标准LwIP上封装了部分测试命令(ArtInChip Tools),如”ping”、”iperf”、”ifconfig”、 “mqtt”等测试命令可供上层开发人员进行基础的测试。
关键流程设计
以太网在初始化过程中会创建三个任务, 三个任务的优先级由高到低分别是:线路链接状态检测任务、 网卡数据包输入任务、以及协议栈处理任务、
- 线路链接状态检测任务
线路链路状态检测任务是周期轮询的任务,轮询时间一般为1S或2S。主要功能是实时检测当前 网络链路的链接状态,一旦网络链路状态发生改变,就通过当前的链路状态选择当前以太网的打开状态
- 网卡数据包输入任务
网络包接收任务可以是周期轮询的任务也可以是事件驱动型的任务,主要取决于产品需求。 主要功能是与硬件DMA进行协作,读取当前DMA已经搬运完成的数据包,并将缓冲区还给DMA。 然后再将接收完成的数据包交给协议栈任务进行处理
- 协议栈处理任务
协议栈处理任务为事件驱动型任务,为以太网驱动的核心。事件的来源可以是网络包接收任务、 超时事件、也可以是协议栈自身发出的请求。主要处理数据包的解包、封包、TCP/IP协议等
初始化流程
MAC模块初始化一般发生在协议栈初始化之后,驱动层通过 netif_add 接口将 ethernetif_init 传入,并在设置完LwIP属性之后调用ethernetif_init接口,然后开始执行模块的初始化流程
启动流程
MAC初始化完成后,不会直接使能MAC的发送与接收,而是当 PHY 自协商完成后,才需要打开MAC 的全部功能。
发送流程
当有数据需要发送时,LwIP协议栈会组织好待发送的网卡数据包,然后调用low_level_output接口 完成数据包的发送过程
网卡数据包实际的发送过程只有一种,就是 MAC 内部集成的DMA通过发送描述符将数据包发送至网卡 内部的FIFO(先入先出缓冲区),再由FIFO将数据包发送至 PHY 芯片。因此实际的数据包发送过程一 般都是组装 DMA 发送描述符的过程
接收流程
与发送过程类似,接收过程也需要完全依赖MAC内部的DMA。当一帧完整的以太网数据帧到来时,DMA 将从MAC内部的FIFO中将数据拷贝至接收描述符描述的缓存地址中,当DMA传输完成时,会触发一个 DMA接收完成中断,软件获取到这一中断事件后,就需要根据当前的描述符找到当前网卡的缓存,并将 以太网数据帧取出。并将DMA描述符归还至DMA
中断流程
能触发MAC中断的事件很多,但在实时系统中一般只开启MAC 的DMA接收完成中断。因此MAC的中断 流程设计会相对较简单,只判断是否是接收中断,然后如果是接收中断就释放一个信号量通知网卡 数据包输入任务去DMA缓存中取数据