3.1. 简述PL08X的DMA驱动的基本流程

接下来将要解释的这些函数,都是挂靠在DMA Engine架构下面的函数。

此 pl08x的DMA驱动也要是实现对应的函数,以便其他程序调用这些接口使用pl08x。

下面简单介绍一下通用的调用此pl08x的DMA驱动的大概流程:

  1. 得到当前可以用于DMA传输的数据buffer
    • 如果已经有了普的数据buffer,那么一般用dma_map_single去将普通的CPU访问的buffer映射成DMA可以访问的buffer
    • 如果没有现存buffer,那么一般用dma_alloc_writecombine,自己申请一个,申请的此buffer,是combine,绑定一起的,即不论是DMA还是CPU,都可以访问的
  2. 根据自己的需求,设置好传输的client的一堆参数后,然后调用

    dma_async_client_register(txclient);

    dma_async_client_chan_request(txclient);

    去注册申请对应的client。
  3. 设置好scatter/gather list的信息后,调用

    device_prep_slave_sg

    去寻找并获得和自己匹配的那个描述符desc
  4. 然后设置对应的callback函数和对应参数

    desc->callback = as353x_nand_dma_complete_callback;

    desc->callback_param = &info->callback_param;

    [注意]注意

    callback函数里面,会调用complete(&info->done);去完成对应的变量

    而你的callback函数,会在DMA完全传输完毕后,DMA驱动中的irq中会被调用。

  5. 都准备好了后,再调用

    desc->tx_submit(desc);

    去提交你的DMA请求
  6. 一切完毕后,调用

    info->txchan->device->device_issue_pending(info->txchan);

    真正的开始DMA的数据传输。
  7. 之后,你就可以调用

    wait_for_completion_timeout

    去等待你的传输完毕了。