设计说明
DMA 源代码位于 drivers/dma/artinchip-dma.c。
Linux 提供了一个 DMA Engine 子系统,可封装不同类型的 DMA 控制器驱动,便于实现 DMA 用户对硬件细节的透明。
DMA Engine 的软件框架如下图:

Linux DMA Engine 子系统架构图中可以看到 DMA Engine 中有几个概念:
- DMA Device
对应物理上的一个 Controller。DMA Driver 需要提供 Controller 的一些属性、接口,然后注册为一个 Device,供后续 Engine 框架来调用。支持注册多个 Device,会使用一个链表 dma_device_list 来进行管理。
- DMA channel
和物理上的一个 DMA 通道(如图中 Controller 的 Chx)一一对应。这些通道也是通过一个链表进行管理,归属于某一个 Device。
- VC(Virtual channel)
基于物理的 DMA 通道,DMA Engine 提供了一种虚拟的通道概念 VC,VC 数目往往多于物理通道数,比如 VC 有 48 个而物理通道只有 8 个,这样可以提供一个动态的物理通道分配机制。
- DMA Client
指 DMA 模块的使用者,DMA 用户仅限内核中的其他模块,如 SPI、Audio Codec、UART 等,暂未提供用户态的使用接口。