介绍
架构
DMAC 驱动程序遵循 Linux 框架:DMA 引擎、DMA 虚拟通道。DMAC 软件架构如下面的图所示。
关于 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 驱动的描述: |
否 |
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 通道分配一个名称 |
是 |
编译配置
选择
:
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.4 或 DMA Engine API Guide v6.6 获得更多细节。
DMA 传输 APIs
DMA 客户端的使用包括以下步骤:
分配一个 DMA 从通道
设置从设备和控制器的特定参数
获取事务的描述符
提交事务
发出挂起的请求并等待回调通知
<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
提供了详细信息。