rk3399 simple-card alsa架构分析
一、 概念
來進行數據的搬運。(其實是包含在platform層中)
關,以達到保證功能的前提下功耗盡量小。
主要理解核心思想是alsa將底層硬件的不同做了抽象分別是cpu digital audio interface的不同,聲卡codec的不同,以及如何將這兩者進行關聯的中介machine driver :dai link,通常名字是chipName_codecName.c;
simple_card架構即是簡單通用的machine driver即dai_link
二、代碼結構
| Sound soc | 主要包含公共部分代碼,包括dapm 控制, jack, dmaengine,core 等等 | sound/soc/ |
| rockchip platform | Rockchip 平臺的 cpu dai 的驅動,比如 I2S, spdif 等以及自定義聲卡machine driver | sound/soc/rockchip |
| generic platform | simple card framework | sound/soc/generic |
| codec driver | 所有的 codec driver 存放位置 | sound/soc/codecs |
開發步驟
一個聲卡包含 cpu_dai, codec_dai, 以及 dai_link 組成,分別對應 cpu dai 的 dirver,比如I2S driver, spdif driver; codec driver, 比如 rk817 codec driver; dai_link driver,也就是 machine driver, 比如 sound/soc/rockchip/rockchip_rt5640.c。 4.4 的內核中支持兩種方式創建聲卡,一種是通用的 simple-card framework,一種是傳統的編寫自定義的 machinedriver 來創建。 本文以 rk817 為例。
5、分析simple-audio-card實現
首先通過打印大致看看:
[ 2.527416] asoc-simple-card rk809-sound: New simple-card: rockchip,rk809-codec [ 2.527458] asoc-simple-card rk809-sound: Revert to legacy daifmt parsing [ 2.527681] asoc-simple-card rk809-sound: name : ff890000.i2s-rk817-hifi [ 2.527702] asoc-simple-card rk809-sound: format : 4001 [ 2.527721] asoc-simple-card rk809-sound: cpu : ff890000.i2s / 0 [ 2.527739] asoc-simple-card rk809-sound: codec : rk817-hifi / 0 [ 2.527761] of_get_named_gpiod_flags: can't parse 'simple-audio-card,hp-det-gpio' property of node '/rk809-sound[0]' [ 2.527782] of_get_named_gpiod_flags: can't parse 'simple-audio-card,mic-det-gpio' property of node '/rk809-sound[0]' [ 2.536256] asoc-simple-card rk809-sound: rk817-hifi <-> ff890000.i2s mapping ok [ 2.536953] asoc-simple-card rk809-sound: ASoC: no source widget found for MICBIAS1 [ 2.537668] asoc-simple-card rk809-sound: ASoC: Failed to add route MICBIAS1 -> direct -> Mic Jack [ 2.538485] asoc-simple-card rk809-sound: ASoC: no sink widget found for IN1P [ 2.539150] asoc-simple-card rk809-sound: ASoC: Failed to add route Mic Jack -> direct -> IN1P [ 2.539924] asoc-simple-card rk809-sound: ASoC: no source widget found for HPOL [ 2.540594] asoc-simple-card rk809-sound: ASoC: Failed to add route HPOL -> direct -> Headphone Jack [ 2.541425] asoc-simple-card rk809-sound: ASoC: no source widget found for HPOR [ 2.542098] asoc-simple-card rk809-sound: ASoC: Failed to add route HPOR -> direct -> Headphone Jack [ 2.544603] input: rockchip,rk809-codec Headphone Jack as /devices/platform/rk809-sound/sound/card1/input4kernel/sound/soc/generic/simple-card.c
函數調用順序大致如下:
通過driver platform框架我們可以知道下面會調用probe函數
asoc_simple_card_probeasoc_simple_card_parse_ofsnd_soc_of_parse_card_name(&priv->snd_card, "simple-audio-card,name");//拿到卡的名字即dts中rockchip,rk809-codec/* For single DAI link & old style of DT node */asoc_simple_card_dai_link_of //連接cpu dai與codec daiasoc_simple_card_sub_parse_of(cpu, &dai_props->cpu_dai,&dai_link->cpu_of_node,&dai_link->cpu_dai_name,&cpu_args); //拿到cpu daiasoc_simple_card_sub_parse_of(codec, &dai_props->codec_dai,&dai_link->codec_of_node,&dai_link->codec_dai_name, NULL;//拿到codec dai//soc/soc-core.c +3606of_parse_phandle_with_args(of_node, "sound-dai","#sound-dai-cells", 0, &args);//#sound-dai-cells 在dts中是0,即rk817_codec.c中的struct snd_soc_dai_driver rk817_dai[0]節點 即rk817-hifi。snd_soc_of_get_dai_name(np, name); //拿到dai name//注冊聲卡 snd_soc_card_set_drvdata(&priv->snd_card, priv);ret = devm_snd_soc_register_card(&pdev->dev, &priv->snd_card);這個達到的效果跟machine driver是一樣的,只不過這個屬于讀取dts然后批量注冊聲卡,更加簡單高效。
總結
以上是生活随笔為你收集整理的rk3399 simple-card alsa架构分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: org.apache.ibatis.bi
- 下一篇: java项目宕机出现原因,java服务宕