介绍

架构

DMAC 驱动程序遵循 Linux 框架:DMA 引擎、DMA 虚拟通道。DMAC 软件架构如下面的图所示。

../../rst_linux/8_dmac/figures/dmac_software_arch.svg

关于 Linux DMA 框架的详细信息,请参阅 DMA Engine documentation v5.4 或者 DMA Engine documentation v6.6

实现

DMAC 驱动程序实现为以下文件:

文件

描述

<linux>/drivers/rtkdrivers/dma/Kconfig

DMAC 驱动程序 Kconfig

<linux>/drivers/rtkdrivers/dma/Makefile

DMAC 驱动程序 Makefile

<linux>/drivers/rtkdrivers/dma/realtek_dmac.c

DMAC 函数

<linux>/drivers/rtkdrivers/dma/realtek_dmac.h

DMAC 相关函数声明、宏定义、结构定义以及引用的其他头文件。

<linux>/include/dt-bindings/realtek/dmac/realtek-ameba-dmac.h

GDMA 握手接口的定义。

配置

设备树配置

DMAC 设备树节点:

dma: dma@400E0000 {
  compatible = "realtek,ameba-rtk-dmac";
  reg = <0x400E0000 0x000400>;
  clocks = <&rcc RTK_CKE_GDMA>;
  dma-channels = <8>;
  dma-requests = <100>;
  interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
    <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
};

DMAC 的设备树配置在下表中列出。

属性

描述

可配置?

compatible

DMAC 驱动的描述:realtek,ameba-rtk-dmac

reg

DMAC 设备的硬件地址和大小: <0x400E0000 0x000400>

clocks

DMAC 设备的时钟

interrupts

DMAC 设备的 GIC 号:25~32

dma-channels

物理通道号: 8

dma-requestes

虚拟信道号: 100

DMA 客户端设备树配置

child-node: {
  compatibale = "xxxxxxx";
  dmas = <&dma [number]>;
  dma-names = "[specific-name]";
}

DMAC 客户端的设备树配置列在下表中

属性

描述

可配置?

compatible

DMA 客户端兼容名称,例如音频、LEDC

dmas

选择一个物理通道进行 DMA 处理

0~7

dma-names

为此 DMA 通道分配一个名称

编译配置

选择 Device Drivers > Drivers for Realtek > DMAC driver

../../rst_linux/8_dmac/figures/dmac_driver.png

APIs

用户空间 API

无。

内核空间 API

DMA 地址映射 API

接口

介绍

dma_alloc_coherent

一致的映射。分配一个 DMA 地址和大小。

dma_free_coherent

一致的映射。释放已分配的 DMA 地址和大小。

dma_map_single

流映射。将虚拟缓冲区转换为 DMA 缓冲区。

dma_unmap_single

流取消映射。将 DMA 缓冲区转换为虚拟缓冲区。

dma_sync_single_for_cpu

流映射。将地址控制权交给 CPU。

dma_sync_single_for_device

流映射。将地址控制权交给设备以及 DMA。

参考 DMA Engine API Guide v5.4DMA Engine API Guide v6.6 获得更多细节。

DMA 传输 APIs

DMA 客户端的使用包括以下步骤:

  1. 分配一个 DMA 从通道

  2. 设置从设备和控制器的特定参数

  3. 获取事务的描述符

  4. 提交事务

  5. 发出挂起的请求并等待回调通知

<linux>/include/linux/dmaengine.h 为内核空间提供了 DMAC 主接口。

以下是一些常用的用于控制 DMA 设备的 API:

接口

介绍

dma_request_chan

分配一个 DMA 从通道

dmaengine_slave_config

设置从设备和控制器特定的参数

dmaengine_prep_slave_sg

获取事务的描述符。从/向外设进行散点聚集缓冲区的 DMA

dmaengine_prep_dma_cyclic

获取事务的描述符。从/向外设执行循环 DMA 操作,直到操作被明确停止

dmaengine_submit

提交事务

dma_async_issue_pending

发出挂起的 DMA 请求并等待回调通知

内核空间的 DMAC 示例位于 <test>/dmac。文件 readme.txt 提供了详细信息。