[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
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.
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流程
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
- [RK3288][Android6.0] Audio的DMA调用实例流程
- [RK3288][Android6.0] Audio的音量设置流程小结
- [RK3288][Android6.0] RTC驱动的上层调用流程
- [RK3288][Android6.0] Audio录音frame rate设置流程小结
- [RK3288][Android6.0] Audio中的HW Params设置流程
- [RK3288][Android6.0] Audio录音HAL层的初始化流程分析
- [RK3288][Android6.0] Audio录音HAL层的数据读取流程分析
- [RK3288][Android6.0] ALSA的DMA buffer读写位置更新
- [RK3288][Android6.0] Audio的ASOC驱动及数据结构
- [RK3288][Android6.0] Audio的frame/period_size/bps_rate
- [RK3288][Android6.0] Audio的音量计算过程小结
- [RK3288][Android6.0] ALSA中的DMA buffer分配
- [RK3288][Android6.0] Camera驱动初始化流程
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] StageFright解码流程小结
- [RK3288][Android6.0] 串口驱动流程小结
- [RK3288][Android6.0] ION 驱动流程小结
- [RK3288][Android6.0] Camera HAL流程小结
- 【WPF】wpf笔记本
- Activity中 onResume和onPause与onStart()和onStop()的一些思考
- 补充 TOMcat 下目录的意义
- Makefile中如何根据源文件自动生成其所需要的头文件
- Java实现红包随机分配算法
- [RK3288][Android6.0] Audio的DMA调用实例流程
- Spring MVC 整合irpeort(JasperReport) 5.6 开发及问题总结
- TensorFlow神经网络优化策略
- 攻击方式学习之(4)
- Codeforces Round #414 (Div1+Div2) G Replace All (组合数学)
- 自定义TabBarView,快速实现Tab+ViewPager的Activity
- centos7 安装shadowsocks客户端
- HTML
- centos6 安装 xgboost0.6