声卡的操作实质剖析1
看看snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
对于每个声卡都得调用这个函数,并且参数都是如此,所以这个函数式共性的。
这个函数第一个函数ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card);
1、分配:struct snd_card *card; card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL);
2、申请该卡snd_card的id号:if (!slots[idx2] || !*slots[idx2]) idx = idx2;
3、锁住申请的id号:snd_cards_lock |= 1 << idx;
4、设置snd_card结构体:card->number = idx;card->module = module;
INIT_LIST_HEAD(&card->devices);
INIT_LIST_HEAD(&card->controls);
INIT_LIST_HEAD(&card->ctl_files);
5、把该snd_card当成设备放入链表:
err = snd_ctl_create(card);
static struct snd_device_ops ops = {....}
snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);//类型SNDRV_DEV_CONTROL
struct snd_device *dev;
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
dev->card = card;
dev->type = type; //SNDRV_DEV_CONTROL
dev->device_data = device_data;//snd_card
dev->ops = ops;//该设备的操作函数,也就是snd_card
list_add(&dev->list, &card->devices);//放入链表
6、创建proc文件:err = snd_info_card_create(card);
7、使得codec->card指向我们设置好的snd_card:*card_ret = card;
8、最终将通过某个函数吧链表的设备都会注册到内核: snd_ctl_dev_register(struct snd_device *device)
在/dev将生成controlC0设备节点:
snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,&snd_ctl_f_ops, card, name);
第二个函数 soc_new_pcm(socdev, &card->dai_link[i], i);
这个要用到定义好的snd_soc_card:
static
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
