ALSA Soc音频驱动分析

    技术2022-05-19  21

    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 设置为设备驱动的私有数据。


    最新回复(0)