Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介

ALSA声卡驱动:

           1.Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介

            2.Linux ALSA声卡驱动之二:Platform

            3. Linux ALSA声卡驱动之三:Platform之Cpu_dai

            4. Linux ALSA声卡驱动之四:Codec 以及Codec_dai

            5.Linux ALSA声卡驱动之五:Machine 以及ALSA声卡的注册

            6.Linux ALSA声卡驱动之六:PCM的注册流程

            7.Linux ALSA声卡驱动之七:录音(Capture) 调用流程

 

 

 

 

一.  ALSA 简介

       

ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/。

    在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

    Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介_第1张图片

用户空间的alsa-lib对应用程序提供统一的API接口,这样可以隐藏了驱动层的实现细节,简化了应用程序的实现难度。内核空间中,alsa-soc其实是对alsa-driver的进一步封装,他针对嵌入式设备提供了一些列增强的功能

Kernel-4.4/sound/core该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分。

Kernel-4.4/sound/soc 针对system-on-chip体系的中间层代码

 

1.2 ALSA驱动代码文件结构  

 sound
           /aoa    苹果主板驱动
           /arm     arm架构相关驱动
           /atmel     atmel设备驱动
           /core      该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分
           /drivers    不同架构中一些驱动共享文件放置一些与CPU、BUS架构无关的公用代码
           /i2c        ALSA自己的I2C控制代码
           /isa       isa声卡的上层模块
           /mips      MIPS声卡设备驱动
           /oos       oos架构
           /parisc    gsc声卡驱动
            /pci       pci声卡
            /ppc      powerPC架构有关
            /sh      SUPERH声卡驱动
            /soc   system-on-chip
            /sparc    Sparc声卡驱动
            /synth     synth中间层
            /usb     usb-audio驱动

从上面驱动代码结构中我们可以知道,我们主要关心core和soc文件夹里面的代码

 

 

1.3 ALSA设备文件结构

    1.3.1    /dev/snd        ls -l

    crw-rw---- 1 system audio  14,  12 2020-03-09 06:40 adsp
crw-rw---- 1 system audio  14,   4 2020-03-09 06:40 audio
crw-rw---- 1 system audio 116,   2 2020-03-09 06:40 controlC0
crw-rw---- 1 system audio  14,   3 2020-03-09 06:40 dsp
crw-rw---- 1 system audio  14,   0 2020-03-09 06:40 mixer
crw-rw---- 1 system audio 116,   3 2020-03-09 06:40 pcmC0D0p
crw-rw---- 1 system audio 116,  19 2020-03-09 06:40 pcmC0D10c
crw-rw---- 1 system audio 116,  20 2020-03-09 06:40 pcmC0D11p
crw-rw---- 1 system audio 116,  21 2020-03-09 06:40 pcmC0D12p
crw-rw---- 1 system audio 116,  22 2020-03-09 06:40 pcmC0D13c
crw-rw---- 1 system audio 116,  23 2020-03-09 06:40 pcmC0D14c
crw-rw---- 1 system audio 116,  24 2020-03-09 06:40 pcmC0D15p
crw-rw---- 1 system audio 116,  25 2020-03-09 06:40 pcmC0D16c
crw-rw---- 1 system audio 116,  26 2020-03-09 06:40 pcmC0D17c
crw-rw---- 1 system audio 116,  28 2020-03-09 06:40 pcmC0D18c
crw-rw---- 1 system audio 116,  27 2020-03-09 06:40 pcmC0D18p
crw-rw---- 1 system audio 116,  29 2020-03-09 06:40 pcmC0D19p
crw-rw---- 1 system audio 116,   4 2020-03-09 06:40 pcmC0D1c
crw-rw---- 1 system audio 116,  30 2020-03-09 06:40 pcmC0D20p
crw-rw---- 1 system audio 116,  31 2020-03-09 06:40 pcmC0D21p
crw-rw---- 1 system audio 116,  35 2020-03-09 06:40 pcmC0D22c
crw-rw---- 1 system audio 116,  34 2020-03-09 06:40 pcmC0D22p
crw-rw---- 1 system audio 116,  37 2020-03-09 06:40 pcmC0D23c
crw-rw---- 1 system audio 116,  36 2020-03-09 06:40 pcmC0D23p
crw-rw---- 1 system audio 116,  38 2020-03-09 06:40 pcmC0D24p
crw-rw---- 1 system audio 116,   6 2020-03-09 06:40 pcmC0D2c
crw-rw---- 1 system audio 116,   5 2020-03-09 06:40 pcmC0D2p
crw-rw---- 1 system audio 116,   8 2020-03-09 06:40 pcmC0D3c
crw-rw---- 1 system audio 116,   7 2020-03-09 06:40 pcmC0D3p
crw-rw---- 1 system audio 116,  10 2020-03-09 06:40 pcmC0D4c
crw-rw---- 1 system audio 116,   9 2020-03-09 06:40 pcmC0D4p
crw-rw---- 1 system audio 116,  12 2020-03-09 06:40 pcmC0D5c
crw-rw---- 1 system audio 116,  11 2020-03-09 06:40 pcmC0D5p
crw-rw---- 1 system audio 116,  14 2020-03-09 06:40 pcmC0D6c
crw-rw---- 1 system audio 116,  13 2020-03-09 06:40 pcmC0D6p
crw-rw---- 1 system audio 116,  16 2020-03-09 06:40 pcmC0D7c
crw-rw---- 1 system audio 116,  15 2020-03-09 06:40 pcmC0D7p
crw-rw---- 1 system audio 116,  17 2020-03-09 06:40 pcmC0D8p
crw-rw---- 1 system audio 116,  18 2020-03-09 06:40 pcmC0D9p
crw-rw---- 1 system audio 116,   1 2020-03-09 06:40 seq
crw-rw---- 1 system audio  14,   1 2020-03-09 06:40 sequencer
crw-rw---- 1 system audio  14,   8 2020-03-09 06:40 sequencer2
crw-rw---- 1 system audio 116,  33 2020-03-09 06:40 timer

    controlC0 -->                 用于声卡的控制,例如通道选择,混音,麦克风的控制等
    midiC0D0  -->                用于播放midi音频
   pcmC0D10c --〉               用于录音的pcm设备:pcm:pcm设备  ,C0:声卡号0,一般设备就一个声卡      D10  设备号是10    c:capture   录音  如果是p:play 播放 。
    pcmC0D11p --〉               用于播放的pcm设备
    seq  --〉                        音序器
   timer --〉                       定时器

 

      1.3.2   /sys/devices/platform/soc-audio        ls -l

         

       drwxr-xr-x 3 root root 0 2020-03-09 06:40 DEEP_BUFFER_DL_OUTPUT
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 DL1AWBCAPTURE
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 FM_I2S_RX_Capture
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 FM_I2S_RX_Playback
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 FM_MRG_TX
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 HDMI_OUT
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 HP_IMPEDANCE
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 I2S0DL1OUTPUT
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 I2S0OUTPUT
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 I2S0_AWB_CAPTURE
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 MRGRX
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 MRGRXCAPTURE
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 MultiMedia1
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 MultiMedia2
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 MultiMedia3
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 MultiMedia_DL2
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 PLATOFRM_CONTROL
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 TDM_Debug_CAPTURE
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 ULDLOOPBACK
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 VOIP_CALL_BT_CAPTURE
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 VOIP_CALL_BT_PLAYBACK
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 Voice_MD1
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 Voice_MD1_BT
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 Voice_MD2
       drwxr-xr-x 3 root root 0 2020-03-09 06:40 Voice_MD2_BT
       lrwxrwxrwx 1 root root 0 2020-03-09 08:27 driver -> ../../../bus/platform/drivers/soc-audio
      drwxr-xr-x 2 root root 0 2020-03-09 06:40 power
      drwxr-xr-x 3 root root 0 2020-03-09 06:40 sound
      lrwxrwxrwx 1 root root 0 2020-03-09 08:27 subsystem -> ../../../bus/platform

