【Audio driver】声卡名字的由来

声卡名字的获取其实很简单,追究到底就是从device tree中找到对应的节点,然后获取定义好的值就ok了。

首先找到自己的对应的音频驱动文件,我用的是sdm660的板子,所以使用的文件是sdm660-internal.c

static int msm_internal_init(struct platform_device *pdev,
			     struct msm_asoc_mach_data *pdata,
			     struct snd_soc_card *card)

{
	``````
	ret = snd_soc_of_parse_card_name(card, "qcom,model");
	``````
}

这里直接使用snd_soc_of_parse_card_name函数在dt(device tree)中找到“qcom,model”的值DT中定义的sdm660默认声卡名

简单看下snd_soc_of_parse_card_name函数的内容

/* Retrieve a card's name from device tree */
int snd_soc_of_parse_card_name(struct snd_soc_card *card,
			       const char *propname)
{
	struct device_node *np;
	int ret;

	if (!card->dev) {
		pr_err("card->dev is not set before calling %s\n", __func__);
		return -EINVAL;
	}

	/*1.获取设备节点*/
	np = card->dev->of_node;

	/*2.查找到propname对应的值,然后存入card->name。 propname = "qcom,model"*/
	ret = of_property_read_string_index(np, propname, 0, &card->name);
	/*
	 * EINVAL means the property does not exist. This is fine providing
	 * card->name was previously set, which is checked later in
	 * snd_soc_register_card.
	 */
	if (ret < 0 && ret != -EINVAL) {
		dev_err(card->dev,
			"ASoC: Property '%s' could not be read: %d\n",
			propname, ret);
		return ret;
	}

	return 0;
}
EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name);

of_property_read_string_index()参考文章

至此声卡名字就从DT中读取出来了,存在snd_soc_card类型中。

顺便提一下,card->dev->of_node是怎么来的

msm_asoc_machine_probe
|-of_match_node		匹配节点(compatible)
|-msm_int_cdc_init		内部codec
	|-msm_int_populate_sndcard_dailinks	初始化声卡信息,of_node就是在这里初始化的
	|-msm_internal_init
		|-snd_soc_of_parse_card_name		获取声卡名字

需要注意的是,在msm_int_populate_sndcard_dailinks 函数中会预先初始化card name,在之后的函数调用中又会从dt中取出card name对之前的定义的进行覆盖,最终以dt中的cardname为准

static struct snd_soc_card *msm_int_populate_sndcard_dailinks(
						struct device *dev)
{
	struct snd_soc_card *card = &sdm660_card;

	/*msm_int_dai存入msm_int_dai_links数组*/
	memcpy(msm_int_dai_links, msm_int_dai, sizeof(msm_int_dai));

	
}

注意:修改声卡名字除了要修改dt,也要修改platform_init.c还有hw_info.c。

你可能感兴趣的:(audio)