耳机驱动调试(插拔检测与按键检测)

小白一枚,欢各位大佬指出错误

耳机类型判断

三段和四段、欧标和美标

现在许多设备的耳机接口都采用3.5mm的耳机接口,其中终端就是,终端可以兼容三段和四段耳机;三段和四段耳机,单从外观上就比较好区分,顾名思义,三段耳机的接头由绝缘环分为三段(如图1所示),从接头头部开始依次对应左声道—右声道—接地;四段耳机接头由绝缘环分为四段。

三段式和四段式耳机

三段耳机接头

三段耳机和四段耳机的区别在于,四段耳机相对于三段耳机多了mic功能,三段耳机仅能从设备输出声音,而四段耳机除了声音的输出外,同时还可以录入声音,用在终端中可以直接用耳机mic通电话、录音等。

欧标和美标

四段耳机从外观上看好像都相同,其实不然;根据接头上mic的位置不同分为欧标和美标,欧标又称为国家标准(OMTP标准:开放移动终端平台标准),美标又称为国际标准(CTIA标准:移动通信行业协会标准)。美标耳机与欧标耳机从插座头部开始每一段对应的通道不一样

欧标耳机:左声道—右声道—mic—接地;

美标耳机:左声道—右声道—接地—mic(如图2所示);

欧美标四段耳机接头原理图

图2 欧美标四段耳机接头原理图

以上是从外观分辨不出来的特点,在实际中要向确认一个四段耳机是欧标还是美标,一般通过万用表测量左/右声道与第三段/第四段之间的阻抗 (大约为35Ω) 来确认;除了测量阻抗来确定耳机标准外,我们还可以通过判断耳机接口上绝缘体的颜色来确认,欧标耳机与美标耳机通常情况下绝缘体颜色是不同的,美标为白色,欧标为黑色(绝缘体颜色非行业或国家标准,不能作为绝对的判断依据,不排除有特殊情况,所以最好的判断方式是用万用表测耳机阻抗)。

如果把美标的耳机接到欧标的接口上,就会出现音乐输出只有背景声的情况,按住麦克风上的通话键才正常出现声音。如果欧标的耳机接到美标的接口上,就会出现地线接触不良,耳机输出音量很小,按住麦克风上的通话键才正常出现声音的现象。

2.耳机座的标准

耳机座标准分为NC和NO两种,如图3所示(以美标耳机的耳机座为例);

从上图可以看出,无论是NC还是NO标准,MIC、GND(接地)、R(右声道)、L(左声道)4个触点线路均一致,不一致的地方为HS-DET,全称为headset-detective,是用以检测耳机是否插入的触点。

以NC为例,为耳机未插入的情况下,HS-DET和L是连接在一起的,为接地低电压。当耳机插入时,HS-DET会和L分离开来,HS-DET不再接地,突变为高电压。当电路检测到该电压突变的时候,就会认为耳机已经插入,从而进入下一步操作。拔出耳机时,HS-DET高电压突变为低电压,则识别为耳机拔出。

NO和NC相反,HS-DET在耳机未插入时为高电压,在耳机插入后为低电压。

耳机检测原理

耳机插拔检测

耳机检测中断上报与gpio中断上报类似,插入前后PIN脚电平状态发生突变,触发中断,以下图为标准耳机部分原理图(图中R602/NC)与 芯片datasheet:

由原理图可以判断这是一个美标、NC类型耳机座,耳机插入前HP_DET与HP_L闭合,HP_DET默认电平为低。耳机插入后HP_DET与HP_L断开,HP_DET电平被拉高,触发中断信号。

结合datasheet 选用headset L-INT 作为 HP_DET 触发耳机检测,设置完 耳机检测的阈值(例如350mV),插拔耳机就可以正常触发中断。

耳机按键检测

下图是一个耳机内部的电路图与检测耳机按键的datasheet

