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

原创 嵌入式Lee 2023-08-30 07:31

.描述符概述

1.0 前言

对于DWC Ethernet QoS驱动的编写来说,初始化完成之后,核心操作就是DMA的描述符链表配置(linked list of descriptors)DMA根据描述符链表自动在FIFO和用户指定的缓存之间搬运数据。对于熟悉新思的IP的用户来说,这种套路会有似曾相识的感觉,没错新思的大部分高速IP的数据流都是这么处理的,比如在DWC2 USBIP中就是Scatter/Gather DMA,叫法不一样,实现和思想基本是一样的。这种方式可以解放CPU,使用DMA根据描述符链表搬运数据,对于高速数据流的流式处理有利,相对单个描述符的DMA,链表式描述符一次可以处理更多数据更高效,且能够实现环形不间断流式处理。

参考手册《21 Descriptors

1.1描述符类型

Normal Descriptor: 描述要传输的数据包和其控制信息。包含两个缓冲区和两个地址指针,这种设计以实现较大的灵活性,支持不同的内存管理方案。

Context Descriptor: 描述要传输的数据包的控制信息。

注意:单个数据包可以使用的描述符数量没有限制,虽然这里没有限制,但是受限于Ring_Length寄存器,描述符链表实际最多只能配置为0x3FF1024个描述符。

1.2描述符结构

描述链表整体看是一个环形结构即到了描述符的末尾可以绕回.

 


有一些寄存器对该环形描述符进行定义

1.2.1描述符的颗粒(间隙)

收发都是一样的

 

上述描述Descriptor n本身的大小是固定的即RDES0~RDES3,4WORD(根据不同的总线宽度和大小端,有不同的layout,但是其大小总是4WORD大小,见后面说明).

