ASOC驱动框架

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)++) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值