Jasonangel

V1

2022/04/04阅读:25主题:默认主题

Android 耳机驱动知识

工作以后接手的第一个驱动就是 android 平台下耳机的插拔检测和按键检测。这部分涉及的硬件知识比较简单,但是软件上对中断的处理,软件检测的鲁棒性,都有比较高的要求,涉及到驱动开发中经常使用的【中断申请,工作队列,tasklet,竟态和同步,linux input子系统,android 键值映射】等知识。

1、耳机接口知识介绍

1、耳机的通用接口为一个裸露的圆柱体,从头端到线侧的直径依次增大,并通过橡胶环进行绝缘而设计,这样方便无论从哪个角度都可以插入。在耳机座上,通过弹片和耳机头的金属环触而形成电路导通。

2、市面上流通的耳机从接口大小上分3.5mm和2.5mm两种,主要适配不同尺寸的插口,比较常见的是3.5mm。从接口电气特性上分三段式和四段式,四段式在三段耳机的基础上增加了mic端——耳机内部的一个声电转化装置。

  1. 三段式耳机接口从头部到线一侧的定义式左声道,右声道,GND。
  2. 四段式耳机分美标(CTIA)和欧标(OMTP,国标)
  3. 耳机上的电声转化装置(左声道和右声道)可以认为是一个16欧或者32欧的电阻,电阻值根据耳机厂商的设计而不同,一般的标准为16欧或者32欧,但有些比较好的耳机这个内阻值比较大;mic端可以认为是一个大电阻(通常为1k欧)和一个开关(多按键耳机可以认为好多个开关串上不同组值的电阻)。

美标CTIA(三星、OPPO、小米、华为)

欧标OMTP(Nokia、lenovo)

正规耳机可以靠黑白色环区分:

2、耳机座接口介绍

耳机座也分为支持欧标设计的耳机座和支持美标设计的耳机座。

另外,从耳机座左声道的检测方式来又可以分为 “Nomally-closed type”(常闭型) 和 “Normally-open type”(常开型) 两种。其简易设计如下图

图中所示的耳机座为美标的。

在常闭型中,不接耳机时,耳机座左声道和检测端 HS-DET 接触,插入耳机时,HS-DET 与 HPH-L 不导通。

在常开型中,不接耳机时,耳机座左声道和检测端 HS-DET 不接触,插入耳机时,HS-DET 与 HPH-L 导通。

常闭型耳机座会耗电一些,因为没插耳机时一直有一路电在导通。但是防水效果好,一旦进水该部分电阻会有变化,系统可以立刻知道进水。

常开型耳机座不耗电,但是防水性一般。插入耳机会导通,进水也会导通,万一水中杂质万一和耳机正常阻值相同,就无法区分是进水还是插入耳机。

3、耳机检测原理

通过对耳机座结构的理解,我们知道耳机拔插时有电平变化,接上一个 GPIO 口,通过该中断我们可以知道耳机插入和拔出,需要注意的是,该中断软件上需要设置可以唤醒系统。

对于按键的检测,我们可以测量 MIC 触点和 GND 触点之间的电压。因为当耳机插入时,我们会给 MIC 加上偏置电压 micbias,当有按键按下时,该电压会变化,通过 ADC 读取不同的电压值,来判断不同的按键按下。

当给 MIC 加上偏置电压 micbias 时,如果通过 adc 读到电压是 0,则表示插入的是三段式耳机,不支持 MIC 和按键检测。

后续流程就是在中断处理函数中调用其他需要的做的事情,比如开启音频通路,向 L 和 R 输出音频数据,关掉喇叭等。对于软件设计各 IC 平台不同,不过差别不大。

接触过多个平台的耳机驱动,高通、MTK 将检测耳机插拔的事件申请为 input 设备,RK 平台注册为 switch/h2w 设备。mtk 平台的耳机驱动称为 ACCDET+EINT 的模式,高通的机制叫做 MBHC,都是一套看起来特别麻烦的机制。而展讯的 code 将耳机驱动作为 misc 下得一个设备驱动来用,很体现 Linux “write code do one thing and do it well”的哲理。

4、hook按键的处理

hook 按键通过 input 子系统上报给 Android,在 Android 手机 /system/usr/keylayout/ 目录下保存着键值映射配置文件。

我们知道在 Linux 中按键都对应一个按键值(整数),通过 .kl 文件的翻译,上报给 Android 时会变成 Android 的键值。

一般的,耳机按键对应的按键映射:

key 231 CALL 
key 122 ENDCALL WAKE 
key 166 MEDIA_STOP 
key 163 HEADSETHOOK 
key 164 MEDIA_PLAY_PAUSE 
key 165 MEDIA_PREVIOUS 
key 114 VOLUME_DOWN 
key 115 VOLUME_UP

手机耳机是手机非常重要的功能之一,耳机的插拔检测和按键检测和相对比较麻烦,日常工作中也容易出现一些新的需求,如新的设备需要通过耳机接口被接入到手机中。因此,研究其驱动和应用层的实现还是很有必要的。

分类:

移动端开发

标签:

移动端开发

作者介绍

Jasonangel
V1