0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

聊一聊以太网发送描述符

路科验证 来源:开心果 Need Car 2024-10-22 15:09 次阅读

以下文章来源于开心果 Need Car ,作者开心果 Need Car

相对于其他总线,以太网的知识庞杂,当然,可获取的资料也丰富。以太网的知识从驱动层到上层协议栈,很难一下消化,所以,不妨从点开始,不断地拓展和链接,从而形成完整地以太网知识框架,进而更好地解决工程问题。

本文,从通信出发,聊一聊以太网发送描述符(Transmit Descriptor)。

提示:基于TC4xx讨论。

1、Transmit Descriptor

我们知道:相比与CAN、Lin等总线,以太网的数据吞吐量比较大,eg:1500bytes。如果让CPU干数据搬运工作,尤其大量数据搬运工作,这有点"屈才"。所以,系统设计中,为了最大程度的释放CPU,在以太网的数据搬运中,会使用专门的DMA(Direct Memory Access)搬运。如果想让DMA知道如何搬运数据,就需要提前告知其搬运规则,因此,描述符(Descriptor)应用而生。对于以太网数据发送,则使用Transmit Descriptor描述以太网数据的发送规则。

Transmit Descriptor有两种格式:Read格式和Write-Back格式。Transmit Descriptor Read Format如下所示:

wKgaoWcXT9CAB5n2AAEoCfUAxoQ615.jpg

如上图,在进行数据发送时,需要注意字节序(单片机一般是小端模式),而如上的描述符可能需要大端处理。

Transmit Normal Descriptor (Write-Back Format),示意如下:

wKgaoWcXT9CAaQ0vAAE0OwXdKFc336.jpg

当DMA完成数据搬运以后,会对描述符进行写回操作,主要操作TDES3的OWN和DESC STATUS位域,将发送状态反馈给Application。

(一)Application与DMA的"握手"

描述符是Application与DMA之间的纽带,Application通过描述符将待发送的信息填充到Transmit Descriptor中,DMA通过判断DES3.OWN获取发送请求。即:Application需要发送数据时,将数据地址放入Buffer1(对应DES0),同时,将一些控制信息写入可用的Transmit Descriptor中,最后,设置DES3.OWN = 1,请求DMA发送数据,这一步可以看作:Application将操作后的发送描述符控制权交给DMA;当DMA发送完数据以后,将对应发送描述符的DES3.OWN复位(=0),这一步可以看作:DMA将目标描述符的控制权返还给Application。通过DES3.OWN,Application与DMA进行交流,也就是"握手"动作,进而保证数据有序交互,示意如下:

wKgaoWcXT9CANVLXAAFnY_O-7Wg298.jpg

DMA发送完成或者接收完成,一般会有中断触发,如果有特殊操作,也可以在中断回调函数中处理。

2、描述符链表

实际使用中,常常使用环形DMA描述符结构(DMA Descriptor Ring),示意如下:

wKgZoWcXT9CAC4eRAAEGAND0FV4093.jpg

如上结构,大家并不陌生。这里,我们需要注意一些细节。

(一)描述符间隔

