如何解决在上层按键操作alsa code后无法调节驱动音量的原因

简介: http://blog.csdn.net/morixinguan/article/details/56514356之前写过一篇文章,是对alc5623.c codec部分进行了大致框架的分析,现在要解决一些实际问题,关于上层的代码我就不公布了,只公布在驱动的代码:在手册中,我们看到一个这样的寄存器设置。

http://blog.csdn.net/morixinguan/article/details/56514356

之前写过一篇文章,是对alc5623.c codec部分进行了大致框架的分析,现在要解决一些实际问题,关于上层的代码我就不公布了,只公布在驱动的代码:

在手册中,我们看到一个这样的寄存器设置。


先来看看说明文档,主要是做主音量的输出。

下面就是详细的如何配置0x0C的寄存器


我遇到的问题是,到了上层应用,无法通过按键调节主音量,并会提示:

can't find simple control"Master",0

如何解决?

在kcontrol中添加一个Master,用它来做主音量控制。

 
static const struct snd_kcontrol_newalc5621_vol_snd_controls[] = {
 
         SOC_DOUBLE_TLV("MasterPlayback Volume",
                            ALC5623_STEREO_DAC_VOL,8, 0, 31, 1, vol_tlv),
         SOC_DOUBLE("MasterPlayback Switch",
                            ALC5623_STEREO_DAC_VOL,15, 7, 1, 1),
 
 
    …………………
};
 

SOC_DOUBLE_TLV在这个宏中已经配置了info和put函数,意思就是设置音量还有获取音量。

//set函数设置音量

nt snd_soc_info_volsw(struct snd_kcontrol*kcontrol,
         structsnd_ctl_elem_info *uinfo)
{
         structsoc_mixer_control *mc =
                   (structsoc_mixer_control *)kcontrol->private_value;
         intplatform_max;
 
         if(!mc->platform_max)
                   mc->platform_max= mc->max;
         platform_max= mc->platform_max;
 
         if(platform_max == 1 && !strstr(kcontrol->id.name, "Volume"))
                   uinfo->type= SNDRV_CTL_ELEM_TYPE_BOOLEAN;
         else
                   uinfo->type= SNDRV_CTL_ELEM_TYPE_INTEGER;
 
         uinfo->count= snd_soc_volsw_is_stereo(mc) ? 2 : 1;
         uinfo->value.integer.min= 0;
         uinfo->value.integer.max= platform_max;
         return0;
}


//put函数获取音量

int snd_soc_put_volsw(struct snd_kcontrol*kcontrol,
         structsnd_ctl_elem_value *ucontrol)
{
         structsoc_mixer_control *mc =
                   (structsoc_mixer_control *)kcontrol->private_value;
         structsnd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
         unsignedint reg = mc->reg;
         unsignedint reg2 = mc->rreg;
         unsignedint shift = mc->shift;
         unsignedint rshift = mc->rshift;
         intmax = mc->max;
         unsignedint mask = (1 << fls(max)) - 1;
         unsignedint invert = mc->invert;
         interr;
         booltype_2r = 0;
         unsignedint val2 = 0;
         unsignedint val, val_mask;
 
         val= (ucontrol->value.integer.value[0] & mask);
         if(invert)
                   val= max - val;
         val_mask= mask << shift;
         val= val << shift;
         if(snd_soc_volsw_is_stereo(mc)) {
                   val2= (ucontrol->value.integer.value[1] & mask);
                   if(invert)
                            val2= max - val2;
                   if(reg == reg2) {
                            val_mask|= mask << rshift;
                            val|= val2 << rshift;
                   }else {
                            val2= val2 << shift;
                            type_2r= 1;
                   }
         }
         err= snd_soc_update_bits_locked(codec, reg, val_mask, val);
         if(err < 0)
                   returnerr;
 
         if(type_2r)
                   err= snd_soc_update_bits_locked(codec, reg2, val_mask, val2);
 
         returnerr;
}


 

那么设置完后编译通过后下到板子里就可以正常驱动了。

还有一个问题,当耳机插入时,调节音量,耳机在放,喇叭也在放,怎么解决?

在耳机插入时:

只要将喇叭关掉,将耳机开启就可以了。

 


 

下面的这两步操作最为关键,当耳机插入时,关闭喇叭,将音源更新到耳机里。

snd_soc_update_bits(codec, 0x04, 0x8080,0x8080);
snd_soc_update_bits(codec, 0x02, 0x8080,0x0);



目录
相关文章
|
20天前
Rockchip系列之LED状态灯 串口收发数据流程以及控制状态显示(3)
Rockchip系列之LED状态灯 串口收发数据流程以及控制状态显示(3)
23 0
|
1天前
|
监控 算法 定位技术
LabVIEW压电驱动迟滞补偿控制
LabVIEW压电驱动迟滞补偿控制
|
20天前
Rockchip系列之LED状态灯 CAN收发数据流程以及控制状态显示(4)
Rockchip系列之LED状态灯 CAN收发数据流程以及控制状态显示(4)
16 3
|
28天前
|
安全 测试技术
【ZYNQ】ZYNQ7000 全局定时器及其驱动示例
【ZYNQ】ZYNQ7000 全局定时器及其驱动示例
|
C#
C# 中串口通信 serialport1.DataReceived 函数无法触发或者出发延时等等问题解决方法
原文:C# 中串口通信 serialport1.DataReceived 函数无法触发或者出发延时等等问题解决方法 以前这个问题困扰我多天最后查资料一大堆,最后最终攻克了,看到非常多人做C#串口都遇到相同的问题,所以写一篇博文,以便学习交流。
3311 0
|
物联网
STM32:TIM输入捕获硬件部分(内含:1.输入捕获简介+2.频率测量+3.通用/高级定时器的输入捕获电路分析(重点)+4.主从触发模式+5.输入捕获基本结构(重点)+6.PWM基本结构)
STM32:TIM输入捕获硬件部分(内含:1.输入捕获简介+2.频率测量+3.通用/高级定时器的输入捕获电路分析(重点)+4.主从触发模式+5.输入捕获基本结构(重点)+6.PWM基本结构)
281 0
STM32:TIM输入捕获硬件部分(内含:1.输入捕获简介+2.频率测量+3.通用/高级定时器的输入捕获电路分析(重点)+4.主从触发模式+5.输入捕获基本结构(重点)+6.PWM基本结构)
UART子系统(十一)UART驱动情景分析_write
UART子系统(十一)UART驱动情景分析_write
143 0
UART子系统(十一)UART驱动情景分析_write
|
存储 算法 API
HarmonyOS系统中内核实现ADC采样的方法
大家好,今天主要和大家聊一聊,如何使用鸿蒙系统实现ADC采样。
160 0
HarmonyOS系统中内核实现ADC采样的方法
|
异构计算
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
890 0
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
STM32:TIM输入捕获模式测频率并在OLED上显示频率(内含:1.接线图/实物图+2.代码部分+3.输入捕获模式使用到的STM32库函数)
STM32:TIM输入捕获模式测频率并在OLED上显示频率(内含:1.接线图/实物图+2.代码部分+3.输入捕获模式使用到的STM32库函数)
360 0
STM32:TIM输入捕获模式测频率并在OLED上显示频率(内含:1.接线图/实物图+2.代码部分+3.输入捕获模式使用到的STM32库函数)