【audio】耳机插拔 线控按键识别流程【转】
耳机插拔/线控按键识别流程
1.文档概述
本文以msm8909平台,android N为例,介绍了通用情况下,耳机插拔的流程步骤,以及对耳机类型的识别逻辑。以方便在项目工作中经常会遇到耳机不被识别,或者识别后不能正常工作等情况,都可以参考此文档检测判断逻辑,确定问题根本,理解底层框架。
2.耳机的类型
从主观来看,耳机分三段耳机和四段耳机,而四段耳机又分为欧标和美标两种。通常,四段耳机被写作headset,而三段耳机写作headphones。具体的区别如下图:
- 三段耳机:线序分别为,L、R、G,没有MIC端,所以三段耳机无法使用mic,只能接受声音,另外,三段耳机L,R线序长度正常,G端比较长
- 四段-美标(CTIA)耳机:线序分别为L,R,G,M,第三阶为GND
- 四段-欧标(OMTP)耳机:线序分别为L,R,M,G,第四段为GND
如想兼容两种不同类型的耳机:
有以下方式可以选择:
- 增加硬件兼容支持两种耳机
- 使用转接线
在软件上,除了上述情况以外,还有一些外设设备会链接到耳机接孔,比如:自拍杆,外接音箱,TTY设备或者AUX延长线等,在软件上,对这些额外的设备进行了一个分类,如下枚举:
enum wcd_mbhc_plug_type {
MBHC_PLUG_TYPE_INVALID = -1, // ——无效设备
MBHC_PLUG_TYPE_NONE, // ——未接入设备
MBHC_PLUG_TYPE_HEADSET, // ——四段耳机
MBHC_PLUG_TYPE_HEADPHONE, // ——三段耳机
MBHC_PLUG_TYPE_HIGH_HPH, // ——高阻抗耳机
MBHC_PLUG_TYPE_GND_MIC_SWAP, //——欧美标标志位
};
可以在log中检索如下样例,确认目前MBHC耳机状态类型
wcd_mbhc_find_plug_and_report:
entercurrent_plug(1) new_plug(2)
除了上述以外,还有一种LINE_OUT设备,如AUX延长线,以上几种情况都是一些本身比较特别的耳机接口,当然LINE_OUT本身也属于一种特殊的HIGH_HPH设备,其中比较普遍的如iphone的耳机属于HIGH_HPH设备。
个人经验,在插入自拍杆和编写音箱球的时候,从LOG上看,是被识别成headset处理的。但音箱球是个很特殊的设备,电阻超过我们阀值很多,欧标配置的手机可能适用这个设备。在PIXI445TF上插入音箱球后有图标,但却无法正常使用。这样的情况的原因是,为们增大了识别的阀值,但平台却不支持这样的设备造成。
2.1 如何区分欧标和美标耳机
通常在国内有一些简单的区分方式,比如依照中间的橡胶圈来区分,白色是美标,黑色素欧标(国内大部分厂商都使用欧标,所以也有把OMTP叫做国标)。PS:这种说法仅作参考,因为黑色橡胶圈的美标耳机也有很多
区分美标或者欧标,可以简单的用万能表来测量耳机电阻,确定线序中的GND是在第三段或者第四段,具体方法不再赘述。喇叭单元(第一二节)到地电阻通常是16~32欧姆,找到哪一节是地线就知道是什么耳机。
2.2 对耳机的检测
Qcom对耳机的检测是在wcd_mbhc_v2.c中进行,在耳机接孔中存在一个detced引脚,用于检测是否有设备接入,具体接入的设备,会根据对micbias的电压等参数来做判断,下面会做详细介绍。
目前市面上耳机的阻抗不同,大都在32欧姆左右,driver会根据不同电阻来配置不同响度,在void wcd_imped_config()
函数中会有这样的逻辑。
从目前来看,这个阀值需要调节至36,因为如果以32作为临界值,会有很多客户发现部分耳机使用起来音量大小差异较大(差了4.5db)。
以iphone的耳机,接入设备有执行以下流程,如下流程图:
以上步骤分别注释:
- 耳机插入后会产生中断,确认事件,但在接入时候可能会由GND接触MIC端造成硬件短路等情况,所以需要在接入时候进行一个2s的延迟(qcom默认是0.5s)来确认是耳机插入事件,而不是btn事件。这点可以用于优化个别耳机接入后自动出现音量调节的问题。
- 中断中进入第一次耳机类型检测代码:
static void wcd_mbhc_detect_plug_type(struct wcd_mbhc *mbhc)
- 第一次耳机类型检测代码处理:在50ms内反复读取0x1580x159的两个寄存器的值,(注意这两个寄存器的值是跟HS_VREF threshold 的设置有关)
- 第一次耳机类型检测代码处理:确认检测出来0x158 0x159寄存器值是否等于(0 ,0)
- 如果0x158和0x159的值为(0,0)说明是类型是耳机,直接上报给上层
- 若寄存器值是(0,1),说明是高阻态耳机类型
- 进入第二次耳机类型检测代码(
static void wcd_correct_swch_plug(struct work_struct *work)
)。 - 同时确认耳机不是欧标/美标,在
static int wcd_check_cross_conn(struct wcd_mbhc *mbhc)
中,如果确认不支持某款,可以在该函数开始直接return false
。 - 同时在3s内读取0x159,0x158的寄存器的值,再进行判断
- 如果读取出来的数值仍然为(0,1),说明结果仍然是高阻抗耳机
- 进入特殊耳机检测(
static bool wcd_is_special_headset(struct wcd_mbhc *mbhc)
) - 特殊耳机检测(
wcd_is_special_headset
)会在2S内反复检测0x158 0x159寄存器值,并且抬高mic bais相关电压,正常情况电压会在1.5V左右,此时进行抬高会将电压增加到2.7V左右 - 将电压抬到一定程度读出0x158 0x159寄存器值继续确认是否为(0 ,0)
- 读出0x158 0x159寄存器值是(0 ,1),说明是高阻态设备,会进行上报处理后上报
以上结果,如果以目前手机情况,插入一个iphone的高阻抗耳机,大约需要7s左右才能正常识别到耳机,请留意该情况。
2.3 LINE_OUT DEVICE ERROR
由于个别LINE_OUT设备电阻太大造成的不识别问题,可以通过修改v_hs_max的参考电压来增加识别机率,qcom默认为1.5V,通常会增加到1.7V。qcom默认支持设备的电阻范围是在5k欧,但个别设备远远超过这个阀值,如AUX cable达到了2W+欧,移动音箱球达到了0.6M欧,可以修改linein_th的阀值来增加识别范围,建议最大设置为3W,否则会造成很多额外设备能够被识别成耳机,但却无法使用的问题。
3.耳机线控按键
通常耳机上的线控按钮会有一个或者三个,如果HOOK,音量+,音量-(音量调节的按钮只在部分耳机上会有,如TF运营商目前的标准仅支持一个HOOK按键)
HOOK的作用是由上层负责,底层只需要确保上报了对应的HOOK event给上层。
线控按钮的按键检测,在驱动中,会在如下的static void* def_msm8x16_wcd_mbhc_cal
函数中进行阀值的设置:
/*
* In SW we are maintaining two sets of threshold register
* one for current source and another for Micbias.
* all btn_low corresponds to threshold for current source
* all bt_high corresponds to threshold for Micbias
* Below thresholds are based on following resistances
* 0-70 == Button 0
* 110-180 == Button 1
* 210-290 == Button 2
* 360-680 == Button 3
*/
值得注意到是,其中btn_low和btn_high的设定是对不同供电而言,Low对应Current Source的分压,High对应Mic Bias的分压,而这两种供电方式取决于应用场景的不同,采取不同的供电,分压值对应做不同的设置,如下代码中判断
btn_voltage =((is_micbias) ? btn_high : btn_low);
按键识别与耳机上btn[4]的阀值设置有关。由于我们的标配耳机mic阻值(300mV电压偏置下等效阻抗1.2Kohm)较小,current模式的时候vmic上电压较低,和btn[4]的范围有重叠,所以按Hook key的时候容易产生btn[4]的事件,虽然btn[4]没有用到,但是会影响到hook key的状态
软件的具体改动是把除了要用的两个键,其他的阀值都设成了300, 保证不会误按键产生,另外,鉴于很多自拍杆在按键都是触发btn2的情况,btn2需要适配自拍杆。
耳机按键硬件原理
上图是耳机MIc线控板的原理简化图,图中方框内是耳机内线控板mic和按键的等效电路,右侧是手机内的Mic接口偏置电路。
3.1.1 MIC的工作原理
在分压电阻R和MIC两端加DC偏置电压V,MOS管与MIC_BIAS电阻R(推荐2.2Kohm)分压,Mic电容振膜在接收声波振动时两端会产生微弱的电压变化,经过MOS管的放大脚放大后,Pin4与Pin3两端分的电压也会相应变化,此时采集到的交变信号就是音频的信号Output到手机Mic in端。
MIC2_P 为MIC输入及耳机按键功能检测,按键检测用于监测 耳机线控板按键,通过ADC检测电压范围(根据上面5主btn阀值)来识别是哪一种按键事件,实现对应的功能。关于按键识别ADC电压检测,可以参考Idol 4上的设置(高通平台):
值得注意到是:
推荐手机端 V_mic bias为DC 2.8V,R_mic bias为2.2K ohm,调整系统内部btn(MIC2_P端)检测的电压范围阀值与 实际耳机一致;
其中,如果针对每个按钮去做计算,btn后的值计算公式如下:
因为高通平台在MIC未工作时,会降低V_micbias的电压值到几百mV级,经过偏置电阻R(2.2K)和MIC分压输入到 HS_DET端的电压如果不在 hook范围,会导致触发音量+/-等其它事件。
高通有一片文档,专门讲这个分区应该如何调试,文档名:application_note__multibutton_headset_control.pdf
三段耳机最终汇报上去的有效数据是
5 2 1 (插头类型 耳机信号 插入/拔出)
0 0 0(同步)
static int jack_switch_types[] = {
SW_HEADPHONE_INSERT,
SW_MICROPHONE_INSERT,
SW_LINEOUT_INSERT,
SW_JACK_PHYSICAL_INSERT,
SW_VIDEOOUT_INSERT,
SW_LINEIN_INSERT,
SW_HPHL_OVERCURRENT,
SW_HPHR_OVERCURRENT,
SW_UNSUPPORT_INSERT,
SW_MICROPHONE2_INSERT,
};
enum wcd_mbhc_plug_type {
MBHC_PLUG_TYPE_INVALID = -1,//无效设备
MBHC_PLUG_TYPE_NONE,//未接入设备
MBHC_PLUG_TYPE_HEADSET,//四段耳机
MBHC_PLUG_TYPE_HEADPHONE,//三段耳机
MBHC_PLUG_TYPE_HIGH_HPH,//高阻抗耳机
MBHC_PLUG_TYPE_GND_MIC_SWAP,//欧美标标志位
};
4. NC,NO的区别
NC和NO的区别在det脚的初始的状态。如下图
软件需要根据硬件进行配置,配置方法如下
设备树中qcom,msm-mbhc-hphl-swh = <0>; 0 for NC, 1 for NO
【audio】耳机插拔 线控按键识别流程【转】的更多相关文章
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
- iOS-触摸事件、手势识别、摇晃事件、耳机线控
概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件. ...
- 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...
- Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)
转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...
- MTK Android 耳机线控的实现方法
android 耳机线控的实现方法 keycodeonkeydownkeyevent 耳机线控的功能 耳机线控是一种很好用,并且能提升用户体验的功能.可以用来实现一些常用和基本的功能.比如:实现音乐播 ...
- iphone 耳机 线控
有电话呼入时: 按一次接听电话: 快速按两次将电话转到语音信箱: 通话中: 按一次挂断电话: 通话中如果有第二个电话打进来时: 按一次保留当前通话并接听第二个电话: 按住两秒钟不放忽略(拒绝接听)第二 ...
- Android线控的使用
实现方式一:只能在程序为前台时监控 在Activity中即可监听 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log ...
- 红米1S Mokee4.4.4 本人编译版耳机线控改动调音量以及上下曲方法
改动的文件为,用Re管理器编辑: system/usr/keylayout/msm8226-tapan-snd-card_Button_Jack.kl 默认的耳机线控的上下键是切换上下曲功能,因此此文 ...
- stm32按键识别
刚写了一个关于stm32单片机的按键识别的程序.目的,同时识别多个按键,并且不浪费cpu的时间. 关于去抖动,以前以为是在按键的时候,手会抖动.通过程序验证,这个确实是误解.这个应该是防止意外干扰.以 ...
随机推荐
- 使用awk和sed获取文件奇偶数行的方法总结
测试文件test.file [root@localhost ~]# cat test.file 111111111111111 222222222222222 333333333333333 4444 ...
- Java反射,注解,以及动态代理
Java反射,注解,以及动态代理 基础 最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...
- 区块链--Ubuntu上搭建以太坊私有链
1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...
- 【学习笔记】node.js重构路由功能
摘要:利用node.js模块化实现路由功能,将请求路径作为参数传递给一个route函数,这个函数会根据参数调用一个方法,最后输出浏览器响应内容 1.介绍 node.js是一个基于Chrome V8引擎 ...
- 使用MySQL组复制的限制和局限性
本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...
- SELECT INTO和INSERT INTO SELECT的区别
数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Table_2 FROM Table_1 Table_2表存在,报错:数据库 ...
- 推荐写作平台gitbook——让我们换一种形式写作
https://www.gitbook.com/ 我一直用这个平台进行写作.目前有两本电子书可以供大家阅读,分别如下 Office 365 开发入门指南 https://www.gitbook.com ...
- Oracle 数据库导出数据泵(EXPDP)文件存放的位置
数据泵是服务器端工具,导出的文件是放在数据库所在的服务器上,当然我们知道可以通过directory目录对象来控制.目录对象默认有四个级别,当然是有优先级顺序的,优先级从上往下 1.每个文件单独的指定具 ...
- Windows驱动匹配详解
在Windows下,几乎所有的硬件设备都需要安装驱动后才能正常工作,我们重装系统后第一件事就是要为各设备安装好驱动,我们可以下载官方驱动手动安装,也可以让我Windows自动扫描安装,还可以使用驱动精 ...
- java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...