ALSA Soc音频驱动分析

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux音频驱动开发涉及到配置和编译内核,以及设备树的配置。首先,需要重新编译Linux内核,并使用新的zImage和.dtb文件启动系统。在系统启动过程中,如果设备树和驱动都使能的话,会打印出ALSA设备列表,其中包括"wm8960-audio"这个声卡。此外,在/dev/snd目录下会有一些与ALSA音频驱动框架对应的设备文件。 要使能内核自带的WM8960驱动,可以通过图形化界面配置。使用命令"make menuconfig"打开Linux内核的图形化配置界面。在配置界面中,需要取消ALSA模拟OSS API的选择,并使能I.MX6ULL的WM8960驱动。具体路径如下: - 取消ALSA模拟OSS API:Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> <> OSS Mixer API //不选择 -> <> OSS PCM (digital audio) API //不选择 - 使能I.MX6ULL的WM8960驱动:Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> ALSA for SoC audio support -> SoC Audio for Freescale CPUs -> <*> Asynchronous Sample Rate Converter (ASRC) module support //选中 -> <*> SoC Audio support for i.MX boards with wm8960 //选中 完成内核和设备树的重新编译后,可以在开发板根文件系统的/etc/profile文件中加入以下内容来指定ALSA的配置文件路径: export ALSA_CONFIG_PATH=/usr/share/arm-alsa/alsa.conf 至此,完成了音频驱动的配置和编译。接下来可以进行音频驱动的测试,包括声卡设置和测试。 #### 引用[.reference_title] - *1* *2* *3* [Linux驱动开发|音频驱动](https://blog.csdn.net/Chuangke_Andy/article/details/122494425)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值