`
java-mans
  • 浏览: 11457339 次
文章分类
社区版块
存档分类
最新评论

DMA

 
阅读更多

DMA 控制器允许 Blackfin 或者外设指定数据传送操作,然后返回正常操作中。 DMA 控制器传送数据的过程独立于处理器的活动

DMA 控制器传送数据的方式有下面几种:

<!-- [if !supportLists]-->l <!-- [endif]-->存储器 <-> 存储器 MemDMA );

<!-- [if !supportLists]-->l <!-- [endif]-->存储器 <-> 串行外设接口;

<!-- [if !supportLists]-->l <!-- [endif]-->存储器 <-> 串行接口;

<!-- [if !supportLists]-->l <!-- [endif]-->存储器 <-> UART 口;

<!-- [if !supportLists]-->l <!-- [endif]-->存储器 <-> USB 口;

DMA 系统有包括 DMA 控制器( MemDMA )在内的 8 DMA 兼容外设,图 5.1 12 个通道和总线控制器,其中 DMA 传送可以使基于描述符 的,也可以是基于自动缓冲 的。

DAB, DCB, DEB Master

默认仲裁优先级

PPI

0-highest

SPORT0 RCV DMA Controller

1

SPORT1 RCV DMA Controller

3

SPORT0 XMT DMA Controller

2

SPORT1 XMT DMA Controller

4

SPI DMA Controller

5

UART RCV Controller

6

UART XMT Controller

7

Memory DMA0(dest) Controller

8

Memory DMA0(source) Controller

9

Memory DMA1(dest) Controller

10

Memory DMA1(source) Controller

11-lowest

5.1 12 个通道和总线控制器

1 基于描述符的 DMA 传送

基于描述符的 DMA 传送是 Blackfin 控制 DMA 最普通的方法。使用该方法时, DMA 通道需要一组称为 DMA 描述符的参数,该参数存储在存储器中。每个描述符包含特定 DMA 传送序列所需要的所有信息,其组成结构如下:

<!-- [if !supportLists]-->(1) <!-- [endif]-->要传送数据块的 32 位起始地址;

<!-- [if !supportLists]-->(2) <!-- [endif]-->要传送的数据量

<!-- [if !supportLists]-->(3) <!-- [endif]-->其他各种控制信息——如该 DMA 做什么,传送何时完成等配置信息;

<!-- [if !supportLists]-->(4) <!-- [endif]-->指向下一个描述符的指针。

下面步骤是设置基于描述符的 DMA 的典型时序。在进行这些步骤之前,必须将描述符基地址( BASE+0 )的高 16 位设置到 DMA 描述符的基址指针寄存器( DMADBP )中。

<!-- [if !supportLists]-->(1) <!-- [endif]--> DMA 配置字(其 15 位置为 1 ), DMA 传送计数, DMA 起始地址( 15:0 ), DMA 起始地址( 31:16 )以及下一个描述符指针( 15:0 ),写入描述符存储器地址 BASE+0~BASE+8 中。如果描述符是链表中的最后一个元素,或者是链表中的唯一元素,那么该描述符中的下一个描述符指针应该指向下一个存储单元,该存储单元的 15 位必全为零。基于上述要求,下一个描述符指针可以指向当前描述符的基地址 BASE+0 。在 DMA 传送序列完成之后, DMA 配置字的位 15 被清零。控制器返回给处理器。

<!-- [if !supportLists]-->(2) <!-- [endif]-->将描述符基地址( BASE+0 )的低 16 位写到相应外设的下一个描述符寄存器中。

<!-- [if !supportLists]-->(3) <!-- [endif]-->设置相应外设的 DMA 配置寄存器中 DMA 使能位。

<!-- [if !supportLists]-->(4) <!-- [endif]-->仅在单个 DMA 传送序列或链表中的第一个 DMA 传送序列需要进行写操作。


<!-- [if mso & !supportInlineShapes & supportFields]><span lang=EN-US><span style="mso-element:field-begin;mso-field-lock:yes" mce_style="mso-element:field-begin;mso-field-lock:yes"></span><span style='mso-spacerun:yes'>&nbsp;</span>SHAPE<span style="mso-spacerun:yes" mce_style="mso-spacerun:yes">&nbsp; </span>/* MERGEFORMAT <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]--><!-- [if gte vml 1]><v:group id="_x0000_s1026" editas="canvas" style='width:414pt;height:202.8pt;mso-position-horizontal-relative:char; mso-position-vertical-relative:line' coordorigin="2362,1000" coordsize="7200,3533"> <o:lock v:ext="edit" aspectratio="t"/> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_s1027" type="#_x0000_t75" style='position:absolute; left:2362;top:1000;width:7200;height:3533' o:preferrelative="f"> <v:fill o:detectmouseclick="t"/> <v:path o:extrusionok="t" o:connecttype="none"/> <o:lock v:ext="edit" text="t"/> </v:shape><v:shapetype id="_x0000_t109" coordsize="21600,21600" o:spt="109" path="m,l,21600r21600,l21600,xe"> <v:stroke joinstyle="miter"/> <v:path gradientshapeok="t" o:connecttype="rect"/> </v:shapetype><v:shape id="_x0000_s1028" type="#_x0000_t109" style='position:absolute; left:2675;top:1272;width:1722;height:2310'> <v:textbox style="mso-next-textbox:#_x0000_s1028" mce_style="mso-next-textbox:#_x0000_s1028"> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Next_Desc_Ptr[15:0]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Start_Addr[15:0]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Start_Addr[31:16]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>DMA_Config<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>X_Count<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>X_Modify<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Y_Count<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Y_Modify<o:p></o:p></span></b></p> <p class=MsoNormal><span lang=EN-US style="font-size:9.0pt" mce_style="font-size:9.0pt"><o:p>&nbsp;</o:p></span></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1029" type="#_x0000_t109" style='position:absolute; left:5023;top:1951;width:1721;height:2310'> <v:textbox style="mso-next-textbox:#_x0000_s1029" mce_style="mso-next-textbox:#_x0000_s1029"> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Next_Desc_Ptr[15:0]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Start_Addr[15:0]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Start_Addr[31:16]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>DMA_Config<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>X_Count<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>X_Modify<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Y_Count<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Y_Modify<o:p></o:p></span></b></p> <p class=MsoNormal><span lang=EN-US style="font-size:9.0pt" mce_style="font-size:9.0pt"><o:p>&nbsp;</o:p></span></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1030" type="#_x0000_t109" style='position:absolute; left:7527;top:1272;width:1721;height:2310'> <v:textbox style="mso-next-textbox:#_x0000_s1030" mce_style="mso-next-textbox:#_x0000_s1030"> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Next_Desc_Ptr[15:0]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Start_Addr[15:0]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Start_Addr[31:16]<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>DMA_Config<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>X_Count<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>X_Modify<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Y_Count<o:p></o:p></span></b></p> <p class=MsoNormal><b style="mso-bidi-font-weight:normal" mce_style="mso-bidi-font-weight:normal"><span lang=EN-US style='font-size:9.0pt'>Y_Modify<o:p></o:p></span></b></p> <p class=MsoNormal><span lang=EN-US style="font-size:9.0pt" mce_style="font-size:9.0pt"><o:p>&nbsp;</o:p></span></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:line id="_x0000_s1031" style="position:absolute" mce_style="position:absolute" from="4397,1408" to="5023,2224"> <v:stroke endarrow="block"/> </v:line><v:line id="_x0000_s1032" style="position:absolute;flip:y" mce_style="position:absolute;flip:y" from="6745,1543" to="7527,2087"> <v:stroke endarrow="block"/> </v:line><w:wrap type="none"/> <w:anchorlock/> </v:group><![endif]--><!-- [if !vml]--><!-- [endif]--> <!-- [if mso & !supportInlineShapes & supportFields]><span lang=EN-US><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:414pt; height:202.8pt'> <v:imagedata croptop="-65520f" cropbottom="65520f"/> </v:shape><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->

5-2 设置基于描述符的 DMA 的典型时序

2 基于自动缓冲的 DMA 传送

基于自动缓冲的 DMA 操作,除了不需要存储器中的描述符外,与基于描述符的 DMA 相同。在自动缓冲模式中, DMA 控制器是可写的,并且可以被处理器直接编程以发起一个 DMA 传送过程。一旦传送完成,控制寄存器被他们的原始设置值重载,以备下一次传送。这将产生一个循环缓冲区,并且不断地传送数据,直到通过将外设 DMA 配置寄存器的 DMA 使能位清零,才被禁止。如果允许中断,在传送过程进行一半完成 时,将产生中断。

下面是设置基于自动缓冲 DMA 的典型步骤:

<!-- [if !supportLists]-->(1) <!-- [endif]--> DMA 配置寄存器中的自动缓冲使能位置 1

<!-- [if !supportLists]-->(2) <!-- [endif]-->初始化 DMA 传送计数器, DMA 起始地址高位寄存器, DMA 起始地址低位寄存器;

<!-- [if !supportLists]-->(3) <!-- [endif]--> DMA 配置寄存器,对 DMA 传送进行设置,并将 DMA 使能位置 1. 这一部将启动基于自动缓冲的 DMA 的传送过程。

<!-- [if !supportLists]-->(4) <!-- [endif]-->要停止 DMA 的传送,需要将寄存器中的 DMA 使能位清零,正在传送期间将位清零,不会像基于描述符的 DMA 那样引起 DMA 错误结束,一旦检测到 DMA 使能位被清零, DMA 传送寄存器 可以用来监视 DMA 传送状态。

3 存储器 DMA

存储器 DMA MemeDMA )控制器提供在 Blackfin 存储空间中存储器对存储器的 DMA 数据传送。这些存储空间包括外设组件互连( PCI )地址空间、 L1 L2 以及外部的同步 & 异步存储器。

MemDMA 控制器由两个通道组成。一个是源通道,用于读存储器,另一个是目的通道,用于写存储器。两个通道共享 一个可以存放 16 条记录的 32 FIFO 。源 DMA 通道写 FIFO ,目的 DMA 通道读 FIFO FIFO 深度大大改善了内部与外部存储器之间的数据传送流量。 FIFO 支持 8 位、 16 位和 32 位的传送。但是,在 8 位和 16 位传送中,仅使用 32 位数据总线的一部分,因此,这两种传送的流量要比 32 位的 DMA 操作低。

MemDMA 控制器不支持基于自动缓冲的 DMA ,使用 MemDMA 控制器的传送必须是基于描述符的 DMA 。而且要有两个独立的描述符列链表,一个用于源 DMA 通道,另一个用于目的 DMA 通道。

因为源 DMA 和目的 DMA 通道共享一个 FIFO 缓冲,两个描述符中的传送计数必须设置为相同值,数据尺寸也设置为相同值。

4 二维 DMA

Blackfin-533 支持二维 DMA 的传送操作,其相关寄存器和功能如下:

<!-- [if !supportLists]-->(1) <!-- [endif]-->配置寄存器( DMAx-CONFIG_yy_CONFIG

设置二维 DMA 方式使能,中断产生的方式,其中中断可以在一行结束时产生,也可以在整个 DMA 结束时产生。

<!-- [if !supportLists]-->(2) <!-- [endif]-->内层循环计数寄存器( DMAx_X_COUNT/MDMA-yy_X_COUNT

在二维 DMA 时保存二维 DMA 内层循环的数目(行数)必须大于等于 2

<!-- [if !supportLists]-->(3) <!-- [endif]-->内层循环地址增量寄存器( DMAx_X_MODIFY/MDMA_yy_X_MODIFY

在二维 DMA 时保存每一次内层循环计数器加 1 DMA 操作(读或者写)地址在内存中的增量,此增量应该是二维 DMA 操作的数据单元长度的整数倍,比如二维 DMA 进行 16 位读 / 写,则此增量必须是 2 N 倍。

<!-- [if !supportLists]-->(4) <!-- [endif]-->外层循环计数寄存器( DMAx_Y_COUNT/MDMA-yy_Y_COUNT

在二维 DMA 时保存二维 DMA 外层循环的数目(列数)。

<!-- [if !supportLists]-->(5) <!-- [endif]-->外层循环地址增量寄存器( DMAx_Y_MODIFY/MDMA_yy_Y_MODFIY

在二维 DMA 时,保存每一外层循环计数器加 1 DMA 操作(读或者写)地址在内存中的增量,可以使负值,此增量应该是二维 DMA 操作的数据单元长度的整数倍。

参考书籍:《 ADI Blackfin 系列 DSP 处理器试验指导书》

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics