Linux DMA子系统(3):DMA设备驱动(consumer)

本文从设备驱动角度解析DMAEngine的工作原理及使用方法,详细介绍关键结构体dma_slave_config和dma_async_tx_descriptor,并提供设备驱动利用DMAEngine进行数据传输的五个核心步骤。
该文章已生成可运行项目,

目录

1. 前言

2. 重要的结构体

2.1 struct dma_slave_config

2.2 struct dma_async_tx_descriptor

3. 设备驱动使用DMA Engine的方法

3.1 分配一个DMA从通道

3.2 设置DMA通道的具体参数

3.3 获取描述符

3.4 提交传输并启动传输

3.5 等待传输完成

4. 参考文章


1. 前言

上文从DMA控制器驱动的角度去分析了DMA Engine,即从provider的角度,本文将从需要使用DMA传输的设备驱动的角度,即consumer的角度去分析DMA Engine,看看DMA Engine为client driver提供了哪些功能和API。

2. 重要的结构体

2.1 struct dma_slave_config

struct dma_slave_config结构体包含了完成一次DMA传输所需要的所有可能的参数。

struct dma_slave_config {
	enum dma_transfer_direction direction;
	phys_addr_t src_addr;
	phys_addr_t dst_addr;
	enum dma_slave_buswidth src_addr_width;
	enum dma_slave_buswidth dst_addr_width;
	u32 src_maxburst;
	u32 dst_maxburst;
	u32 src_port_window_size;
	u32 dst_port_window_size;
	bool device_fc;
	unsigned int slave_id;
};

1. direction:DMA传输的方向。

2. src_addr:当src是dev时,即从dev2dev或者从dev2mem时,读取DMA从数据的物理地址,反之,当src是mem时,即从mem2dev时(mem2mem的传输,一般不会直接使用dma engine提供的API),则忽略此参数。

3. dst_addr:当dst是dev时,即从mem2dev或者从dev2dev时,写入DMA从数据的物理地址,反之,当dst是mem时,即从dev2mem时(mem2mem的传输,一般不会直接使用dma engine提供的API),则忽略此参数。

4. src_addr_width:src地址的宽度,其中包括包括1、2、3、4、8、16、32、64,单位为byte。

5. dst_addr_width:dst地址的宽度,其中包括包括1、2、3、4、8、16、32、64,单位为byte。

6. src_maxburst:src最大可传输的burst的大小。

7. dst_maxburst:dst最大可传输的burst的大小。

8. device_fc:流控制器设置,仅对从通道有效。如果外围设备是流控制器,则填写“true”。 方向将在运行时选择。

9. slave_id:从属请求者id,仅对从通道有效。DMA从外设将具有唯一的id作为DMA请求者,需要作为从配置传递。

2.2 struct dma_async_tx_descriptor

struct dma_async_tx_descriptor用于描述一次DMA传输。

struct dma_async_tx_descriptor {
	dma_cookie_t cookie;
	enum dma_ctrl_flags flags; /* not a 'long' to pack with cookie */
	dma_addr_t phys;
	struct dma_chan *chan;
	dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx);
	int (*desc_free)(struct dma_async_tx_descriptor *tx);
	dma_async_tx_callback c
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值