ALSA音频架构

原创 2015年07月08日 15:46:39


Codec结构体:

 

struct snd_soc_codec

{

        const char *name;

        const struct snd_soc_codec_driver *driver;

        struct snd_soc_card *card;

        struct list_head list;

        struct list_head card_list;

 

        寄存器列表

        size_t reg_size;        /* reg_cache_size * reg_word_size */

        寄存器属性判断函数

        int (*volatile_register)(struct snd_soc_codec *, unsigned int);

        int (*readable_register)(struct snd_soc_codec *, unsigned int);

        int (*writable_register)(struct snd_soc_codec *, unsigned int);

 

        寄存器读写接口

        unsigned int (*read)(struct snd_soc_codec *, unsigned int);

        int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);

}

 

Codec初始化流程:

 

rt5670_probe

 

  àsnd_soc_codec_set_cache_io               初始化寄存器读写接口        soc/soc-io.c

 

                  à codec->write = hw_write                     

                 à codec->read = hw_read

 

àrt5670_reset                                              复位Codec                                                             

 

àrt5670_reg_init                                          初始化Codec寄存器

 

àrt5670_dsp_probe                                    初始化DSP

 

 

hw_write

        àregmap_write(codec->control_data, reg, value)                 driver/base/regmap/regmap.c

hw_read

        à regmap_read(codec->control_data, reg, &val)                   driver/base/regmap/regmap.c

 

 

snd_soc_codec_set_cache_io调用后,codec可以使用以下接口来读写寄存器。

 

snd_soc_read                                                                                              soc/soc-core.c

        àcodec->read

snd_soc_write                                                                                                      soc/soc-core.c

        àcodec->write

 

snd_soc_update_bits                                                                                soc/soc-core.c

        àsnd_soc_read

        àsnd_soc_write

 

 

Codec注册流程:

 

        rt5670_i2c_probe

 

                  à snd_soc_register_codec                                                  soc/soc-core.c

 

snd_soc_codec动态创建

                       àcodec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL)

                           snd_soc_codec加入全局链表

àlist_add(&codec->list, &codec_list)                      soc/soc-core.c

 

àsnd_soc_register_dais                                                      soc/soc-core.c

 

snd_soc_dai动态创建

àdai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL)

snd_soc_dai加入全局链表

àlist_add(&dai->list, &dai_list)                       soc/soc-core.c

 

 

 

SoundCard注册流程:

 

snd_soc_register_card                                                                             soc/soc-core.c

        

        codecdai实例赋值到card->rtd

        àsoc_bind_dai_link

 

        创建card实例

àsnd_card_create

 

 

 

初始化codec

àsoc_probe_link_components

      àsoc_probe_codec

                  àdriver->probe(codec)

 

àsoc_probe_link_dais

        初始化dai

àcodec_dai->driver->probe(codec_dai)

 

àsoc_new_pcm                                                                               soc/soc-pcm.c

 

àsnd_pcm_new                                                                      core/pcm.c

                  àsnd_pcm_new_stream(capture)                                    core/pcm.c

                  àsnd_pcm_new_stream(playback)                         core/pcm.c

        àsnd_pcm_set_ops                                                               core/pcm-lib.c

 

àsnd_card_register                                                                        init.c

 

        àsnd_device_register_all     

                  à调用设备各自的注册函数

 

 

SoundCard注册完成后:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


PCM注册流程:

 

 

snd_pcm_dev_register                                                                    core/pcm.c

        

        注册snd_pcm_f_ops                                                              core/pcm_native.c

à snd_register_device_for_dev             

 

        alsa-lib会调用到snd_pcm_f_ops中的接口

 

 

ALSA架构layer:

 

 

 

 

 


SOC-layer API:

 

platform driver调用以下API初始化codec

snd_soc_dai_set_fmt                                                                                soc/soc-core.c

snd_soc_dai_set_pll                                                                                  soc/soc-core.c

snd_soc_dai_set_sysclk                                                                           soc/soc-core.c

snd_soc_dai_set_clkdiv                                                                            soc/soc-core.c

 

codec调用以下API读写寄存器

snd_soc_read                                                                                              soc/soc-core.c

snd_soc_write                                                                                                      soc/soc-core.c

snd_soc_update_bits                                                                              soc/soc-core.c

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【转】Linux音频驱动之一:ALSA架构简介

一. 概述   ALSA 是 Advanced Linux Sound Architecture 的缩写,目前已经成为了 Linux 的主流音频体系结构,想了解更多的关于 ALSA 的这一开源项目...

ALSA下音频驱动架构

ALSA下音频架构 ALSA是什么

alsa音频架构1

第一部分 alsa子系统关键结构体对象等 1.声卡设备类型定义 #define SNDRV_DEV_TOPLEVEL ((__force snd_device_type_t) 0) #define...

Android ALSA音频系统架构分析(1)----从Loopback了解Audio

Android音频系统是一套基于Linux ALSA上二次封装开发的一套音频系统,中间进行了很多的功能封装,但最终会用到Linux ALSA。所以在Hal层的类名都会包含ALSA。对于MTK的Andr...

alsa音频架构4-声卡控制

第十五部分 声卡控制接口 前面第一篇中讲到了每注册一个声卡都会创建注册一个对应的声卡控制设备,并给出了其操作函数集snd_ctl_f_ops, 在"amixer,aplay,arecord的使用"...

alsa音频架构3-pcm

第十四部分 snd_pcm 1.pcm结构体 struct snd_pcm { struct snd_card *card; //声卡 struct list_head list; int ...

ALSA框架介绍-音频通路

  • 2014-07-07 10:10
  • 404KB
  • 下载

ALSA 0.9.0 HOWTO -- 基本PCM音频

1. 介绍 这个HOWTO计划提供一个简短的介绍,使用ALSA 0.9.0写一个简单的音频应用程序. Section2解释了PCM音频最基本的函数.如果你删除其中的解释文本,那么最后你会得...

S3C2440上ALSA音频驱动

  • 2008-12-22 12:22
  • 18KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)