首页 理论教育TI芯片DMA使用和管理的实现详解

TI芯片DMA使用和管理的实现详解

【摘要】:要了解具体芯片的DMA使用和管理,首先要看一下硬件的设计。图4-44DM 3730 SDMA与其他模块联系系统框图从图4-44可见,SDMA共有96个DMA请求,用于设备请求DMA进行数据传输处理。SDMA可以访问到外设并可以响应芯片外部的DMA请求。为了提高整个的DMA性能,DMA提供多个中断信号给处理器,来加速系统对DMA处理数据过程的响应。DMA是很多驱动都需要使用的基础功能之一,以上进行了详细的代码级分析。

要了解具体芯片的DMA使用和管理,首先要看一下硬件的设计。DM 3730芯片内部的DMA是System DMA(SDMA)。SDMA和其他模块联系的系统框图如图4-44所示。图4-44引自《DM 3730芯片手册》中第2339页的框图。

978-7-111-49426-3-Chapter04-206.jpg

图4-44 DM 3730 SDMA与其他模块联系系统框图

从图4-44可见,SDMA共有96个DMA请求,用于设备请求DMA进行数据传输处理。SDMA可以访问到外设并可以响应芯片外部的DMA请求。为了提高整个的DMA性能,DMA提供多个中断信号给处理器,来加速系统对DMA处理数据过程的响应。需要注意的是DM3730中有两个主要的处理器:一个是ARMMPU,另一个是IVA(实际是DSP)。两个主核都有对DMA的需求,所以在DMA处理部分也要考虑多核相关的支持,保证多核间不会对DMA内部资源访问造成冲突。

SDMA系统内部的框架如图4-45所示。图4-45引自《DM 3730芯片手册》中第2344页框图。

从图4-45可见,SDMA只有一个用于读操作和一个用于写操作的端口,SDMA内部通过logical channel管理不同的传输请求,通过调度器以及优先级来进行调度,另外通过FIFO来缓冲每个逻辑channel的数据。SDMA有32个逻辑channel,每个channel均可单独设置,并且可以将多个channel串成逻辑链。

接下来分几部分进行详细的解析。

1ᤫ逻辑channel的管理

对于逻辑channel的管理主要是请求和释放。

978-7-111-49426-3-Chapter04-207.jpg

图4-45 SDMA系统内部框图

978-7-111-49426-3-Chapter04-208.jpg

978-7-111-49426-3-Chapter04-209.jpg

978-7-111-49426-3-Chapter04-210.jpg

978-7-111-49426-3-Chapter04-211.jpg

2ᤫ逻辑channel的参数设置接口

逻辑channel的各种设置包括很多的寄存器操作,会涉及芯片手册的一些细节,对细节中设计芯片手册的内容,直接在注释中以英文的形式存在。相应的接口主要是对申请到的逻辑channel进行设置:

978-7-111-49426-3-Chapter04-212.jpg

978-7-111-49426-3-Chapter04-213.jpg

978-7-111-49426-3-Chapter04-214.jpg

978-7-111-49426-3-Chapter04-215.jpg(www.chuimin.cn)

978-7-111-49426-3-Chapter04-216.jpg

978-7-111-49426-3-Chapter04-217.jpg

978-7-111-49426-3-Chapter04-218.jpg

3ᤫ逻辑channel的操作接口

逻辑channel的操作接口主要是启动、停止以及中断响应接口。详细的解析如下:

978-7-111-49426-3-Chapter04-219.jpg

978-7-111-49426-3-Chapter04-220.jpg

978-7-111-49426-3-Chapter04-221.jpg

978-7-111-49426-3-Chapter04-222.jpg

978-7-111-49426-3-Chapter04-223.jpg

978-7-111-49426-3-Chapter04-224.jpg

978-7-111-49426-3-Chapter04-225.jpg

4ᤫSDMA管理初始化及防止多核冲突的实现

SDMA初始化还是以platform驱动的形式存在,而相应的防止多核使用DMA冲突的接口是omap_dma_cmdline_reserve_ch,原理是通过启动参数设定ARM MPU保留的DMA逻辑channel,使得ARM MPU只能使用保留的逻辑channel。

978-7-111-49426-3-Chapter04-226.jpg

978-7-111-49426-3-Chapter04-227.jpg

978-7-111-49426-3-Chapter04-228.jpg

978-7-111-49426-3-Chapter04-229.jpg

DMA是很多驱动都需要使用的基础功能之一,以上进行了详细的代码级分析。以上的代码与DMA engine框架的功能类似,可以看做是DMA engine的芯片级实现。需要注意的是DM 816X系列芯片内部不是SDMA而是EDMA,与SDMA差别主要是操作的寄存器不同,但是由于相应的设备驱动已经使用omap的DMA接口实现,最简单的移植就是将EDMA的操作以omap的DMA接口封装,相应的sdma2edma.c就是实现该功能。