正点原子lwIP学习笔记——以太网DMA描述符

1.什么是以太网DMA描述符

发送:不需要CPU参与,把描述符指向的缓冲区传输到Tx FIFO中;
接收:不需要CPU参与,将Rx FIFO的数据传输到描述符指向的缓冲区。
描述符分类
在正点原子的教程中,都是使用的常规描述符,没有用到增强描述符。

常规描述符结构(精简)

结构体的定义

TX DMA描述符成员变量

TX DMA描述符的示意图

  • TDES0[31]置0:CPU可将数据拷贝到描述符中,拷贝完成会自动将该位置1,代表着DMA可以发送数据;
  • TDES0[20]置1:描述符的第二个地址指向下一个描述符地址;ST以太网驱动库该位置1
  • TDES1[28:16]:TDES0[20]置1,这一段就失效;
  • TDES3[31:0]:取决于TDES0[20]的值,置1,该段就是指向下一个描述符地址。

RX DMA描述符成员变量

RX DMA描述符的示意图

  • RDES0[31]置1:MAC将数据从RX FIFO传输到RX描述符中,拷贝完成会自动将该位置0,代表着CPU可以接收数据;
  • RDES1[14]置1:描述符的第二个地址指向下一个描述符地址;ST以太网驱动库该位置1
  • RDES1[28:16]:RDES0[14]置1,这一段就失效;
  • RDES3[31:0]:取决于RDES0[14]的值,置1,该段就是指向下一个描述符地址。

相当于在正点原子的例程中,全部的结构体都是指向下一个描述符地址TDES0[20]和RDES1[14]均置1!

2.以太网DMA描述符结构

DMA描述符的结构就是单向环形链表,将一系列节点链接,然后单链表的最后一个节点指向链表的第一个节点构成环装。
描述符结构示意图

3.如何追踪描述符

HAL库的版本不同,其中的lwIP会有所不同:
HAL库版本
ETH_HandleTypeDef中定义了RxDesc和TxDesc指针,它们是用来追踪Rx/Tx的DMA描述符(旧);
ETH_InitTypeDef中定义了RxDesc和TxDesc指针,它们是用来追踪Rx/Tx的DMA描述符(新)。
对于我手头的电机开发板而言,f407,之前我是6.4.0和5.6.0的CUBEMX,最高也就到1.26.2的f4固件包,也就是旧版本;新版本,我新搞了一个CUBEMX6.8.1里面才有。
查找描述符
都是通过链表的遍历来查询的。

创建RX/TX描述符(旧版本)

申请内存
初始化就是malloc两个结构体指针,malloc两个缓冲区。
初始化描述符
总结来说,初始化就是组建一个循环的链表,最后把这个定义好的结构体指针赋值给寄存器就可以了。

创建RX/TX描述符(新版本)

创建的前两步
首先是申请内存,并且把这个定义好的数组传给结构体的初始化内容。
初始化RX/TX描述符
这里略有区别,旧版本的结构体是有具体名称的,新版本的HAL库则是直接用编号来指代这四个结构体的内容,但是其含义是一样的。
新版本的逻辑是一样的,只不过代码编写更像是直接操作寄存器。
TX描述符的缓冲区操作
新版本中,都是用的ETH_InitTypeDef的结构体,同时右侧的应该是一个单链表,最后一个的next指针直接NULL就可以。

新旧版本ETH比较

对比
这里我也停的云里雾里的,后面例程解析可能会好一点,我的理解就是:全部都是链表的一些操作,只不过这些链表的内容要放到对应的寄存器里面去,新旧版本的写法有所区别(因为结构体变量改掉了);
同时,旧版本是用TxDesc(申请的指针)来管理pBuf(网络层的缓冲数据)的拷贝数据的;而新版本则是直接去管理pBuf。

总结

数据传输流程
总结来说,以太网DMA描述符就是把数据接收到缓冲,然后分片,把这些数据搞成合适的大小(适应以太网不能超过1500字节的协议),然后转发给FIFO去进一步传输。
这一步就通过结构体自己去初始化两个指针Tx_desc和Rx_desc去进行管理。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值