Linux ALSA驱动框架(五)--ASoC架构中的Machine

匿名 (未验证) 提交于 2019-12-02 21:59:42
(1)
ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,Machine驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器);单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。

ASoC的一切都从Machine驱动开始,包括声卡的注册,绑定Platform和Codec驱动等等,下面就让我们从Machine驱动开始讨论吧。

(1)


arch/mips/xburst/soc-x1630/common/platform.c
};

&pd_x1830_audio_i2s_ops,

};

};


{
}

};
module_platform_driver(snd_pd_x1830_audio_driver);

通过snd_soc_card结构,又引出了Machine驱动的另外两个个数据结构:

其中,snd_soc_dai_link中,指定了Platform、Codec、codec_dai、cpu_dai的名字,稍后Machine驱动将会利用这些名字去匹配已经在系统中注册的platform,codec,dai,这些注册的部件都是在另外相应的Platform驱动和Codec驱动的代码文件中定义的,这样看来,Machine驱动的设备初始化代码无非就是选择合适Platform和Codec以及dai,用他们填充以上几个数据结构,然后注册Platform设备即可。当然还要实现连接Platform和Codec的dai_link对应的ops实现,本例就是pd_x1830_audio_i2s_ops,它只实现了hw_params函数:pd_x1830_audio_i2s_hw_params。


sound/soc/soc-core.c
{
}


分析我们probe干的活
{
}

snd_soc_register_card
{




snd_soc_initialize_card_lists(card);
//系统中所有的Codec、DAI、Platform都在注册时连接到这三个全局链表上









}

//snd_pd_x1830_audio_probe函数本身很简单,通过snd_soc_register_card,为snd_soc_pcm_runtime数组申请内存,每一个dai_link对应snd_soc_pcm_runtime数组的一个单元,然后把snd_soc_card中的dai_link配置复制到相应的snd_soc_pcm_runtime中,最后,大部分的工作都在snd_soc_instantiate_card中实现,下面就看看snd_soc_instantiate_card做了些什么:




snd_soc_instantiate_card
{
//ASoC定义了三个全局的链表头变量:codec_list、dai_list、platform_list,系统中所有的Codec、DAI、Platform都在注册时连接到这三个全局链表上。soc_bind_dai_link函数逐个扫描这三个链表,根据card->dai_link[]中的名称进行匹配,匹配后把相应的codec,dai和platform实例赋值到card->rtd[]中(snd_soc_pcm_runtime)。经过这个过程后,snd_soc_pcm_runtime:(card->rtd)中保存了本Machine中使用的Codec,DAI和Platform驱动的信息


snd_card_create

//初始化Codec的寄存器缓存,然后调用标准的alsa函数创建声卡实例


依次调用各个子结构的probe函数
//

soc_probe_link_components
soc_probe_codeccodec->driver->probe
soc_probe_platformplatform->driver->probe

//codec_dai->driver->probe



}

soc_probe_link_dais
{




//该函数出了挨个调用了codec,dai和platform驱动的probe函数外,在最后还调用了soc_new_pcm()函数用于创建标准alsa驱动的pcm逻辑设备




}

soc_new_pcm
{
}


整个Machine驱动的初始化已经完成,通过各个子结构的probe调用,实际上,也完成了部分Platfrom驱动和Codec驱动的初始化工作,整个过程可以用一下的序列图表示




soc_probe_link_components
{
soc_probe_codeccodec->driver->probe
soc_probe_platformplatform->driver->probe
}

soc_probe_link_dais
}

总结:

sound/soc/ingenic/asoc-board/pd_x1830_audio_icdc.c
&pd_x1830_audio_i2s_ops,


sound/soc/ingenic/asoc-v12/asoc-i2s-v12.c
jz_i2s_platfrom_probe,
};


sound/soc/ingenic/asoc-dma-hrtimer.c
jz-asoc-aic-dma
};


};

sound/soc/ingenic/icodec/icdc_d4.c
};








易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!