/dev/snd # ll
crw-rw---- system audio 116, 0 2014-09-19 10:36 controlC0
crw-rw---- system audio 116, 32 2014-09-19 10:36 controlC1
crw-rw---- system audio 116, 64 2014-09-19 10:36 controlC2
crw-rw---- system audio 116, 96 2014-09-19 10:36 controlC3
创建controldevice的过程和pcm类似
snd_soc_register_card
snd_soc_instantiate_card
snd_card_create
snd_ctl_create
用户态对controlCx的操作怎么到kernel的哪?关键在snd_ctl_create中的注册函数snd_ctl_dev_register
static const struct file_operations snd_ctl_f_ops =
{
.owner = THIS_MODULE,
.read = snd_ctl_read,
.open = snd_ctl_open,
.release = snd_ctl_release,
.llseek = no_llseek,
.poll = snd_ctl_poll,
.unlocked_ioctl = snd_ctl_ioctl,
.compat_ioctl = snd_ctl_ioctl_compat,
.fasync = snd_ctl_fasync,
};
static int snd_ctl_dev_register(struct snd_device *device)
{
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
&snd_ctl_f_ops, card, name)) < 0)
}
snd_ctl_ioctl
snd_ctl_elem_read_user
snd_ctl_elem_read
snd_ctl_find_id(card, &control->id);
kctl->get(kctl, control);
而 kctl来自card的controls链表。用户态传入的时候会有一个num id指定这个kcontrol
num id可以关注mixer_open中SNDRV_CTL_IOCTL_ELEM_LIST
对应于kernel中的snd_ctl_elem_list