android 耳机接口设备无法识别问题

android 耳机接口设备无法识别问题
问题概述
在android上调试audio的时候经常会发现很多耳机设备不识别的情况,例如,AUX转接线,外接音箱球,自拍杆,以及部分耳机
问题原因
android源生对耳机的识别是有一定范围的,会根据设备的电阻值,通过对电压和电流的分析来判断属于哪种设备,然后来决定支持的方式。
android对耳机的分类
android对耳机的分裂,在dirver中有如下的定义:
95enum wcd9xxx_mbhc_plug_type {
96 PLUG_TYPE_INVALID = -1,
97 PLUG_TYPE_NONE,
98 PLUG_TYPE_HEADSET,
99 PLUG_TYPE_HEADPHONE,
100 PLUG_TYPE_HIGH_HPH,
101 PLUG_TYPE_GND_MIC_SWAP,
102 PLUG_TYPE_ANC_HEADPHONE,
103};
104
简单来说,4段耳机分为欧标和美标,线序分别为L-R-G-M和L-R-M-G,而3段耳机是没有M的(所以3段耳机只能听,不能说话)
目前市面上的中高端手机基本都是兼容欧/美标耳机,需要在硬件上做兼容,仅靠软件方面的话,目前不知道有办法解决(我个人而言)
而AUX外接线,音箱球,以及个别耳机(比如iphone的耳机就是高阻抗耳机)会增大电阻,导致电压和电流超出阀值,造成误判,所以在考虑市场的情况下,我们会对这些大众产品做出兼容。
Ps:也有遇到过极个别伪劣耳机的电阻很大,基本超过几倍,考虑到无限制的去兼容所有耳机不可取也不现实,这类低用户使用的极端情况不予兼容。
举个栗子,以AUX和正常耳机的对比:
android 耳机接口设备无法识别问题
上图对比,AUX外接线设备被判断为了type4,而正常支持耳机是type1,两者的差距在于电阻差距太大,在audio的driver中有linein_th threshold对电阻的范围作出阀值,默认是5000,可以适当调高该值
100 * Android L spec
101 * Need to report LINEIN
102 * if R/L channel impedance is larger than 5K ohm
103 */
104static struct wcd_mbhc_config mbhc_cfg = {
105 .read_fw_bin = false,
106 .calibration = NULL,
107 .detect_extn_cable = true,
108 .mono_stero_detection = false,
109 .swap_gnd_mic = NULL,
110 .hs_ext_micbias = false,
111 .key_code[0] = KEY_MEDIA,
112 .key_code[1] = KEY_VOICECOMMAND,
113 .key_code[2] = KEY_VOLUMEUP,
114 .key_code[3] = KEY_VOLUMEDOWN,
115 .key_code[4] = 0,
116 .key_code[5] = 0,
117 .key_code[6] = 0,
118 .key_code[7] = 0,
120 .linein_th = 30000,
同理,该类问题,可以根据插入设备之后,log中上报的设备和type来确定android将设备如果判断,再根据判断原因,寻找判断条件来做调试。