微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux ALSA声卡驱动之二:声卡的创建

Linux ALSA声卡驱动之二:声卡的创建

时间:12-07 来源:互联网 点击:

ion allocates snd_card instance via kzalloc with the given

* space for the driver to use freely. The allocated struct is stored

* in the given card_ret pointer.

*

* Returns zero if successful or a negative error code.

*/

int snd_card_create(int idx, const char *xid,

struct module *module, int extra_size,

struct snd_card **card_ret)

首先,根据extra_size参数的大小分配内存,该内存区可以作为芯片的专有数据使用(见前面的介绍):

card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL);

if (!card)

return -ENOMEM;

拷贝声卡的ID字符串:

if (xid)

strlcpy(card->id, xid, sizeof(card->id));

如果传入的声卡编号为-1,自动分配一个索引编号:

if (idx < 0) {

for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)

/* idx == -1 == 0xffff means: take any free slot */

if (~snd_cards_lock & idx & 1<

if (module_slot_match(module, idx2)) {

idx = idx2;

break;

}

}

}

if (idx < 0) {

for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)

/* idx == -1 == 0xffff means: take any free slot */

if (~snd_cards_lock & idx & 1<

if (!slots[idx2] || !*slots[idx2]) {

idx = idx2;

break;

}

}

}

初始化snd_card结构中必要的字段:

card->number = idx;

card->module = module;

INIT_LIST_HEAD(&card->devices);

init_rwsem(&card->controls_rwsem);

rwlock_init(&card->ctl_files_rwlock);

INIT_LIST_HEAD(&card->controls);

INIT_LIST_HEAD(&card->ctl_files);

spin_lock_init(&card->files_lock);

INIT_LIST_HEAD(&card->files_list);

init_waitqueue_head(&card->shutdown_sleep);

#ifdef CONFIG_PM

mutex_init(&card->power_lock);

init_waitqueue_head(&card->power_sleep);

#endif

建立逻辑设备:Control

/* the control interface cannot be accessed from the user space until */

/* snd_cards_bitmask and snd_cards are set with snd_card_register */

err = snd_ctl_create(card);

建立proc文件中的info节点:通常就是/proc/asound/card0

err = snd_info_card_create(card);

把第一步分配的内存指针放入private_data字段中:

if (extra_size > 0)

card->private_data = (char *)card + sizeof(struct snd_card);

4. snd_card_register()

snd_card_create()在/sound/core/init.c中定义。

/**

* snd_card_register - register the soundcard

* @card: soundcard structure

*

* This function registers all the devices assigned to the soundcard.

* Until calling this, the ALSA control interface is blocked from the

* external accesses. Thus, you should call this function at the end

* of the initialization of the card.

*

* Returns zero otherwise a negative error code if the registrain failed.

*/

int snd_card_register(struct snd_card *card)

首先,创建sysfs下的设备:

if (!card->card_d

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top