ALSA SOC架构

从下到上,依次是ALSA driver、ALSA lib、ALSA application:

ALSA application包括aplay、arecord,他们属于ALSA utils的工具。这些工具用于测试驱动非常的好。

ALSA lib提供诸如打开,关闭,播放的函数库。

ALSA driver是后来才加入了对SOC的支持,并且将hardware audio codec的控制抽象出来,放在sound/soc/codecs的目录里。而和SOC硬件相关的代码抽象出来放在omap目录里(加入SOC是omap)。这种分离式的设计使得一个codec的代码,在不做任何修改的情况下,可以对应很多的SOC。

ALSA的SOC中的一个大家伙,就是DAPM (Dynamic Audio Power Management),它将电源划分为4个域:

1 Codec domain - VREF, VMID (core codec and audio power) Usually controlled at codec probe/remove and suspend/resume, although can be set at stream time if power is not needed for sidetone, etc.

2 Platform/Machine domain - physically connected inputs and outputs Is platform/machine and user action specific, is configured by the machine driver and responds to asynchronous events e.g when HP are inserted.

3 Path domain - audio susbsystem signal paths. Automatically set when mixer and mux settings are changed by the user. e.g. alsamixer, amixer.

4 Stream domain - DACs and ADCs. Enabled and disabled when stream playback/capture is started and stopped respectively. e.g. aplay, arecord.

对于codec domain,它位于sound/soc/codecs目录下,例如wm9713.c。

对于Platform/Machine domain,他放在machine名字的目录里,如sound/soc/s3c24xx目录下neo1973_wm9753.c,以机器名和codec的名字同时命名。

在定义codec的audio path的时候,你需要知道这样的背景知识,DAPM在概念上分为以下部件:

  • Mixer      - Mixes several analog signals into a single analog signal.混合
  • Mux        - An analog switch that outputs only one of many inputs.切换
  • PGA        - A programmable gain amplifier or attenuation widget.可编程增益幅度或衰减部件
  • ADC        - Analog to Digital Converter
  • DAC        - Digital to Analog Converter
  • Switch     - An analog switch
  • Input      - A codec input pin
  • Output     - A codec output pin
  • Headphone  - Headphone (and optional Jack)耳机
  • Mic        - Mic (and optional Jack)
  • Line       - Line Input/Output (and optional Jack)
  • Speaker    - Speaker
  • Pre        - Special PRE widget (exec before all others)
  • Post       - Special POST widget (exec after all others)

对于path上输入的开始端点,它只需要输出到下一个部件就好。同理对于path上输出的端点,它只需要从前一个部件输入就好。path的头尾端点就是用SND_SOC_DAPM_INPUT或者SND_SOC_DAPM_OUTPUT定义这个部件。codec中都有混音器,它总是把多个输入加和为一个输出信号,他就由SND_SOC_DAPM_MIXER定义。codec中也会有一些多路开关,他是有多个输入,但是只有一个输入可以和输出接通,这样的部件由SND_SOC_DAPM_MUX定义。PGA就如它在硬件中的名字,一般就是一个输入,和一个输出。用SND_SOC_DAPM_PGA定义。Audio Codec中有许多部件,并且可以是任意的名字,ALSA怎么可能知道该如何操作这些部件来切换到你想要的路径,即时ALSA lib也不会关心这部分内容,这些细微的切换由ALSA application以上来完成,ALSA lib也最多提供各种操作mixer或者Mux的函数,如果切换是你应用的事情。

对部件的操作函数是snd_mixer_selem_set_enum_item(),alsamixer也是通过这个函数达到切换的目的。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. Soc audio driver module
        注册一个
name为”soc-audio”的驱动程序soc_driver

       platform_driver_register(soc_driver)

       static struct platform_driver soc_driver = {

       .driver            = {

              .name             = "soc-audio",

       },

       .probe            = soc_probe,

       .remove          = soc_remove,

       .suspend  = soc_suspend,

       .resume          = soc_resume,

};

       Soc_driver的主要函数是soc_probe(),这个函数主要用来获取设备结构体 struct snd_soc_device. 然后执行这个结构体里面的一些成员(snd_soc_machine, snd_soc_platform, soc_codec_device)probe()函数来挂载驱动程序。

       static int soc_probe(struct platform_device *pdev)

{

       struct snd_soc_device *socdev = platform_get_drvdata(pdev);

       struct snd_soc_machine *machine = socdev->machine;

       struct snd_soc_platform *platform = socdev->platform;

       struct snd_soc_codec_device *codec_dev = socdev->codec_dev;

             

              machine->probe(pdev);

              platform->probe(pdev);

              codec_dev->probe(pdev);

              ... ...

       }

2. Soc audio device module

       这部分涉及到IIS或者AC97音频接口、PCM接口以及相应的Codec芯片接口。IISAC97以及PCM相关的文件都在sound/soc/s3c24xx/文件夹下,Codec芯片接口文件在sound/soc/codecs文件夹下。

       这些接口声明在include/sound/soc.h文件,最后都归在设备结构体struct snd_soc_device里面,struct snd_soc_device定义如下:

       /* SoC Device - the audio subsystem */

struct snd_soc_device {

       struct device *dev;

       struct snd_soc_machine *machine;

       struct snd_soc_platform *platform;

       struct snd_soc_codec *codec;

       struct snd_soc_codec_device *codec_dev;

       struct delayed_work delayed_work;

       void *codec_data;

};

       编写音频驱动需要创建一个name”soc-audio”platfomr_device,然后通过platform_set_drvdata函数,把定义好的struct snd_soc_device设置为设备驱动的私有数据。


3. Soc audio driver files

       下面简要介绍一下各个文件夹下的几个主要文件的内容和目的。

       Sound/soc/soc-core.c  [MODULE]

              注册驱动程序stuct platform_driver soc_driver{... };同时EXPORT一些通用的函数,如pcm相关的一些函数。

       Sound/soc/s3c24xx/s3c24xx-i2s.c

              EXPORT接口结构体 struct snd_soc_cpu_dai s3c24xx_i2s_dai = {... },主要用于IIS接口设置和控制。

       Sound/soc/s3c24xx/s3c24xx-pcm.c

              EXPORT接口结构体struct snd_soc_platform s3c24xx_soc_platform = {... },主要是PCMoperations

       需要编写的文件:

       Sound/soc/codecs/xxx.c  xxx.h

              定义struct snd_soc_codec_dai struct snd_soc_codec_device

       Sound/soc/s3c24xx/chipxxx_codecxxx.c            [MODULE]

              利用前述文件中的接口创建设备结构体struct snd_soc_device s3c2410_snd_devdata创建并注册一个name”soc-audio”的设备:struct platform_device ,注意需要调用platform_set_drvdata函数,把定义好的struct snd_soc_device 设置为设备驱动的私有数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值