还支持描述符之间有间隙,间隙的单位根据总线宽度而定,3264128位总线宽度分别对应 Word, Dword, Lword为单位,寄存器DMA_CH(#i)_ControlDSL位域即用于描述该间隙。

再次提醒注意,这里的单位是根据总线宽度而定,不是固定为WORD

 

 

比如这里DSL=0,则表示描述符之间没有间隙,

设置为1,如果是32位总线则间隙为1 WORD

 

1.2.2描述符的个数

收发分别由如下寄存器指定

DMA_CH(#i)_TxDesc_Ring_Length

DMA_CH(#i)_RxDesc_Ring_Length

 

 

1.2.3描述符的首末地址

1)发由以下寄存器决定:

基地址

DMA_CHi_Tx_ControlST=0,TX停止时才能修改以下寄存器。

DMA_CH(#i)_TxDesc_List_HAddress   发送描述符链表基地址的高位,只有4048位地址模式才使用。

DMA_CH(#i)_TxDesc_List_Address 发送描述符链表基地址的低位,必须根据总线宽度按照Word, Dword,Lword对齐,DMA会自动根据总线宽度忽略低位。

尾地址

DMA_CH(#i)_TxDesc_Tail_Pointer  发送描述符链表尾地址,必须根据总线宽度按照Word, Dword,Lword对齐。

这里为什么没有高位寄存器了呢,因为不需要了,高位和DMA_CH(#i)_TxDesc_List_HAddress一样。

2)收由以下寄存器决定 :

基地址

DMA_CH(#i)_RX_Control SR=0,RX停止时才能修改以下寄存器。

DMA_CH(#i)_RxDesc_List_HAddress 接收描述符链表基地址的高位,只有4048位地址模式才使用。

DMA_CH(#i)_RxDesc_List_Address

接收描述符链表基地址的低位,必须根据总线宽度按照Word, Dword,Lword对齐,DMA会自动根据总线宽度忽略低位。

尾地址

DMA_CH(#i)_RxDesc_Tail_Pointer接收描述符链表尾地址,必须根据总线宽度按照Word, Dword,Lword对齐。

这里为什么没有高位寄存器了呢,因为不需要了,高位和DMA_CH(#i)_RxDesc_List_HAddress一样。

1.2.4当前处理的Buffer地址

以下只读寄存器可以调试使用,确认当前处理的描述符对应的Buffer地址,reset时这些寄存器会清零。

发送Buffer

DMA_CH(#i)_Current_App_TxBuffer_H 地址高位

DMA_CH(#i)_Current_App_TxBuffer 地址低位

接收Buffer

DMA_CH(#i)_Current_App_RxBuffer_H

DMA_CH(#i)_Current_App_RxBuffer

需要有收发数据才会更新当前处理的Buffer地址。

1.2.5当前描述符指针

以下只读寄存器可以调试使用,确认当前处理的描述符,reset时这些寄存器会清零。

发送

DMA_CH(#i)_Current_App_TxDesc

接收

DMA_CH(#i)_Current_App_RxDesc

Current寄存器是什么时候更新的呢,测试可以知道是写Base寄存器时更新

进一步测试可知是在DMA停止,即DMA_CH(#i)_RX_ControlSR0时写DMA_CH(#i)_RxDesc_List_Address Current寄存器会自动设置为DMA_CH(#i)_RxDesc_List_Address的值。如果SR=1则不会。

TX也类似。在DMA工作之后,该寄存器更新为当前正在处理的描述符。

1.3描述符的内存布局

描述符的大小总是4x4字节的,但是其布局和总线宽度和大小端有关。

且必须根据总线宽度Word, DWord, LWord 对齐。

三种总线宽度,2种大小端模式一共有6种组合

32位的大端和小端

 

64位小端

 

64位大端

 

128位小端

 


128位大端

 

1.4描述链表的工作过程

1.4.1环形结构

 

前面介绍的描述符首末地址,当前描述符指针和描述符个数这几个寄存器决定了链表的行为。

DMA可以处理的描述符范围是:[Base,Tail)

注意[]表示包括本身,()表示不包括本身,即包括Base寄存器对应的描述符,不包括Tail寄存器对应的描述符。

当前描述符指针则从BaseTail-1的位置遍历,当Current=TaiDMA停止工作。

同时还受描述符个数寄存器限制,

如果描述个数设置为N,CurrentBase~N-1的位置之后会绕回到Base,即以N个为单位回环,这里假设Tail是在N个描述符之后的,如果在之前则回环之前就Current=Tail停止了。

1.4.2停止条件:

Current=Tail

或者Current的位置没有就绪的描述符,即不是Owned by DMA的描述符。

所以Tail至少要大于base才能传输。

1.4.3重启条件

重启条件即保证current处的描述符就绪,且current%N

Tail寄存器时会触发一次硬件的重启条件检测,来检测上述条件。

所以停止了之后读写都需要写Tail寄存器才能重启

1.4.4几种情况分析

Tail 指向 N-1位置之后,此时current不可能达到tail,因为到N-1时就绕回了,

所以停止条件只能是current处的描述符未就绪,即不是Owned by DMA

此时current不断回环遍历,只要软件能保证current处的描述符一直就绪,DMA就一直传输处理,形成了不间断的持续流处理。

 

Tail刚好指向N-1位置或者更向前

则当current=current后停止。

或者current处的描述符未就绪即停止。

此时没法形成持续的流,因为current到了tail之后就会停止。

1.4.5驱动的设计

为了充分利用上述描述符的回环模式,能够连续不断的收发,需要保证DMA处理完之前就更新好后续描述符。使得DMA一直有描述符能处理,不至于current处描述符未就绪而导致停止,且tail设置为在N个描述符之后,这样current始终不会因为=tail而停止。

要保证连续不断的流,需要软件准备描述符的速度大于等于DMA处理描述符的速度。

current处始终有描述符可以处理,所以软件准备好的描述符在current及其之后,需要软件维护一个变量index记录当前软件准备好的描述到了哪。

current追赶index

index>current,[current,index)之间是已经准备好的描述符待DMA处理的,[index,Tail)

[base,current)这两部分是DMA已经处理完,软件需要更新的描述符。

 

index<=current,[index,current)DMA已经处理完,软件需要更新的描述符。

[current,Tail),[Base,index)这两部分是DMA未处理的部分。

 

所以驱动处理流程如下

初始化时先尽可能多的填充好描述符,对于接收可以初始化所有描述符为接收状态,对于发送当然刚开始可能并不需要发送很多数据,那么就需要发送多少就准备多少描述符。

然后接收中断中处理DMA已经接收完的描述符,应用处理完对应的数据后再将这些描述符设置为接收状态。

对于发送则查询哪些描述符DMA已经发送完就可将其更新为发送状态进行发送。


比如如下开始准备了n个描述符

 

然后启动DMA传输,

此时有两种情况,一种是硬件处理DMA比如软件更新描述符块,还有一种是相反。

后者软件总是在current追不上index,即软件更新描述符速度大于硬件处理描述符速度

一段时间后可能就是如下所示

 

而前者软件准备的慢则current会追上index此时DMA会停止,软件需要重新准备描述符并重新配置Tail来重启DMA

具体的驱动代码后面再详讲。

1.5总结

以上介绍了描述符链表,尤其需要了解环形链表的工作模式何时启动,何时停止,软件和硬件如何配合使用环形链表。以及相关寄存器的值的含义和何时更新。了解以上机制后后面就可以开始编写驱动代码进行收发。下回再详讲。


评论
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 74浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 66浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 46浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 88浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 79浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 78浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 66浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 87浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 88浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 114浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 115浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 80浏览
我要评论
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