设为首页 加入收藏

TOP

【audio】耳机插拔 线控按键识别流程【转】(一)
2019-09-01 23:10:27 】 浏览:57
Tags: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

如想兼容两种不同类型的耳机:

有以下方式可以选择:

  1. 增加硬件兼容支持两种耳机
  2. 使用转接线

在软件上,除了上述情况以外,还有一些外设设备会链接到耳机接孔,比如:自拍杆,外接音箱,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的耳机,接入设备有执行以下流程,如下流程图:

以上步骤分别注释:

  1. 耳机插入后会产生中断,确认事件,但在接入时候可能会由GND接触MIC端造成硬件短路等情况,所以需要在接入时候进行一个2s的延迟(qcom默认是0.5s)来确认是耳机插入事件,而不是btn事件。这点可以用于优化个别耳机接入后自动出现音量调节的问题。
  2. 中断中进入第一次耳机类型检测代码:static void wcd_mbhc_detect_plug_type(struct wcd_mbhc *mbhc)
  3. 第一次耳机类型检测代码处理:在50ms内反复读取0x1580x159的两个寄存器的值,(注意这两个寄存器的值是跟HS_VREF threshold 的设置有关)
  4. 第一次耳机类型检测代码处理:确认检测出来0x158 0x159寄存器值是否等于(0 ,0)
  5. 如果0x158和0x159的值为(0,0)说明是类型是耳机,直接上报给上层
  6. 若寄存器值是(0,1),说明是高阻态耳机类型
  7. 进入第二次耳机类型检测代码(static void wcd_correct_swch_plug(struct work_struct *work))。
  8. 同时确认耳机不是欧标/美标,在static int wcd_check_cross_conn(struct wcd_mbhc *mbhc)中,如果确认不支持某款,可以在该函数开始直接return false
  9. 同时在3s内读取0x159,0x158的寄存器的值,再进行判断
  10. 如果读取出来的数值仍然为(0,1),说明结果仍然是高阻抗耳机
  11. 进入特殊耳机检测(static bool wcd_is_special_headset(struct wcd_mbhc *mbhc)
  12. 特殊耳机检测(wcd_is_special_headset)会在2S内反复检测0x158 0x159寄存器值,并且抬高mic bais相关电压,正常情况电压会在1.5V左右,此时进行抬高会将电压增加到2.7V左右
  13. 将电压抬到一定程度读出0x158 0x159寄存器值继续确认是否为(0 ,0)
  14. 读出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 s
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VCC、VDD、VSS以及VBAT的区别 下一篇【Keil】Keil5-改变字的大小和颜色

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目