你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于描述符操作的DMA

[复制链接]
wztvista 提问时间:2018-5-16 00:27 /
悬赏2ST金币未解决
一直对描述符形式的DMA理解非常困难。有没有朋友有这方面的资料和程序可以提供一下,用来学习。小弟在此谢过了!
(基于寄存器操作的DMA理解没有问题,但是基于描述符操作的DMA很难理解,可能是自己理解有问题)

收藏 评论3 发布时间:2018-5-16 00:27

举报

3个回答
yu0405jie 回答时间:2018-5-16 11:30:55
以太网的那个?
bargagebaobei 回答时间:2018-5-16 14:44:11

DMA描述符数组(DMA Descriptor Array/Ring/Chain)是一个形如unsigned long* hw_desc[DESC_NUM]的指针数组,每个指针(hw_desc)指向一个描述符。这个描述符是由硬件定义的,其数据结构一般由datasheet或sdk定义。

硬件描述符(h/w descriptor)

硬件描述符通常包含以下五个部分:

<1>控制位(empty flag/own bit):descriptor empty/owned by DMA or not,该位域描述的是descriptor对CPU/DMA的有效性。empty_flag和own_bit是站在不同角度对控制状态的同功描述,empty表示descriptor上尚无数据(包)。对于RX,descriptor empty(owned by DMA)表示亟待DMA搬运数据进来挂到该descriptor的DMA缓存上;对于TX,descriptor empty(not owned by DMA)表示亟待CPU往descriptor上挂载待发送的数据包。下文主要基于DMAown_bit分析控制位,读者可自行做等价转换。

<2>数据包地址(data buffer address):该指针指向DMA传输时的源端或目的端内存区,有的地方称之为DMA缓存。DMA缓存是数据包的终极归宿,即cluster的数据区(mBlk::mBlkHdr.mData inVxWorks, sk_buff.data in Linux)。

<3>数据包长度(packet length):rx/tx数据包的有效长度。

<4>环尾标(wrap bit):wrap bit of the last descriptor,该位域标记最后一个描述符,用于判断溢出(rx overflow)。站在“环”的角度分析,也可以理解为按照数组索引的回环点。

<5>环链结(next pointer):该指针指向下一个描述符。尽管分配的DMA描述符数组已经是线性存储,但是硬件总是习惯按照地址来查找下一个描述符。软件则更习惯在RX ISR中使用数组索引来遍历描述符环上待收割(reap)的数据包。

有的地方称之为BD(Buffer Descriptor),由于是hardware specific,故开发者一般无需修改h/w descriptor数据结构。

DMA描述符数组hw_desc[]的地址是DMA映射的虚拟地址,它是描述符环的基地址,需要配置到SoC芯片的相关DMA寄存器中,例如AR9331Datasheet中的DMARXDESCR(Pointer to Rx Descrpitor)和DMATXDESCR_Q0(Descriptor Address for Queue 0 Tx)。很显然,这个数组需要分配或转换到非缓存的区段(例如MIPS中的kseg1段)。但每个描述符所指向的DMA缓存(desc buffer)通常是分配在缓存的区段(例如MIPS中的kseg0段),使用cache主要是出于访存性能考虑。



软件描述符(s/w descriptor)

硬件描述符(h/w descriptor)更多的关注分组(例如以太网帧)的传输,而缺乏对数据包或数据链的软件组织层次关怀。数据包在网络协议栈各层之间流动时,软件层面需要维系完整的数据链信息,包括横向的包内分片(fragment)和纵向的多包链化(chain),以便进行链接跟踪(conntrack)。以网卡为例,NIC的ISR中首先会创建一个buf(mBlk/mbuf in VxWorksor or sk_buff in Linux),分组的内容将被封装到这个buf结构体中,进而调用相应函数(END_RCV_RTN_CALL(END_OBJ*,M_BLK_ID)in VxWorks or netif_rx(sk_buff*)in Linux)将数据包推送到网络子系统(TCP/IP协议栈)中的高层代码中。

数据包以mBlk或sk_buff的形式在协议栈之间流动,因此在软件层面,往往根据信息组织的完整性需要对h/w descriptor进行适当地扩展。通常,s/w descriptor是h/w descriptor的Container。除了数据包的组织扩展以外,也可以根据需要增加一些描述信息和维护信息,例如可添加用于跟踪tx timeout的timestamp。


评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 格式有点糟糕,建议去下格式会比较好.

查看全部评分

feixiang20 回答时间:2018-5-17 00:24:10
类似资料可参考【DMA描述符及映射】【基于描述符操作的DMA】等帖子,多从理论知识来理解吧

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版