由耳机内部电路图分析得知,

  1. 当我们没有按下按键时,耳机MIC 与 上面提到耳机电路原理图中 的 电阻(R608)串联,HEADMIC_BIAS 2.8V  HP_GND 0V, 所以 耳机MIC 与 R608 串联 分压。HEADSET_BOTTON_DET 处电压 为 耳机MIC 两端电压,HEADSET_BOTTON_DET处电压 应当大于 1V,因为寄存器 _RG_AUDHEDET_BDET_REF_SEL 最大为 1V(视不同平台 datasheet 确定)。
  2. 当我们按键耳机中间按键时,耳机MIC被短路 ,R608 直接 接到 HP_GND ,HEADSET_BOTTON_DET处电压 应当为 0V。所以 当我们将 _RG_AUDHEDET_BDET_REF_SEL 检测 阈值设置 为 1V 时,按键按下 和 抬起 电压值 正好在 _RG_AUDHEDET_BDET_REF_SEL 设置阈值的两侧 ,HEADSET_BOTTON_DET 引脚就会触发中断。
  3. 同理 当 我们 按下 左 右 两个 按键 时,221Ω和 391 Ω会 分别和 R608 串联, 两个按键按下时 都 要保证 HEADSET_BOTTON_DET 处 的 电压低于 1V(_RG_AUDHEDET_BDET_REF_SEL 检测 阈值设置 为 1V 时)用来触发中断,也就是说 耳机 三 个的按键 按下时 ,可以触发中断后,读取 HEADSET_BOTTON_DET 处 的 电压。根据读取电压的不同,就可与区分 三个按键。
  4. 上诉必须保证 没有按键按下时,读取 HEADSET_BOTTON_DET 处 要大于 _RG_AUDHEDET_BDET_REF_SEL 设置 阈值,按键按下时,读取 HEADSET_BOTTON_DET 处 要小于 _RG_AUDHEDET_BDET_REF_SEL 设置 阈值,用来触发中断。再根据 三个 按键 按下时接入电路的电阻阻值不同,根据分压值的大小来区别三个按键。

耳机检测与按键检测问题拓展

常开与常闭耳机问题

由耳机插拔检测中提到的NC 与 NO 耳机座。耳机的实际插拔与耳机插拔检测结果正好相反时,及耳机拔出软件报出的结果是耳机插入。

出现这个问题,如果没有 dts 或者 其他什么参数配置,直接找芯片平台解决问题,简单的改一下耳机插拔反向逻辑不一定能解决问题,还设计datasheet中相关寄存器修改(基本确定是要修改寄存器初始化参数)。

耳机类型检测

具体复杂的耳机类型判断,可以自己看一下驱动自己平台的驱动代码,我本次的检测比较粗暴,有文章张贴的图片可以我用的是美标耳机,所以 在驱动加载的时候(耳机按键未按下)检测 HEADSET_BOTTON_DET 处的电压, 如果该电压小于 1V 直接判断为 三段耳机 没有MIC功能。反之,判断耳机为正常的 四段 美标耳机。

该判断的逻辑在于,平台只支持 美标耳机,所以 三段耳机 和 欧标耳机 在 耳机按键没有按下时 检测 HEADSET_BOTTON_DET 处的电压 都为 0V,具体逻辑可以分析我前面 原理图 和 耳机按键检测解释 。

关于特殊耳机的支持

以poc 专用耳机举例 ,一下为 poc 专用耳机图解

HEADSET_BOTTON_DET  与 HEADMIC IN DET 为同一PIN脚。

由上图 我们可知,按键没有按下时耳机MIC 没有接入电路,按键按下时耳机MIC 和 2.2K电阻并联后 和 R608 串联 接入电路。我在 耳机按键检测中提到的 必须要保证耳机 没有按键按下时,读取 HEADSET_BOTTON_DET处电压 要大于 _RG_AUDHEDET_BDET_REF_SEL设置 阈值,按键按下时,读取 HEADSET_BOTTON_DET 处 要小于 _RG_AUDHEDET_BDET_REF_SEL设置 阈值,用来触发中断。所以说 这类 耳机 如果 没有 检测到耳机按键按下与抬起 直接 用万用表 测量一下按键按下和抬起时HEADSET_BOTTON_DET处电压 是否 符合 我提到的电压变化。如果不符合,请硬件 同事 调整 电路中的电阻阻值,使按下和抬起按键时电压变化正好处于设置阈值两侧。

更多类型的耳机,可以根据耳机检测原理灵活调整。

附:

文章部分内容引用https://mini.eastday.com/a/190613011041476.html?qid=02263&vqid=qid02650

