目录
2.2 struct dma_async_tx_descriptor
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

本文从设备驱动角度解析DMAEngine的工作原理及使用方法,详细介绍关键结构体dma_slave_config和dma_async_tx_descriptor,并提供设备驱动利用DMAEngine进行数据传输的五个核心步骤。
:DMA设备驱动(consumer)&spm=1001.2101.3001.5002&articleId=126997339&d=1&t=3&u=afb17537c2c24f0c8a5f74f0e7d816de)
1642

被折叠的 条评论
为什么被折叠?



