ADMA3学习

来源:互联网 发布:票乎下载 编辑:程序博客网 时间:2024/06/05 16:26

ADMA3学习

1、DMA简要回顾

DMA(Direct Memory Access),直接内存存取,允许不同速度下Host与Device的沟通访问,而不需要CPU介入,从而实现快速Data传输的同时,解放CPU。
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
PCIE Reader中DMA机制,用于实现PCIE Host与Reader间Data传输。

1)DMA请求:Driver按需求向Host申请Data buffer,并组织整理Table,填写DMA Control相关配置,并Start DMA。
2)DMA响应:Reader DMA controller响应DMA操作。

1.1. SDMA(Single Operation DMA)

SDMA(Single Operation DMA),一次操作对应一块连续的buffer空间。
1) 按照所需向host申请一块连续完整的buffer
2) 设置Data Length,buffer start address到DMA Control reg中。
3) Start DMA传输。

1.2. ADMA(Advanced DMA)

由于SDMA一次操作仅能使用单一连续的buffer,尤其在host连续buffer不足的情况下,影响performance。
新的ADMA机制使用Scatter gather技术,可以充分利用零碎的buffer,并在一次DMA操作中,完成上述多个buffer空间的访问存取。

1.2.1. ADMA1(废弃)

基于上文所述的考虑,如下图所示,SDIO协会定义了一个规范,从host分配固定大小为4KB的空间,将其start address组织成列表(Descriptor table),告知ADMA Controller,依次进行Data传输。
最终该规范没有实现,主要应为固定4K的buffer size,过于严苛。所以,重新定义了如下ADMA2的规范,允许任意大小的buffer size。
这里写图片描述
执行步骤:
1) Driver根据需要组建Table,设置table start address以告知Device,并start DMA。
2) Device DMA Controller读取descriptor,解析,并进行data传输。
3) 根据attribute情况,继续重复步骤2),直至传输完成。
4) 传输结束,则给出transfer ok/fail interrupt。

ADMA2

ADMA2对ADMA1的格式进行了改进,所申请的buffer size不固定。
这里写图片描述
执行步骤:
(1)Driver根据需要组建Table,设置table start address以告知Device,并开始DMA。
(2)Device DMA Controller读取descriptor,解析并进行data传输。
(3)根据attribute情况,继续重复步骤2,直到传输完成。
(4)传输结束,则给出transfer ok/fail interrupt。

ADMA3

之前提到的ADMA2机制,每一笔ADMA2 transfer对应一笔CMD;即在ADMA2下,只能执行单笔Data transfer。那么在出现Queue CMD后,希望能够一次性执行多笔CMD,于是引出了ADMA3机制。
ADMA3的执行流程如下图所示:
这里写图片描述
执行步骤:
1) Driver根据需要组建Integrated/CMD/Data Table,设置table start address以告知Device,并start DMA。
2) Device DMA Controller读取Integrated descriptor,解析,确认是否获取CMD descriptor,或者Data descriptor。
3) 若需要发送CMD(或者仅用于配置CRC Controller),则获取CMD descriptor,并以规定格式设置发送CMD。
4) 根据Integrated指示,依照情况决定是否获取Data descriptor,并进行data传输;并根据Data descriptor attribute情况,继续重复本步骤,直至传输完成。
5) 传输Fail,给出error interrupt。
6) 否则,根据Integrated descriptor attribute,决定是否还有下一笔RW操作;若没有则给出OK interrupt,否则重复从步骤2)开始。