DEEP_BUFFER_DL_OUTPUT 设备名称,对于mtk平台来说是在mtk-soc-machine.c   mt_soc_dai_common 数组中定义。

 

 

  •     1.3.3   /proc/asound/card0    查看声卡0下面挂载的设备

    

 id        pcm10c pcm13c pcm16c pcm18p pcm20p pcm22p pcm24p pcm3c pcm4p pcm6c pcm7p
oss_mixer pcm11p pcm14c pcm17c pcm19p pcm21p pcm23c pcm2c  pcm3p pcm5c pcm6p pcm8p
pcm0p     pcm12p pcm15p pcm18c pcm1c  pcm22c pcm23p pcm2p  pcm4c pcm5p pcm7c pcm9p
  •   1.3.3.1查看具体pcm设备的信息

   cd pcm10c
    ls

info sub0 xrun_debug

  cat info

card: 0
device: 10
subdevice: 0
stream: CAPTURE
id: DL1_AWB_Record mt-soc-codec-dl1awb-dai-10
name:
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1
  • 1.3.4   /proc/asound/

         Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介_第2张图片

 MultiMedia1_PLayback mt-soc-codec-tx-dai-0 :  : playback 1        

  -- MultiMedia1_PLayback:对应mt_soc_dai_common 里面的stream_name

  -- mt-soc-codec-tx-dai:对应mt_soc_dai_common 里面的codec_dai_name

--   -0 :对应mt_soc_dai_common 数组的顺序

--playback:此pcm是playback类型(播放)

--capture:此pcm是capture类型(录音)

--1  :snd_card下面顺序挂载的第几个pcm设备 ,tinycap -D 0 -d 1      -D 0 表示:声卡0 ,-d 1 表示录音的pcm设备是1号,d是device首字母。

二.  ASOC 简介

        

       ASoC把音频系统同样分为3大部分:Machine,Platform和Codec

        Platform  一般是指某一个SoC平台,比如MT6582, MT6595, MT6752等等,与音频相关的通常包含该SoC中的ClockFAEI2SDMA等等,该模块负责DMA的控制和I2S的控制, 由CPU厂商负责编写此部分代码。

Codec  字面上的意思就是编解码器, Codec 里面包含了 I2S 接口、 DAC ADC Mixer PA (功放),通常包含多种输入( Mic Line-in I2S PCM )和多个输出(耳机、喇叭、听筒, Line-out ), Codec Platform一样,是可重用的部件。该模块负责AFIx的控制和DAC部分的控制(也可以说是芯片自身的功能的控制), 由Codec厂商负责编写此部分代码
 
Machine 是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出Machine几乎是不可重用的,每个Machine上的硬件实现可能都不一样,CPU不一样,Codec不一样,音频的输入、输出设备也不一样,Machine为CPU、Codec、输入输出设备提供了一个载体 用于描述一块电路板, 它指明此块电路板上用的是哪个Platform和哪个Codec, 由电路板商负责编写此部分代码。 绑定 platform driver codec driver
 
   以下是machine  codec  platform 它们之间的关系图
 
 
                                Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介_第3张图片

 

   以上三部分还可以细分:

  •    platform:platform+cpu_dai     
  •   codec:codec+codec+codec_dai

 

你可能感兴趣的:(#,ALSA,android,alsa,soc)