Edit online

设计说明

DMA 源代码位于 drivers/dma/artinchip-dma.c

Linux 提供了一个 DMA Engine 子系统,可封装不同类型的 DMA 控制器驱动,便于实现 DMA 用户对硬件细节的透明。

DMA Engine 的软件框架如下图:

../images/sw_system20.png
1. Linux 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 等,暂未提供用户态的使用接口。