一方面,从内核实现的角度来说,每个声卡的驱动,如wm9713.c/uda134x.c,都有一句:
snd_soc_add_controls(。。。。)函数,这个函数就是用来添加control的。
另一方面,从用户空间来说,controls的实现目的就是提供给用户更好的控制和使用WM9714声卡。既然提供给用户使用,那么少不了系统调用来操作,也就是内核要实现内核操作函数。
在注册control的时候,我们是调用注册函数snd_ctl_dev_register来实现的,在该函数里就有:
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
&snd_ctl_f_ops, card, name)) < 0)
其中snd_ctl_f_ops就是control的操作函数了:
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,
};
现在我们先从第一方面说起,
snd_soc_add_controls(。。。。)函数如何实现control的加载。