继上一篇文章:http://www.cnblogs.com/linhaostudy/p/8515277.html

三、tinymixer调用分析:(tinymixer.log搜索节点:/dev/snd/controlCx)

还是一样,系统调用从应用层到kernel层,都要通过VFS来到file_operations;

我们使用tinymixer "SEC_MI2S_RX Audio Mixer MultiMedia1" 1打开通道看一下相应的流程;

log中的open("/dev/snd_controlCx")中对应的file_operations中:

 /*
* INIT PART
*/ 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,
};

tinymixer首先先调用open操作函数集;也就是snd_ctl_open打开control逻辑设备;

我们主要分析ioctl函数,由file_operations来到snd_ctl_ioctl函数中来:

 static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct snd_ctl_file *ctl;
struct snd_card *card;
struct snd_kctl_ioctl *p;
void __user *argp = (void __user *)arg;
int __user *ip = argp;
int err; ctl = file->private_data;
card = ctl->card;
if (snd_BUG_ON(!card))
return -ENXIO;
switch (cmd) {
case SNDRV_CTL_IOCTL_PVERSION:
return put_user(SNDRV_CTL_VERSION, ip) ? -EFAULT : ;
case SNDRV_CTL_IOCTL_CARD_INFO:
return snd_ctl_card_info(card, ctl, cmd, argp);
case SNDRV_CTL_IOCTL_ELEM_LIST:
return snd_ctl_elem_list(card, argp);
case SNDRV_CTL_IOCTL_ELEM_INFO:
return snd_ctl_elem_info_user(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_READ:
return snd_ctl_elem_read_user(card, argp);
case SNDRV_CTL_IOCTL_ELEM_WRITE:
return snd_ctl_elem_write_user(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_LOCK:
return snd_ctl_elem_lock(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_UNLOCK:
return snd_ctl_elem_unlock(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_ADD:
return snd_ctl_elem_add_user(ctl, argp, );
case SNDRV_CTL_IOCTL_ELEM_REPLACE:
return snd_ctl_elem_add_user(ctl, argp, );
case SNDRV_CTL_IOCTL_ELEM_REMOVE:
return snd_ctl_elem_remove(ctl, argp);
case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS:
return snd_ctl_subscribe_events(ctl, ip);
case SNDRV_CTL_IOCTL_TLV_READ:
return snd_ctl_tlv_ioctl(ctl, argp, );
case SNDRV_CTL_IOCTL_TLV_WRITE:
return snd_ctl_tlv_ioctl(ctl, argp, );
case SNDRV_CTL_IOCTL_TLV_COMMAND:
return snd_ctl_tlv_ioctl(ctl, argp, -);
case SNDRV_CTL_IOCTL_POWER:
return -ENOPROTOOPT;
case SNDRV_CTL_IOCTL_POWER_STATE:
#ifdef CONFIG_PM
return put_user(card->power_state, ip) ? -EFAULT : ;
#else
return put_user(SNDRV_CTL_POWER_D0, ip) ? -EFAULT : ;
#endif
}
down_read(&snd_ioctl_rwsem);
list_for_each_entry(p, &snd_control_ioctls, list) {
err = p->fioctl(card, ctl, cmd, arg);
if (err != -ENOIOCTLCMD) {
up_read(&snd_ioctl_rwsem);
return err;
}
}
up_read(&snd_ioctl_rwsem);
snd_printdd("unknown ioctl = 0x%x\n", cmd);
return -ENOTTY;
}

通过tinymixer.log搜索ioctl可以看到,进入:

 case SNDRV_CTL_IOCTL_ELEM_WRITE:
return snd_ctl_elem_write_user(ctl, argp);

相应流程如下:

|->snd_ctl_ioctl
|->snd_ctl_elem_write_user
|->snd_ctl_elem_wirte
|->kctl->put
|=snd_soc_dapm_put_volsw
|->snd_soc_dapm_mixer_update_power//找到使用这个kcontrol的path,根据该kcontrol的值来更新path的connect状态
//更新path->connect状态

kcontrol、dapm widget、route/path创建与注册和它们之间的关系可以见:

ALSA声卡驱动的DAPM(一)-DPAM详解

ALSA声卡驱动的DAPM(二)-建立过程

最新文章

  1. Spring MVC 学习总结(四)——视图与综合示例
  2. 关于对 maximio平台的五个常用类的初步理解及总结
  3. java经典50编程题
  4. python公司面试题集锦 python面试题大全
  5. HDU 1711 Number Sequence (数字KMP,变形)
  6. opengl截图
  7. 理解newid()和newsequentialid()
  8. Swift--基础(一)基本类型 符号 字符串(不熟的地方)
  9. Web Deploy发布网站一条龙解决方案
  10. Java Web整合开发(14) -- Struts 1.x 概述
  11. Arcgis for Javascript之featureLayer图和属性互操作性
  12. lucene简介 创建索引和搜索初步
  13. C++类继承中,基类/当前对象属性/当前对象的构造顺序
  14. 在亚马逊linux环境上装mysql+添加启动项
  15. java:包、继承,访问修饰符
  16. spring boot 注解
  17. 13、spark-submit
  18. 转STM32官方固件库简介
  19. 扩展C#与元编程
  20. ActiveMQ 概述

热门文章

  1. Django--视图函数views
  2. springmvc的异步处理
  3. Postgresql ---plv8扩展(windows下安装过程)
  4. mpvue支持小程序的分包加载
  5. LearnOpenGL学习笔记(六)——纹理单元
  6. VM虚拟机扩展硬盘容量
  7. mysql中的data下的数据文件(.FRM、.MYD、.MYI)恢复为数据
  8. K临近算法
  9. Scala字符串与容器
  10. CRC 校验原理及步骤