新路程------imx6q aplay设置参数路径验证

aplay先是open了pcm一个节点,然后用ioctl来设置参数,这个节点是

在sound/aoa/soundbus/i2sbus/core.c中的i2sbus_probe函数中的i2sbus_add_dev中生成的,

这个设备节点初始化的时候dev->sound.attach_codec = i2sbus_attach_codec;

在这个attach,位置在sound/aoa/soundbus/i2sbus/pcm.c中

主要是err = snd_pcm_new(card, dev->pcmname, dev->pcmid, 0, 0,

 &dev->pcm);

在pcm.c中if ((err = snd_device_new(card, SNDRV_DEV_PCM, pcm, &ops)) < 0)这里的ops里

static struct snd_device_ops ops = {
.dev_free = snd_pcm_dev_free,
.dev_register = snd_pcm_dev_register,
.dev_disconnect = snd_pcm_dev_disconnect,

}; 

在sound/core/pcm.c中static int snd_pcm_dev_register(struct snd_device *device)中

err = snd_register_device_for_dev(devtype, pcm->card,
 pcm->device,
 &snd_pcm_f_ops[cidx],
 pcm, str, dev);

这里的snd_pcm_f_ops里有个ioctl

const struct file_operations snd_pcm_f_ops[2] = {
{
.owner = THIS_MODULE,
.write = snd_pcm_write,
.aio_write = snd_pcm_aio_write,
.open = snd_pcm_playback_open,
.release = snd_pcm_release,
.llseek = no_llseek,
.poll = snd_pcm_playback_poll,
.unlocked_ioctl = snd_pcm_playback_ioctl, //这个就是真实的上层设置路径的时候的调用
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
.get_unmapped_area = snd_pcm_get_unmapped_area,
},
{
.owner = THIS_MODULE,
.read = snd_pcm_read,
.aio_read = snd_pcm_aio_read,
.open = snd_pcm_capture_open,//这个就是真实的上层设置路径的时候的调用
.release = snd_pcm_release,
.llseek = no_llseek,
.poll = snd_pcm_capture_poll,
.unlocked_ioctl = snd_pcm_capture_ioctl,
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
.get_unmapped_area = snd_pcm_get_unmapped_area,
}

};

真正的设置参数的函数是sound/pcm_native.c中的

static int snd_pcm_common_ioctl1(struct file *file,
struct snd_pcm_substream *substream,

unsigned int cmd, void __user *arg)里

case SNDRV_PCM_IOCTL_HW_PARAMS:

return snd_pcm_s

hw_params_user(substream, arg);

然后调用到了

err = substream->ops->hw_params(substream, params);这里的ops->hw_params就是我们的驱动中的

static struct snd_soc_ops imx_hifi_ops = {
.startup = imx_hifi_startup,
.shutdown = imx_hifi_shutdown,
.hw_params = imx_hifi_hw_params,
.hw_free = imx_hifi_hw_free,
.trigger = imx_hifi_trigger,
};完成了硬件设备的设置

猜你喜欢

转载自blog.csdn.net/u013308744/article/details/79314585
今日推荐