linux下的DMA驱动框架drivers\dma\dmaengine.c文件内,在linux下编写DMA的设备驱动一般步骤如下。
-
申请DMA通道
struct dma_chan *dma_request_channel(dma_cap_mask_t mask,
dma_filter_fn filter_fn,
void *filter_param);
其中dma_cap_mase_t是根据dma_cap_sets指定的DMA传输类型;filter_param是外设ID。如:
dma_cap_mask_t mask;
dma_cap_zero(mask);
dma_cap_set(DMA_MEMCPY,mask);
dma_chan1 = dma_request_channel(mask,0,NULL);
-
DMA通道的配置
int dmaengine_slave_config(struct dma_chan *chan, struct dma_slave_config *config);
可以通过config结构体设置DMA通道宽度、数据传输宽带、源地址目的地址等信息。
-
获得传输描述符
通过device_prep_slave_sg() 或者
device_prep_dma_cyclic() 或者
device_prep_dma_memcpy() 获取desc,再将回调函数指针穿给desc->callback。