耳机驱动调试(插拔检测与按键检测)相关推荐

  1. 如何监测耳机/麦克风设备插拔操作

    来源:https://www.cnblogs.com/s5689412/p/3784108.html 没事的时候想起来做这么个功能,主要是想在插入耳机之后能自动调节到较小的音量,免得耳朵被震得难受. ...

  2. stm32 工业按键检测_STM32f103按键检测程序实现长按短按

    背景本文引用地址:http://www.eepw.com.cn/article/201807/384495.htm 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去 ...

  3. linux耳机检测,Audio Jack 的耳机检测和按键检测

    基于QCM 8960 二十七.Audio jack1. https://wiki.sonyericsson.net/androiki/Huashan_legacy_feature:_Vibrator_ ...

  4. linux下查看usb插拔日志,Linux:如何检测usb键盘是否已插入和拔出

    如果HAL守护进程正在运行(这在大多数现代linux桌面上都是如此),那么您可以监听它的DBus信号.下面是一个如何检测USB鼠标是否已插入的示例(我手头没有USB键盘):import gobject ...

  5. shell 判断网线插拔_shell脚本自动检测网络掉线和自动重连

    在ppp移植成功后,有时会出现ppp掉线等情况.这篇文章写了一个自动检测连接网络的解决方法. 创建一个shell脚本,在里面添加一下内容.(记得给操作权限) #!/bin/sh //根据你自己的she ...

  6. 【audio】耳机插拔 线控按键识别流程【转】

    耳机插拔/线控按键识别流程 耳机插拔/线控按键识别流程 1.文档概述 本文以msm8909平台,android N为例,介绍了通用情况下,耳机插拔的流程步骤,以及对耳机类型的识别逻辑.以方便在项目工作 ...

  7. 【audio】耳机插拔/线控按键识别流程

    耳机插拔/线控按键识别流程 1.文档概述 本文以msm8909平台,android N为例,介绍了通用情况下,耳机插拔的流程步骤,以及对耳机类型的识别逻辑.以方便在项目工作中经常会遇到耳机不被识别,或 ...

  8. Android 耳机驱动知识

    https://yunzhi.github.io/headset_knowledge 工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测.这部分涉及的硬件知识比较简单,但是软件上 ...

  9. 基于stm32f4的按键检测

    基于stm32f4的按键检测 所谓按键检测,即是检测按键是长按,还是短按.(长按.短按由按键的时间的长短来衡量)通过查阅相关资料,找到了两种比较好理解的按键检测方法.一种是通过输入捕获的方式检测按键按 ...

最新文章

  1. matlab game of life,模拟器cellular auotomata元胞自动机 matlab
  2. .NET Core微服务之基于Consul实现服务治理
  3. [收集] C++ memset ,memcpy 和strcpy 的区别
  4. 关掉ajax 的异步,asp.net ajax 取消异步回送
  5. semantic ui要装什么才能使用
  6. Java向后不兼容历史的观察
  7. 前端学习(2754):配置tabber
  8. 基于套接字SOCKET的及时聊天
  9. Django项目实践1 - 创建Django项目
  10. nodejs - 服务端管理 - PM2
  11. mysql 5.6忘记root密码_Linux平台MySQL忘记root密码解决方案
  12. 计算机vb小游戏,用vb6.0做一个小游戏
  13. 计算机二级 office 英语,计算机二级office题库及答案
  14. 懒人精灵新版图色工具介绍
  15. Lattice diamond 编程时工具报出 ID错误问题的解决
  16. Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
  17. Qt-FFmpeg开发-保存视频流裸流(11)
  18. ie登录显示登录到ftp服务器,ie浏览器登陆ftp服务器
  19. 系统移植-(二)u-boot:启动过程做的工作(汇编阶段、C阶段)
  20. 前后端分离校园智能出行拼车系统

热门文章

  1. python数据分析工具3:matplotlib
  2. 数据结构与算法--图的广度优先搜索 (BFS)
  3. Linux下使用aMsn详解(转)
  4. Compressor.js 图片压缩及方向修正
  5. 网络编程 —— 基础理论知识
  6. mysql cursor使用变量_mysql cursor游标的使用,实例
  7. python 调整字体大小
  8. java小组队徽_小组队徽设计.ppt
  9. 如何用机器学习算法计算特征重要性
  10. 讯飞语音--唤醒Demo