linux系统audio dma框架刨析

 

  • DMA 系统总体框架

1. 分析linux audio dma的框架之前, 首先我们需要从物理层面来看linux dma通用的框架。 

DMA controller: 用来描述系统中总的DMA硬件的基本信息, 软件层面对应dma controller driver

DMA device:隶属于DMA controller, 表示挂在DMA controller下物理硬件, 一般和slave device通过DMA 物理总线相连。

DMA channel:隶属于DMA devcie, 每个dma slave 外设需要向对应的 DMA device申请一个或多个channel,来进行数据传递。

 

 

2. DMA软件框架

去掉大刮号部分就是通用的DMA 软件框架。 audio部分已经有前辈为我们开发了一套衔接DMA engine和 DMA driver的框架(见大刮号),我们直接乘凉就好了!

 

  • DMA controller driver流程

1. 定义 struct dma_device, 我这里为方便说明,对内核当中的struct dma_device进行了裁剪,如下所示:

2. 填充 struct dma_device关键的函数

device_alloc_chan_resources      // slave driver会通过这个函数来申请channel

device_free_chan_resources      // 释放chanel

device_prep_dma_cyclic            // 音频使用这个来submit dma buffer

device_config                             // 配置 src addr/dest addr, src_addr_width, dst_addr_width 等等信息

device_terminate_all                  // 结束数据传输

device_issue_pending                // 等待dma硬件使能

 

3.  分配 dma device下面的通道个数, 申请struct dma_chan 的资源,注册中断处理程序等等

 

4.  注册dma_device到 dma engine当中去, 使用函数dmaenginem_async_device_register

  • a .为dma_device申请dev_id, 注意每个dma device使用唯一的id, 系统id从0开始自动增加。
  • b. 遍历挂在dma_device上的所有channel,  这里的channel属于dma_device的设备, 其命名规则为: dma%dchan%d; 第一个%d表示dma_device申请的dev_id, 第二个%d表示channel的id,channel id 默认也是从0开始自动增加。 假如我们是系统中第一个注册的dma_device,拥有2个channel, 那么此dma devcie下的channel名字应为: dma0chan0  dma0chan1
  • c.把dma_device添加到全局链表dma_device_list

5 . of_dma_controller_register 将你的dma_device 节点, 增加到of_dma_list全局链表, 便于dma slave devcie来寻找

 

  • Audio DMA slave driver 基本流程

audio slave driver的编写我们需要做的事情很少, 因为已经audio domain的maintainer为我们写好了框架, 我们只需要定义一些基本的配置,然后使用Soc-generic-dmaengine-pcm.c 里面的注册函数,就可以让你的dma driver和系统的DMA engine衔接起来。

 

1. 定义 struct snd_dmaengine_pcm_config

 

2. 需要把你的slave driver在dts里面指定使用的dma device节点, dmas, dma-names 必须给出来!

audio_slave_driver {
        compatible = "xxx, audio_dma_slave0";
        dmas = <&dmadevice 0
                &dmadevice 1 >;
        dma-names = "tx", "rx";
 };

 

3. 使用snd_dmaengine_pcm_register注册到dma engine当中去。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值