【audio】耳机插拔 线控按键识别流程
耳機(jī)插拔/線控按鍵識別流程
耳機(jī)插拔/線控按鍵識別流程
1.文檔概述
本文以msm8909平臺,android N為例,介紹了通用情況下,耳機(jī)插拔的流程步驟,以及對耳機(jī)類型的識別邏輯。以方便在項目工作中經(jīng)常會遇到耳機(jī)不被識別,或者識別后不能正常工作等情況,都可以參考此文檔檢測判斷邏輯,確定問題根本,理解底層框架。
2.耳機(jī)的類型
從主觀來看,耳機(jī)分三段耳機(jī)和四段耳機(jī),而四段耳機(jī)又分為歐標(biāo)和美標(biāo)兩種。通常,四段耳機(jī)被寫作headset,而三段耳機(jī)寫作headphones。具體的區(qū)別如下圖:
三段耳機(jī):線序分別為,L、R、G,沒有MIC端,所以三段耳機(jī)無法使用mic,只能接受聲音,另外,三段耳機(jī)L,R線序長度正常,G端比較長
四段-美標(biāo)(CTIA)耳機(jī):線序分別為L,R,G,M,第三階為GND
四段-歐標(biāo)(OMTP)耳機(jī):線序分別為L,R,M,G,第四段為GND
如想兼容兩種不同類型的耳機(jī):
有以下方式可以選擇:
增加硬件兼容支持兩種耳機(jī)
使用轉(zhuǎn)接線
在軟件上,除了上述情況以外,還有一些外設(shè)設(shè)備會鏈接到耳機(jī)接孔,比如:自拍桿,外接音箱,TTY設(shè)備或者AUX延長線等,在軟件上,對這些額外的設(shè)備進(jìn)行了一個分類,如下枚舉:
enum wcd_mbhc_plug_type {
MBHC_PLUG_TYPE_INVALID = -1, // ——無效設(shè)備
MBHC_PLUG_TYPE_NONE, // ——未接入設(shè)備
MBHC_PLUG_TYPE_HEADSET, // ——四段耳機(jī)
MBHC_PLUG_TYPE_HEADPHONE, // ——三段耳機(jī)
MBHC_PLUG_TYPE_HIGH_HPH, // ——高阻抗耳機(jī)
MBHC_PLUG_TYPE_GND_MIC_SWAP, //——歐美標(biāo)標(biāo)志位
};
可以在log中檢索如下樣例,確認(rèn)目前MBHC耳機(jī)狀態(tài)類型
wcd_mbhc_find_plug_and_report:
entercurrent_plug(1) new_plug(2)
除了上述以外,還有一種LINE_OUT設(shè)備,如AUX延長線,以上幾種情況都是一些本身比較特別的耳機(jī)接口,當(dāng)然LINE-_OUT本身也屬于一種特殊的HIGH_HPH設(shè)備,其中比較普遍的如iphone的耳機(jī)屬于HIGH_HPH設(shè)備。
個人經(jīng)驗,在插入自拍桿和編寫音箱球的時候,從LOG上看,是被識別成headset處理的。但音箱球是個很特殊的設(shè)備,電阻超過我們閥值很多,歐標(biāo)配置的手機(jī)可能適用這個設(shè)備。在PIXI445TF上插入音箱球后有圖標(biāo),但卻無法正常使用。這樣的情況的原因是,為們增大了識別的閥值,但平臺卻不支持這樣的設(shè)備造成。
2.1 如何區(qū)分歐標(biāo)和美標(biāo)耳機(jī)
通常在國內(nèi)有一些簡單的區(qū)分方式,比如依照中間的橡膠圈來區(qū)分,白色是美標(biāo),黑色素歐標(biāo)(國內(nèi)大部分廠商都使用歐標(biāo),所以也有把OMTP叫做國標(biāo))。PS:這種說法僅作參考,因為黑色橡膠圈的美標(biāo)耳機(jī)也有很多
區(qū)分美標(biāo)或者歐標(biāo),可以簡單的用萬能表來測量耳機(jī)電阻,確定線序中的GND是在第三段或者第四段,具體方法不再贅述。喇叭單元(第一二節(jié))到地電阻通常是16~32歐姆,找到哪一節(jié)是地線就知道是什么耳機(jī)。
2.2 對耳機(jī)的檢測
Qcom對耳機(jī)的檢測是在wcd_mbhc_v2.c中進(jìn)行,在耳機(jī)接孔中存在一個detced引腳,用于檢測是否有設(shè)備接入,具體接入的設(shè)備,會根據(jù)對micbias的電壓等參數(shù)來做判斷,下面會做詳細(xì)介紹。
目前市面上耳機(jī)的阻抗不同,大都在32歐姆左右,driver會根據(jù)不同電阻來配置不同響度,在void wcd_imped_config()函數(shù)中會有這樣的邏輯。
從目前來看,這個閥值需要調(diào)節(jié)至36,因為如果以32作為臨界值,會有很多客戶發(fā)現(xiàn)部分耳機(jī)使用起來音量大小差異較大(差了4.5db)。
以iphone的耳機(jī),接入設(shè)備有執(zhí)行以下流程,如下流程圖:
以上步驟分別注釋:
耳機(jī)插入后會產(chǎn)生中斷,確認(rèn)事件,但在接入時候可能會由GND接觸MIC端造成硬件短路等情況,所以需要在接入時候進(jìn)行一個2s的延遲(qcom默認(rèn)是0.5s)來確認(rèn)是耳機(jī)插入事件,而不是btn事件。這點可以用于優(yōu)化個別耳機(jī)接入后自動出現(xiàn)音量調(diào)節(jié)的問題。
中斷中進(jìn)入第一次耳機(jī)類型檢測代碼:static void wcd_mbhc_detect_plug_type(struct wcd_mbhc *mbhc)
第一次耳機(jī)類型檢測代碼處理:在50ms內(nèi)反復(fù)讀取0x1580x159的兩個寄存器的值,(注意這兩個寄存器的值是跟HS_VREF threshold 的設(shè)置有關(guān))
第一次耳機(jī)類型檢測代碼處理:確認(rèn)檢測出來0x158 0x159寄存器值是否等于(0 ,0)
如果0x158和0x159的值為(0,0)說明是類型是耳機(jī),直接上報給上層
若寄存器值是(0,1),說明是高阻態(tài)耳機(jī)類型
進(jìn)入第二次耳機(jī)類型檢測代碼(static void wcd_correct_swch_plug(struct work_struct *work))。
同時確認(rèn)耳機(jī)不是歐標(biāo)/美標(biāo),在static int wcd_check_cross_conn(struct wcd_mbhc *mbhc)中,如果確認(rèn)不支持某款,可以在該函數(shù)開始直接return false。
同時在3s內(nèi)讀取0x159,0x158的寄存器的值,再進(jìn)行判斷
如果讀取出來的數(shù)值仍然為(0,1),說明結(jié)果仍然是高阻抗耳機(jī)
進(jìn)入特殊耳機(jī)檢測(static bool wcd_is_special_headset(struct wcd_mbhc *mbhc))
特殊耳機(jī)檢測(wcd_is_special_headset)會在2S內(nèi)反復(fù)檢測0x158 0x159寄存器值,并且抬高mic bais相關(guān)電壓,正常情況電壓會在1.5V左右,此時進(jìn)行抬高會將電壓增加到2.7V左右
將電壓抬到一定程度讀出0x158 0x159寄存器值繼續(xù)確認(rèn)是否為(0 ,0)
讀出0x158 0x159寄存器值是(0 ,1),說明是高阻態(tài)設(shè)備,會進(jìn)行上報處理后上報
以上結(jié)果,如果以目前手機(jī)情況,插入一個iphone的高阻抗耳機(jī),大約需要7s左右才能正常識別到耳機(jī),請留意該情況。
2.3 LINE_OUT DEVICE ERROR
由于個別LINE_OUT設(shè)備電阻太大造成的不識別問題,可以通過修改v_hs_max的參考電壓來增加識別機(jī)率,qcom默認(rèn)為1.5V,通常會增加到1.7V。qcom默認(rèn)支持設(shè)備的電阻范圍是在5k歐,但個別設(shè)備遠(yuǎn)遠(yuǎn)超過這個閥值,如AUX cable達(dá)到了2W+歐,移動音箱球達(dá)到了0.6M歐,可以修改linein_th的閥值來增加識別范圍,建議最大設(shè)置為3W,否則會造成很多額外設(shè)備能夠被識別成耳機(jī),但卻無法使用的問題。
3.耳機(jī)線控按鍵
通常耳機(jī)上的線控按鈕會有一個或者三個,如果HOOK,音量+,音量-(音量調(diào)節(jié)的按鈕只在部分耳機(jī)上會有,如TF運營商目前的標(biāo)準(zhǔn)僅支持一個HOOK按鍵)
HOOK的作用是由上層負(fù)責(zé),底層只需要確保上報了對應(yīng)的HOOK event給上層。
線控按鈕的按鍵檢測,在驅(qū)動中,會在如下的static void* def_msm8x16_wcd_mbhc_cal函數(shù)中進(jìn)行閥值的設(shè)置:
/*
* 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的設(shè)定是對不同供電而言,Low對應(yīng)Current Source的分壓,High對應(yīng)Mic Bias的分壓,而這兩種供電方式取決于應(yīng)用場景的不同,采取不同的供電,分壓值對應(yīng)做不同的設(shè)置,如下代碼中判斷
btn_voltage =((is_micbias) ? btn_high : btn_low);
按鍵識別與耳機(jī)上btn[4]的閥值設(shè)置有關(guān)。由于我們的標(biāo)配耳機(jī)mic阻值(300mV電壓偏置下等效阻抗1.2Kohm)較小,current模式的時候vmic上電壓較低,和btn[4]的范圍有重疊,所以按Hook key的時候容易產(chǎn)生btn[4]的事件,雖然btn[4]沒有用到,但是會影響到hook key的狀態(tài)
軟件的具體改動是把除了要用的兩個鍵,其他的閥值都設(shè)成了300, 保證不會誤按鍵產(chǎn)生,另外,鑒于很多自拍桿在按鍵都是觸發(fā)btn2的情況,btn2需要適配自拍桿。
耳機(jī)按鍵硬件原理
上圖是耳機(jī)MIc線控板的原理簡化圖,圖中方框內(nèi)是耳機(jī)內(nèi)線控板mic和按鍵的等效電路,右側(cè)是手機(jī)內(nèi)的Mic接口偏置電路。
3.1.1 MIC的工作原理
在分壓電阻R和MIC兩端加DC偏置電壓V,MOS管與MIC_BIAS電阻R(推薦2.2Kohm)分壓,Mic電容振膜在接收聲波振動時兩端會產(chǎn)生微弱的電壓變化,經(jīng)過MOS管的放大腳放大后,Pin4與Pin3兩端分的電壓也會相應(yīng)變化,此時采集到的交變信號就是音頻的信號Output到手機(jī)Mic in端。
MIC2_P 為MIC輸入及耳機(jī)按鍵功能檢測,按鍵檢測用于監(jiān)測 耳機(jī)線控板按鍵,通過ADC檢測電壓范圍(根據(jù)上面5主btn閥值)來識別是哪一種按鍵事件,實現(xiàn)對應(yīng)的功能。關(guān)于按鍵識別ADC電壓檢測,可以參考Idol 4上的設(shè)置(高通平臺):
值得注意到是:
推薦手機(jī)端 V_mic bias為DC 2.8V,R_mic bias為2.2K ohm,調(diào)整系統(tǒng)內(nèi)部btn(MIC2_P端)檢測的電壓范圍閥值與 實際耳機(jī)一致;
其中,如果針對每個按鈕去做計算,btn后的值計算公式如下:
因為高通平臺在MIC未工作時,會降低V_micbias的電壓值到幾百mV級,經(jīng)過偏置電阻R(2.2K)和MIC分壓輸入到 HS_DET端的電壓如果不在 hook范圍,會導(dǎo)致觸發(fā)音量+/-等其它事件。
高通有一片文檔,專門講這個分區(qū)應(yīng)該如何調(diào)試,文檔名:application_note__multibutton_headset_control.pdf
三段耳機(jī)最終匯報上去的有效數(shù)據(jù)是
5 2 1 (插頭類型 耳機(jī)信號 插入/拔出)
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,//無效設(shè)備
MBHC_PLUG_TYPE_NONE,//未接入設(shè)備
MBHC_PLUG_TYPE_HEADSET,//四段耳機(jī)
MBHC_PLUG_TYPE_HEADPHONE,//三段耳機(jī)
MBHC_PLUG_TYPE_HIGH_HPH,//高阻抗耳機(jī)
MBHC_PLUG_TYPE_GND_MIC_SWAP,//歐美標(biāo)標(biāo)志位
};
4. NC,NO的區(qū)別
NC和NO的區(qū)別在det腳的初始的狀態(tài)。如下圖
軟件需要根據(jù)硬件進(jìn)行配置,配置方法如下
設(shè)備樹中qcom,msm-mbhc-hphl-swh = <0>; 0 for NC, 1 for NO
總結(jié)
以上是生活随笔為你收集整理的【audio】耳机插拔 线控按键识别流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: colab文件上传下载与挂载Google
- 下一篇: openstack虚拟机导出镜像