1.codec部分
codec--->kernel/msm-5.4/techpack/audio/asoc/codecs/wcd937x/wcd937x.c
.compatible = "qcom,wcd937x-codec" //匹配vendor/****/proprietary/devicetree/****/yupik-audio-overlay.dtsi的同名节点
执行probe函数wcd937x_probe
component_master_add_with_match(&pdev->dev,&wcd937x_comp_ops, match);
wcd937x_bind
ret = snd_soc_register_component(dev, &soc_codec_dev_wcd937x,wcd937x_dai, ARRAY_SIZE(wcd937x_dai));
//参数:设备指针、音频组件驱动指针、DAI驱动结构体指针、DAI的数量
snd_soc_component_initialize(component, component_driver, dev);
snd_soc_add_component(component, dai_drv, num_dai);
snd_soc_register_dais(component, dai_drv, num_dai);
snd_soc_register_dai
list_add_tail(&dai->list, &component->dai_list);//将dai放入dai_list
list_add(&component->list, &component_list);//将codec放入codec_list
附:
static const struct snd_soc_component_driver soc_codec_dev_wcd937x = {
.name = WCD937X_DRV_NAME, //codec name#define WCD937X_DRV_NAME "wcd937x_codec"
.probe = wcd937x_soc_codec_probe,
.remove = wcd937x_soc_codec_remove,
.controls = wcd937x_snd_controls,
.num_controls = ARRAY_SIZE(wcd937x_snd_controls),
.dapm_widgets = wcd937x_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(wcd937x_dapm_widgets),
.dapm_routes = wcd937x_audio_map,
.num_dapm_routes = ARRAY_SIZE(wcd937x_audio_map),
};
static struct snd_soc_dai_driver wcd937x_dai[] = {
{
.name = "wcd937x_cdc",//codec_dai name
.playback = {
.stream_name = "WCD937X_AIF Playback",
.rates = WCD937X_RATES | WCD937X_FRAC_RATES,
.formats = WCD937X_FORMATS,
.rate_max = 384000,
.rate_min = 8000,
.channels_min = 1,
.channels_max = 4,
},
.capture = {
.stream_name = "WCD937X_AIF Capture",
.rates = WCD937X_RATES,
.formats = WCD937X_FORMATS,
.rate_max = 192000,
.rate_min = 8000,
.channels_min = 1,
.channels_max = 4,
},
},
};
2.machine部分
machine--->kernel/msm-5.4/techpack/audio/asoc/lahaina.c
.compatible = "qcom,lahaina-asoc-snd"//匹配vendor/****/proprietary/devicetree/****/yupik-audio.dtsi中的同名节点
populate_snd_card_dailinks(&pdev->dev);//填充dai_link
....填充snd_soc_card结构体
devm_snd_soc_register_card(&pdev->dev, card);
snd_soc_register_card(card);
snd_soc_bind_card(card);
snd_soc_instantiate_card(card);//实例化声卡
* /*bind*/
/*find cpu dai*/
/* find_codec */
/* find CODEC DAI */
/* find_platform */
//ASLA框架 * snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,card->owner, 0, &card->snd_card);
* /* probe the cpu_dai */
/* probe the CODEC */
/* probe the platform */
/* probe the CODEC DAI */
/* create the pcm */
* snd_card_register(card->snd_card);
ASOC部分
devm_snd_soc_register_card--》snd_soc_register_card--》snd_soc_bind_card--》snd_soc_instantiate_card
最后一路调用到snd_card_new和snd_card_register体现了ASOC框架是建立在ALSA框架的基础之上
附:
static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
....
{/* hw:x,39 */
.name = LPASS_BE_TX_CDC_DMA_TX_5,
.stream_name = "TX CDC DMA5 Capture",
.id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_5,
.be_hw_params_fixup = msm_be_hw_params_fixup,
.ignore_suspend = 1,
.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
.ops = &msm_cdc_dma_be_ops,
SND_SOC_DAILINK_REG(tx_cdcdma5_tx),
},
.....
};
SND_SOC_DAILINK_DEFS(tx_cdcdma5_tx,
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45115")),
DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx3"),
// COMP_CODEC("wcd938x_codec", "wcd938x_cdc"),
COMP_CODEC("wcd937x_codec", "wcd937x_cdc")),//匹配codec name和codec_dai name
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
#define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...) \
SND_SOC_DAILINK_DEF(name##_cpus, cpu); \
SND_SOC_DAILINK_DEF(name##_codecs, codec); \
SND_SOC_DAILINK_DEF(name##_platforms, platform)
#define DAILINK_COMP_ARRAY(param...) param
#define COMP_EMPTY() { }
#define COMP_CPU(_dai) { .dai_name = _dai, }
#define COMP_CODEC(_name, _dai) { .name = _name, .dai_name = _dai, }
#define COMP_PLATFORM(_name) { .name = _name }
#define COMP_AUX(_name) { .name = _name }
#define COMP_DUMMY() { .name = "snd-soc-dummy", .dai_name = "snd-soc-dummy-dai", }
#define for_each_card_prelinks(card, i, link) \
for ((i) = 0; \
((i) < (card)->num_links) && ((link) = &(card)->dai_link[i]); \
(i)++)
#define for_each_card_pre_auxs(card, i, aux) \
for ((i) = 0; \
((i) < (card)->num_aux_devs) && ((aux) = &(card)->aux_dev[i]); \
(i)++)
06-22
969
06-21
362
07-29
912
02-25
6042
06-10
414
03-02
1万+
12-16
2176