[RK3288][Android6.0] Audio的DMA调用实例流程

来源:互联网 发布:cost of equity 知乎 编辑:程序博客网 时间:2024/06/05 14:19
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

dma engigne使用流程请看以前的一篇文章:
http://blog.csdn.net/kris_fei/article/details/51305299

此文关注点在Audio 对DMA的实例调用
申请channel
soc_new_pcm -> soc-pcm.c
    platform->driver->pcm_new ->    指向struct dmaengine_no_residue_pcm_platform
        dmaengine_pcm_new ->
            dma_request_slave_channel ->
                of_dma_request_slave_channel -> of-dma.c
                     ofdma->of_dma_xlate ->    //pl330_probe()@pl330.c中赋值
                        of_dma_pl330_xlate ->    pl330.c

                            dma_request_channel //标准申请dma流程


设置slave config信息
soc_pcm_hw_params ->
    platform->driver->ops->hw_params ->
        dmaengine_pcm_hw_params ->
            pcm->config->prepare_slave_config -> //指向rockchip_dmaengine_pcm_config@rk_pcm.c
                snd_dmaengine_pcm_prepare_slave_config     soc-generic-dmaengine-pcm.c    //初始化好config
            dmaengine_slave_config //标准设置config流程

desc获取以及callback设置:
snd_dmaengine_pcm_trigger ->    
    dmaengine_pcm_prepare_and_submit ->    //cmd: SNDRV_PCM_TRIGGER_START
        dmaengine_prep_dma_cyclic ->    //len和peroid_len分别是audio中的buffer_size和peroid_size
            chan->device->device_prep_dma_cyclic ->
                pl330_prep_dma_cyclic ->    //
                    pl330_get_desc    //循环获取buffer_size/peroid_size个desc
        desc->callback = dmaengine_pcm_dma_complete;    //callback设置
                
提交请求,submit:            
snd_dmaengine_pcm_trigger ->    
    dmaengine_pcm_prepare_and_submit ->    //cmd: SNDRV_PCM_TRIGGER_START    
        desc->tx_submit ->    _init_desc()@pl330.c中初始化
            pl330_tx_submit ->
                list_add_tail    //添加到工作队列中等待中断处理

触发DMA:
snd_dmaengine_pcm_trigger ->
    dma_async_issue_pending    ->
        chan->device->device_issue_pending ->
            pl330_issue_pending -> pl330.c
                pl330_tasklet((unsigned long) to_pchan(chan));
                    fill_queue ->    //提交请求,等待处理完成后中断到来
                        pl330_irq_handler ->
                            pl330_update ->
                                _callback ->
                                    r->xfer_cb ->
                                        dma_pl330_rqcb ->
                                            tasklet_schedule ->
                                                pl330_tasklet ->
                                                    handle_cyclic_desc_list ->
                                                        callback ->
                                                            dmaengine_pcm_dma_complete    //更新dma buffer pos.

阅读全文
1 0
原创粉丝点击