Linux ALSA聲卡驅動之四:machine和dai_link的作用和實現

一、模塊化管理

        alsa音頻驅動模塊化管理,是linux驅動比較典型的代碼架構,app調用snd_pcm_open、snd_pcm_writei、snd_pcm_readi等接口到alsa_lib後,也根據一系列的操作(具體詳細調用以及設備節點的操作下節會詳細解釋)後,調用到alsa_soc,這也是alsa驅動架構的核心,一般情況下,這個alsa_soc基本不會變,從而調用到soc_pcm_open、soc_pcm_prepare、soc_pcm_trigger、soc_pcm_ioctl等接口,這裏面接口中會有platform->driver->ops、cpu_dai->driver->ops具體的操作,也即對i2s、wm8960、pcm音頻流操作等一系列操作,然後這些驅動以模塊化的方式通過dai_link銜接進來,如果將來需要更換codecs或者說換cpu,只需要以模塊化的方式更換相應的驅動模塊就OK了,這就是alsa驅動模塊化管理機制。

二、machine以及dai_link的內容

        位於mt76xx_machine.c文件中,其實這塊功能即跟硬件設備的銜接,上面說過,具體的plaform、cpu_dai、codec_dai是什麼,如何銜接進alsa_soc裏面,都是這個文件決定的,先看代碼,代碼如下

上圖看着眼熟,https://blog.csdn.net/moonlinux20704/article/details/88354115已經說過,這個主要是platform_device的註冊,先別急,再往下看

       在申請名字爲"soc-audio"的platform_device時候,傳遞了一個私有參數,即mtk_audio_card,這裏面有個.dai_link的結構體,裏面包含了cpu_dai_name、codec_dai_name、platform_name,注意alsa-soc調用哪些driver,就是靠這些名字進行識別匹配。如果更換codecs芯片方案或者換cpu,只需把這裏相應的名字修改掉,然後把相應的driver更換掉,就可以直接使用。

三、alsa驅動的入口以及dai的綁定

        在https://blog.csdn.net/moonlinux20704/article/details/88354115裏提到過,有四個platform_device進行註冊,我們今天就說一說mt76xx_audio_device,設備名爲"soc-audio",而相應的platform_driver在sound/soc/soc-core.c裏面,如下圖

       注意,card就是我們上面說的&mtk_audio_card,因爲作爲私有指針傳遞給platform_device結構體裏了,這裏不詳細解釋。

        在snd_soc_instantiate_card裏有這樣一個函數soc_bind_dai_link,這很重要,是綁定dai的作用,進去詳細分析一下

        上面提到過struct snd_soc_card *card參數也就是mt76xx_machine.c文件裏定義的&mtk_audio_card,在cpu_dai_component.dai_name = dai_link->cpu_dai_name之後snd_soc_find_dai(&cpu_dai_component),即實現了在&component_list爲頭的鏈表裏搜索名字爲dai_link->cpu_dai_name的component,然後就查到對應的struct snd_soc_dai *dai,這個過程如果不太熟悉,就回頭詳細看看上一章節https://blog.csdn.net/moonlinux20704/article/details/88417361,就明白對應的關係。同理rtd->cpu_dai、rtd->codec_dai、rtd->platform都對應上之前提前註冊好的struct snd_soc_dai *dai或者struct snd_soc_platform *platform,struct snd_soc_pcm_runtime *rtd 是card裏面的一個結構體,這個結構體也蠻重要的,後面會詳細解釋,本章暫時不提。

四、cpu_dai、codec_dai、platform的調用

        在下面的soc_probe_link_dais->soc_new_pcm中

        可以看到,每一個接口裏,都會調用cpu_dai->driver->ops、platform->driver->ops、codec_dai->driver->ops這三種系列的驅動,這就形成了上面說的模塊化管理,這裏已經算是alsa-soc部分了,上層應用調用後,到這裏,然後再一一調用之前已經提前註冊好的相應的驅動,如果改天更換wm8960芯片,只需要把codec_dai->driver做相應的修改。模塊化的修改,更少的影響整體的架構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章