接下来将要解释的这些函数,都是挂靠在DMA Engine架构下面的函数。
此 pl08x的DMA驱动也要是实现对应的函数,以便其他程序调用这些接口使用pl08x。
下面简单介绍一下通用的调用此pl08x的DMA驱动的大概流程:
- 得到当前可以用于DMA传输的数据buffer
- 如果已经有了普的数据buffer,那么一般用
dma_map_single
去将普通的CPU访问的buffer映射成DMA可以访问的buffer - 如果没有现存buffer,那么一般用
dma_alloc_writecombine
,自己申请一个,申请的此buffer,是combine,绑定一起的,即不论是DMA还是CPU,都可以访问的
- 如果已经有了普的数据buffer,那么一般用
- 根据自己的需求,设置好传输的client的一堆参数后,然后调用
dma_async_client_register(txclient);
dma_async_client_chan_request(txclient);
去注册申请对应的client。 - 设置好scatter/gather list的信息后,调用
device_prep_slave_sg
去寻找并获得和自己匹配的那个描述符desc - 然后设置对应的callback函数和对应参数
desc->callback = as353x_nand_dma_complete_callback;
desc->callback_param = &info->callback_param;
注意 callback函数里面,会调用
complete(&info->done);
去完成对应的变量而你的callback函数,会在DMA完全传输完毕后,DMA驱动中的irq中会被调用。
- 都准备好了后,再调用
desc->tx_submit(desc);
去提交你的DMA请求 - 一切完毕后,调用
info->txchan->device->device_issue_pending(info->txchan);
真正的开始DMA的数据传输。 - 之后,你就可以调用
wait_for_completion_timeout
去等待你的传输完毕了。