当使用多个描述符时,描述符之间可以设置间隔(eg:DMA_Ch(#i)_Control寄存器的DSL位域,Descriptor Skip Length)。间隔设置多少需要根据手册要求,本文可以设置的数据间隔:DWord(8 byte)的整数倍,如果DSL = 0,则意味着描述符间没有间隔。

(二)发送描述符操作的寄存器

理解以太网发送,还需要理解与描述符操作相关的寄存器。本文聚焦发送相关的几个DMA寄存器:

DMA_CHi_TXDESC_LIST_ADDRESS:发送描述符的基地址,指向发送描述符链表的第一个描述符,初始化时赋值;

DMA_CHi_CURRENT_APP_TXDESC:当前发送描述符,指向DMA当前可用的描述符;

DMA_CHi_TXDESC_RING_LENGTH:存放发送描述符长度,可使用长度 = n + 1(n是寄存器中存储的实际值);

DMA_CHi_TXDESC_TAIL_POINTER:发送描述符尾指针,每次请求发送以太网Frame后,需要Application更新Transmit Descriptor地址,即:指向下一个可用的空闲描述符地址。

如果Current Descriptor Pointer == Descriptor Tail Pointer,则DMA会自动挂起(Suspend),停止数据搬运。当Application再次请求数据发送时,需要向Descriptor Tail Pointer中写入发送信息,偏移Descriptor Tail Pointer,使其满足:Current Descriptor Pointer < Descriptor Tail Pointer。如果Descriptor Tail Pointer偏移到尾部,则重新回到Descriptor Base Address。

3、以太网帧发送流程

以太网Frame的发送流程,示意如下:

wKgaoWcXT9CAbkJuAAEGpYWHq2M236.jpg

具体发送流程解读:

1、Application通过DMA_CHi_CURRENT_APP_TXDESC寄存器获取当前可用的发送描述符地址,将发送信息填充到可用的发送描述符中,即:告知DMA搬运规则。之后,Application将TDES3.OWN置位(=1),请求发送数据;

2、DMA能否搬运数据,需要判断DMA的工作模式,如果DMA处于Stop模式,需要重新启动DMA。通过判断DMA_CHj_Status (j=0-7)的TPS(Transmit Process Stopped)位域确认其是否处于Stop模式。具体描述:如果TPS == 1,表示DMA处于Stop模式,需要向TPS位域写1清除,同时,进行DMA使能操作。当然,还可以进一步的检查其他信息,eg:TBU(Transmit Buffer Unavailable);

3、当Application将描述符的控制权交给DMA以后,还需要Transmit Poll Demand,即:向DMA_CHi_TXDESC_TAIL_POINTER寄存器写入信息,一般写入下一个可用发送描述符地址,让DMA脱离挂起状态,去查询待处理的发送描述符信息;

4、当DMA发送完数据以后,DMA_CHi_CURRENT_APP_TXDESC寄存器的发送描述符地址自动偏移一个,如果Current Descriptor Pointer < Descriptor Tail Pointer,DMA继续发送数据;如果Current Descriptor Pointer == Descriptor Tail Pointer,DMA随即挂起(Suspend),停止数据搬运,同时,数据的发送状态回写(write-back)到TDES3中。

数据的发送流程关键步骤如上,理解了数据发送,也就不难理解数据的接收过程。

(一)DMA状态变化流程

1、以太网专用DMA初始化以后,如果没有数据发送,进入Suspend状态。此时,DMA_CHi_TXDESC_TAIL_POINTER指向空,示意如下:

wKgZoWcXT9CAdrdAAADE9PyMb58896.jpg

2、Application请求发送数据时,从DMA_CHi_CURRENT_APP_TXDESC寄存器获取可用的发送描述符地址,填充发送规则。向DMA_CHi_TXDESC_TAIL_POINTER寄存器写入下一个可用描述符地址,使其满足Current Descriptor Pointer < Descriptor Tail Pointer,即:触发DMA发送,示意如下:

wKgZoWcXT9CAXFylAADP1trQ5OQ824.jpg

3、Frame发送完成以后,DMA_CHi_CURRENT_APP_TXDESC寄存器中的可用描述符地址,自动向后偏移一个,使得Current Descriptor Pointer == Descriptor Tail Pointer,DMA随即挂起(Suspend),示意如下:

wKgZoWcXT9CAXVq6AADXa2h2AbE498.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    40

    文章

    5419

    浏览量

    171598
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10854

    浏览量

    211578
  • 通信
    +关注

    关注

    18

    文章

    6024

    浏览量

    135950
  • 总线
    +关注

    关注

    10

    文章

    2878

    浏览量

    88051

原文标题:深刻理解以太网发送,必经DMA Transmit Descriptor

文章出处:【微信号:Rocker-IC,微信公众号:路科验证】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    简谈基于FPGA的千兆以太网

    大家好,又到了学习时间了,学习使人快乐。今天我们来简单的聊以太网以太网在FPGA学习中属于比较高级的内容了,有些同学肯定会感觉以太网
    的头像 发表于 08-05 10:28 1.3w次阅读
    简谈基于FPGA的千兆<b class='flag-5'>以太网</b>

    基于DWC_ether_qos的以太网驱动开发-描述符链表介绍

    本文转自公众号欢迎关注 .描述符概述 1.0 前言 对于DWC Ethernet QoS驱动的编写来说,初始化完成之后,核心操作就是DMA的描述符链表配置(linked list
    的头像 发表于 08-30 09:39 4500次阅读
    基于DWC_ether_qos的<b class='flag-5'>以太网</b>驱动开发-<b class='flag-5'>描述符</b>链表介绍

    107以太网DMA发送描述符不成功是怎么回事?

    int DES3;}ETH_DMA_Desc;__align(4) ETH_DMA_Desc TxDes[2];单个描述符发送正常,代码:void ETH_Tx_Des_Init(void){ int i; TxDes[0].DES0 = (0
    发表于 10-08 06:57

    以太网数据帧的发送描述符队列是什么意思?

    这个描述符是什么呀,类似linux系统的文件描述符
    发表于 05-26 06:15

    以太网描述符ETH_DMATxDesc_OWN异常

    stm32 以太网发送段时间后发送描述符状态直为DMA拥有,造成
    发表于 07-07 14:08

    NUC980的口的发送描述符的缓冲区地址要求4字节对齐的问题求解

    NUC980的口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送
    发表于 06-13 07:01

    NUC980的口的发送描述符的缓冲区地址要求4字节对齐的问题求解

    NUC980的口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送
    发表于 06-27 07:34

    关于NUC980的口的发送描述符的缓冲区地址要求4字节对齐的问题

    NUC980的口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送
    发表于 09-04 06:44

    USB HID报告及报告描述符简介

    在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串
    发表于 04-12 11:13 4031次阅读

    Descriptor描述符解释

    Descriptor即描述符,是个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述个USB设备的所有属性,USB主机是通过
    发表于 07-16 09:39 2644次阅读

    USB设备键值表描述符说明资料免费下载

    本文档的主要内容详细介绍的是USB设备键值表描述符说明资料免费下载包括了:1.设备描述符的结构,2. 配置描述符的结构,3. 接口描述符的结构,4. HID
    发表于 07-16 16:56 35次下载
    USB设备键值表<b class='flag-5'>描述符</b>说明资料免费下载

    USB各描述符之间的依赖是怎么样的

    USB 是个通用的总线,端口都是统的。但是USB 设备却各种各样,例如USB 鼠标, USB键盘, U盘等等,那么USB 主机是如何识别出不同的设备的呢?这就要依赖于描述符了。USB 的描述符主要有设备
    发表于 07-23 16:53 8次下载
    USB各<b class='flag-5'>描述符</b>之间的依赖是怎么样的

    Linux系统编程中的文件描述符调用

    文件描述符 进程每打开个文件的时候,会获得该文件的文件描述符,而后续的读写操作都把文件描述符作为参数。在用户空间或者内核空间,都是通过文件描述符
    的头像 发表于 09-02 09:50 1675次阅读
    Linux系统编程中的文件<b class='flag-5'>描述符</b>调用

    基于DWC_ether_qos的以太网驱动开发-描述符格式介绍

    前面我们介绍了描述符链表的工作模式,重点是了解环形链表是如何环形的,以及相关的寄存器。驱动编写就需要更进步,了解描述符的具体内容,即4个描述符的每个字段的含义。
    的头像 发表于 09-04 14:14 2622次阅读
    基于DWC_ether_qos的<b class='flag-5'>以太网</b>驱动开发-<b class='flag-5'>描述符</b>格式介绍

    Python的优雅之处:Descriptor(描述符

    语法糖的实现上也有使用到(在下面的文章会一一介绍)。 当你点进这篇文章时 你也许没学过描述符,甚至没听过描述符。 或者你对描述符只是知半解 无论你是哪种,本篇都将带你全面的学习
    的头像 发表于 11-02 10:52 997次阅读
    Python的优雅之处:Descriptor(<b class='flag-5'>描述符</b>)