按时间排序 按相关度排序
按回复數排序 按相关度排序
工具类 代码类 文档 全部
VIP免费看 按人气排序 按时间排序 按相关度排序
控制接口对于许多开关(switch)和调節器(slider)应用广泛它能被用户空间存取,从而读写CODEC相关寄存器
alsa的架构是清晰了但是一直不明白,alsa的控制接口是如何被上层调用的
可以看到在上面的snd_soc_add_controls这个函数就是在添加控制接口
看下snd_kcontrol这个结构是什么样子的?
现在说说上面的这个结构里面的每一个成员到底是什么意思?
name:字段是名称标识这个字段非常重要,因为control的作用由名称来区分对于名称相同的control,则使用index区分下面会详细介绍上层应用如何根据name洺称标识来找到底层相应的control。name定义的标准是“SOURCEDIRECTION
我们这里遇到的宏有如下几类:
下面分别看下以上三种类型的宏的定义是什么样子的:
上面宏的意思是:对寄存器0x2c的位便宜的第7位可以设置的最大值是max也就是1,我们查询下datasheet后发现第7位主要用来设置LeftInput Mute 的,并且这一位只能有1或者0因为最大位就是1,这里的invert的中文解释是反转听同事讲解是一般默认情况下,1是open0是close的这个invert如果是1的话就是和默认的相反的,如果是0的話就是不反转的,是和默认是一样的
最后操作寄存器的值就是0x2A
这里的偏移是3最大值就6,说明我们设置的值的种类最多是6种,我们查询下datasheet下:
可以发现从第三位开始,可以最多设置6种这个应该是起压缩的作用,从description可以看出compressorslope
上面的这个宏其实和其他的宏类似,但是这是对两個集训起reg_lift和reg_right进行操作codec芯片中的左右声道一般差不多,所以就需要这个宏的存在
从上面可以看出这两个寄存器的配置是一样的
我们看下Machine裏面是如何添加每一个control的
trace上面的函数是如何实现的??
到这里我们还不能停止我们不防继续追踪下代码,我们的snd_soc_update_bits函数
上面会进行判断如果你这次操作的工作和以前的是一样的话,那么就没有必要重复操作codec了如果不一样的话,才会去操作codec
看到没有我们读操作用的是snd_soc_read
這里我们需要查找这个read和write的方法
最终我们在codecdriver里面找到了这两个方法的赋值
我们传递是8和16,所以我们找到对应的read和write方法
至于上面两个方法是洳何实现的因为在codecdriver 里面也会调用上面的方法,在那里会详细讲解这里只需要最终调用的是codec里面的方法进行操作就可以了。到这里alsa的控淛接口的讲解就已经讲解完了从上层到底层,应该说比较详细的