基于mini2440的Linux音频驱动完全解读(三)——ASoc层的初始化(2)

下面就看看上面提到的两个链表platform和dai_list。

先看platform

搜索platform,发现在函数snd_soc_register_platform中,将snd_soc_platform类型的变量加入到了这个链表,现在就要看是谁调用了snd_soc_register_platform这个函数。之后,在s3c24xx_soc_platform_init中找到了调用这个函数的代码,s3c24xx_soc_platform_init是一个用module_init修饰的模块初始化函数。

在这里,向内核注册的snd_soc_platform类型的变量为:

struct snd_soc_platform s3c24xx_soc_platform = {
	.name		= "s3c24xx-audio",
	.pcm_ops 	= &s3c24xx_pcm_ops,
	.pcm_new	= s3c24xx_pcm_new,
	.pcm_free	= s3c24xx_pcm_free_dma_buffers,
};

下面分析函数snd_soc_register_platform,看看是怎么注册的。

int snd_soc_register_platform(struct snd_soc_platform *platform)
{
	if (!platform->name)
		return -EINVAL;

	INIT_LIST_HEAD(&platform->list);

	mutex_lock(&client_mutex);
	list_add(&platform->list, &platform_list);
	snd_soc_instantiate_cards();
	mutex_unlock(&client_mutex);

	pr_debug("Registered platform '%s'\n", platform->name);

	return 0;
}

看了这个函数之后,发现和snd_soc_register_card一样,也调用了snd_soc_instantiate_cards这个函数,也就是又执行了一遍snd_soc_instantiate_card中匹配的过程。

 

再看dai_list这个链表。链表dai_list中的节点是在函数snd_soc_register_dai中添加的。模块初始化函数uda134x_init调用了snd_soc_register_dai,向内核注册一个snd_soc_dai类型的变量uda134x_dai。

struct snd_soc_dai uda134x_dai = {
	.name = "UDA134X",
	/* playback capabilities */
	.playback = {
		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值