ACCDET
1. 耳机种类
耳机种类分大概分为三段(TRS)和四段(TRRS:OMTP、CTIA/AHJ)两种(具体的还有直径和长度之分,这里不再详述),具体规格如图:
带三个按键和MIC的标准耳机电路:
2. MTK平台耳机检测种类
1.
ACCDET
这种方式只使用ACCDET检测HP_MIC上的电压,检测时会出现更多的错误或者错误的按键状态。
缺点:
插拔时由于耳机MIC上的电压导致电路噪声比较大。
插拔错误检测率比ACCDET+EINT方式的低,会出现更多的错误检测;按键错误检测率也比后者的低。 电路设计:
2.
ACCDET+EINT
这种方式HP_MIC作为检测中断源的同时使用ACCDET来检测HP_MIC上的电压。对于电路噪声改善比较大。 电路设计:
3.
ACCDET+EINT(multi-key) 设计要求:
需要在L_switch引脚添加470K上拉电阻 HPL和HPR输出引脚需要添加470ohm下拉 使用1K电阻将ACCDET和HP_MIC连接起来 耳机检测:
Plug in:HP_EINT触发中断->插入检测->ACCDET检测耳机类型 Plug out:HP_EINT触发中断->拔出检测 (HP_EINT:插入拔出检测 ACCDET:检测耳机类型和按键 UP:0.09 4. ACCDET+EINT(multi-key+Pin recognition) 对于TRRS耳机的两种标准,MTK提供了这个方案来解决耳机检测的兼容问题。 检测流程如第3点(ACCDET+EINT(multi-key)),稍微不同的是在检测时软件处理上多了1s的防抖延时。 此方案限制: 仅支持默认的耳机接口(default open audio jack) 对于使用外置功放的方案,因为使用外放播音乐时插入耳机会导致检测时效,所以不支持Pin recognition检测方案。 对于CTIA(L/R/G/M)类型的耳机:如果非默认类型的耳机插入,插入时间需要少于2s,否则会出现不能识别这种耳机的情况。 对于OMTP(L/R/M/G)类型的耳机,无论使用默认的还是其他耳机插入,插入时间都必须小于1s,否则会出现检测不当的情况。 3. MIC种类(ACC/DCC和BIAS见附录概述) MIC根据功放电路可以分为AC couple和DC couple: ACC模式:这时在L/R引脚和MT6328电路间有两个隔直电容 图:ACC模式 DCC模式:L/R引脚和MT6328电路间没有隔直电容: 图:DCC模式 4. 驱动配置 MT6737宏配置,平台支持的ACCDET检测功能如下,没有CONFIG开头的为其他旧平台的宏配置: CONFIG_ACCDET_EINT(ACCDET+EINT、ACCDET+EINT multi-key) #CONFIG_ACCDET_PIN_RECOGNIZATION(ACCDET+EINT multi-key+Pin recognition) #CONFIG_ACCDET_EINT_IRQ(ACCDET only) #CONFIG_ACCDET_PIN_SWAP 1: ACCDET_EINT 是否启用了外部中断来侦测是否有耳机插入和拔出 2: ACCDET_MULTI_KEY_FEATURE 是否支持使用A/D来侦测key,这里要注意的是即使耳机只有一个key若是在89的平台 也需打开此宏开关 3: ACCDET_LOW_POWER 当插入三段耳机6s后自动关闭micbias,达到省电的目的(MT6737平台改成5s并默认打开此功能) 以上三个宏在MT6737平台可以看成一个宏CONFIG_ACCDET_EINT,为ACCDET+EINT检测电路的宏配置 4: ACCDET_28v_MODE 在我们内部有一个switch是针对外部耳机是用2.8还是1.9V的切换开关,美标的是2.8V, 国标的是1.9V 5: ACCDET_PIN_RECOGNIZATION 美标的插孔识别国标的耳机,国标的耳机识别美标的插孔,MT6737平台为CONFIG_ACCDET_PIN_RECOGNIZATION,兼容识别OMTP和CTIA耳机的功能 6: ACCDET_SHORT_PLUGOUT_DEBOUNCE ACCDET_SHORT_PLUGOUT_DEBOUNCE_CN 25 拔出耳机后有时候图标会再弹出后在消失, 主要解决类似bug,MT6737平台改到DTS里边配置,后面会提及 7: ACCDET_PIN_SWAP 美标的插孔识别国标的耳机,这个时候需要借助accdet的一个上拉电阻,当有这种情形的时候AB一直为0,达到检测到的目的,当然也有误判的时候, 4段耳机按住按键插入后会有误判,MT6737平台为CONFIG_ACCDET_PIN_SWAP 8: CONFIG_ACCDET_EINT_IRQ MT6737平台ACCDET only检测电路的宏配置 MT6737 MIC宏配置: ACCDET_MIC_MODE(电路图见上面ACC/DCC电路设计) 1. L/R和PMIC间有隔直电容,配置成1,为ACC模式 2. L/R和PMIC见没有隔直电容,配置成2或者6,为DCC模式 DCC模式详细分为两种:low cost with internal bias和low cost without internal bias 如果MIC引脚和PMIC的MICBIAS脚之间有连接电阻,起偏置上拉作用,则为前者,配置成2,如果没有连接MICBIAS引脚,则为后者,配置成6。 MT6737平台ACCDET驱动DTS配置: file: cust_eint.dtsi content: @interrupt(file irq.h): IRQ_TYPE_LEVEL_HIGH = 0x00000004 IRQ_TYPE_LEVEL_LOW = 0x00000008 @debounce: gpio(pin accdet) hw PLUGIN debounce time 36 ACCDET@6 { 37 compatible = \ 38 interrupt-parent = <&eintc>; 39 interrupts = <6 8>; 40 debounce = <6 256000>; 41 }; @accdet-mic-vol: @headset-mode-setting: structheadset_mode_settings { intpwm_width; /*pwmfrequence*/ intpwm_thresh; /*pwm duty*/ intfall_delay; /*falling stable time*/ intrise_delay; /*rising stable time*/ int debounce0; /*hook switch or double check debounce*/ int debounce1; /*mic bias debounce*/ int debounce3; /*plug out debounce*/ }; 设置耳机PWM输出波形的,依次为PWM_WIDTH和PWM_THRESH..., 设置公式如下: PWM OUTPUT whole time = (PWM_WIDTH+1)/32768 sec //周期时间 PWM OUTPUT high time = (PWM_THRESH+1)/32768 sec //高电平时间可以自行调整耳机检测时间 其他参数同样是以32K时钟作为时间计数 使用: MTK平台的一次short press是有时间要求的. 下面修改方法目的是提高耳机PWM的占空比,延长HEADSET芯片内部比较器的WORK时间,这样更容易检测到耳机short press。 1、把0x200 增大为0x600 ,是提高耳机PWM的占空比。 2、把0x800 减小为0x600 或者 0x700,是减小耳机按键产生中断的debounce time。 如果第一步修改后,效果改善就无需修改第二步。 side effect: 这样调整由于提高了耳机PWM的占空比,这样的话耳机功耗会增加一些, 不过本身耳机耗电就很小,增加的功耗也在可接受范围内。 @accdet-plugout-debounce: gpio(pin accdet) hw PLUGOUT debounce time @accdet-mic-mode: 1:ACC mode, 2:low cost without in bias, 6:low cost with in bias (HW) @headset-three-key-threshold: 三键式耳机(MID/UP/DOWN PMIC内部通过AUXADC采样)检测电压范围(mV) 0<= Vol< 80: MID 80<= Vol< 288: UP 288<= Vol< 544: DOWN @headset-four-key-threshold: 四键式耳机(MID/VOICE/UP/DOWN PMIC内部通过AUXADC采样)检测电压范围(mV) @ACCDET_pins_eint_int: 耳机accdet引脚定义 352 &accdet { 353 accdet-mic-vol = <7>; 354 headset-mode-setting = <0x500 0x200 1 0x1F0 0x800 0x800 0x20>; 355 accdet-plugout-debounce = <20>; 356 /*1:ACC mode, 2:low cost without in bias, 6:low cost with in bias*/ 357 accdet-mic-mode = <1>; 358 /*0--MD_MAX--UP_MAX--DW_MAX*/ 359 headset-three-key-threshold = <0 80 288 544>; 360 /*0--MD_MAX--VOICE_MAX--UP_MAX--DW_MAX*/ 361 headset-four-key-threshold = <0 58 121 192 450>; 362 }; 363 364 &accdet{ 365 pinctrl-names = \ 366 pinctrl-0 = <&ACCDET_pins_default>; 367 pinctrl-1 = <&ACCDET_pins_eint_int>; 368 status = \369 }; 393 &pio { 394 ACCDET_pins_default:accdet_eintdefault{ 395 }; 396 ACCDET_pins_eint_int: accdet_eint { 397 pins_cmd_dat { 398 pins = 400 bias-disable; 401 }; 402 }; 403 }; ACCDET驱动流程概述(此处采用ACCDET+EINT模式来讲述): 绿色部分:用户操作和耳机状态 1. 用户插入耳机,由AP EINT检测中断 2. AP EINT中断下半部初始化PMIC ACCDET设置,打开ACCDET中断 3. 继续插入耳机,PMIC ACCDET中断,内部比较器比较电压,判断插入、拔出和耳机 类型 4. 驱动上报耳机类型 ACCDET driver initcdevReport key event:PLAYPAUSE,VOLDOWN,VOLUP and VOICEinputaccdet_irq_handlerAccessory detection-state machineReference docState machine:Report state & report keyswitchSwitch state:NO_DEVICE,HS_MIC,HS_NO_MICApplication response debugaccdet_workPMIC EINTPMIC registersSwitch stateAP EINTaccdet_eint_funcINT12:accdet_int_handlerINT13:accdet_eint_int_handleraccdet_eint_workUser headset plugin state 1User headsetUser headset plugin state 2SYNC STATE: en/dis PMIC ACCDET EINT/IRQSync 1: enable_accdetSync 0: disable_accdetEINT STATEPLUG_OUTPLUG_INaccdet_eint_work_callback图:ACCDET驱动流程 ACCDET检测状态机: 图:ACCDET检测按键/拔出状态机 5. 耳机检测 ACCDET内部有两个比较器,会根据传入的电压判断并产生中断。ACCDET的输入电压即耳机 MIC PIN 的电压,内部比较器的输出分别对应A/B两个寄存器。 图:内部比较器 ACCDET内部两个比较器的Vref分别是1.77V和0.4V(硬件决定的,不能修改),所以,对应的电压有3个范围: 1.77V-1.9V: 未插入耳机的状态(AB=B11) 0.4V-1.77V: 插入4段式(有Mic)耳机时的状态(AB = B01) 0-0.4V : 插入3段式耳机时的状态,或者4段式按键按下时的状态(AB = B00) 耳机的状态会保存到ACCDET的寄存器中,当电压在任意2个范围间切换时,状态发生变化,ACCDET产生中断,中断处理中读取状态寄存器的值,并根据状态的变化做相应的处理。 6. 按键检测 耳机三个按键电压范围如下: MD UP DW |--------------------|---------------|---------------| 0V<=MD< 0.08V<= UP<0.22V<=DW <0.5V 耳机按键的电阻值推荐如下: Middle Key:0欧 Up Key:220欧 Down Key:600欧 耳机按键的电压是通过PMIC的ADC通道来读取的,根据读到值大小来判断在哪个按键区间,进而识别为不同的key,然后上报不同的key给Android 层。 7. 使用外置IC检测耳机 MTK平台驱动支持添加外置IC来增强耳机检测功能,如TI的TS3A225EIC,检测电路实例如下: 图:TS3A225EIC检测电路(TI官网) 8. 常见问题FAQ [FAQ13888][headset]怎样定位耳机按键误判的问题 出现误判肯定是通过ADC读取到的电压偏大或者偏小导致的。 可以从下面两个方面来check: 1、用示波器测量耳机按键的电压,看是否在正确的范围内,如果测量正确,那么就是PMIC 耳机ADC通道读到值不准确。 如果用示波器测量到的电压就偏大或者偏小,那么就是耳机按键硬件电路的问题,只能从耳机硬件电路原理上来check。 2、如果是PMIC 耳机ADC通道读值不准确的话,可以用示波器测量该ADC通道的参考电压是否有波动?是否有添加电容等,可以对比参考设计来check。 通过PMIC ADC读取的耳机按键电压是否会随着MICBIAS电压变化而变化? ==》 是不会变化的,ADC读取的耳机按键电压是根据基准电压1.9V来输出,就算MICBIAS电压调整到2.7V,PMIC ADC芯片内部会根据读取到的电压转换基准电压后输出一个值。 这就解释了为什么MICBIAS电压调整后,耳机按键检测的电压范围不改变的原因。 [FAQ13887][headset]怎样解决插入耳机后等待2s时间才显示图标或者检测到耳机MIC类型 内容 [DESCRIPTION] 经常有客户遇到插入耳机后差不多等待了2s时间才显示图标或者检测到耳机MIC类型 [SOLUTION] 出现这样的问题是由于定义了宏 ACCDET_PIN_RECOGNIZATION 定义该宏后由于该宏设计的原因,会在文件 alps\\kernel-3.10\\drivers\\misc\\mediatek\\accdet\\mt6752\\accdet.c 函数static inline void accdet_init(void)里面会调整耳机类型检测accdet中断debounce time为2s。 // init the debounce time #ifdef ACCDET_PIN_RECOGNIZATION pmic_pwrap_write(ACCDET_DEBOUNCE0, cust_headset_settings->debounce0); pmic_pwrap_write(ACCDET_DEBOUNCE1, 0xFFFF); //该数值单位为1/32K ,这样0xffff*(1/32K)就是2s了。 pmic_pwrap_write(ACCDET_DEBOUNCE3, cust_headset_settings->debounce3); pmic_pwrap_write(ACCDET_DEBOUNCE4, ACCDET_DE4); #else 开启ACCDET_PIN_RECOGNIZATION后,需要2s时间的原理如下: 当按插柱分段逐步插入不匹配耳机后,AB的值很容易先进到01,而按照设计,如果进到01处理中,则不能进行i不匹配耳机的判断,因此需要将AB=01的情况避开,方法是将AB=01的debounce1=0xFFFF约为2s,这样用户在逐节插入耳机时,如果进到AB=01的情况,由于debounce1=2s,这样逐节插入绝大多数的情况应该都可以跳过AB=01,但如果用户逐节插入确实超过2s才完全插入耳机,就会先进到AB=01的处理,而后变为AB=0,产生press key的行为,这样就认不到不匹配耳机了。 PIN recognition limitation 1、在press up key插入兼容的耳机后,大于1s release key,这时弹出不兼容耳机的提示框,或插入兼容耳机马上press up key(1s内),小概率性会弹出不兼容耳机的提示框。 2、将不兼容耳机按插柱分节逐步插入插座,在插柱的第三节到第四节的过渡停留超过大约2s,之后完全推入耳机, 不兼容耳机会认不到,不能弹出不兼容耳机的提示框 3、插入耳机后,识别到耳机插入的时间要比pin recognition长,用户体验上来说,audio切到耳机的时间要比没有pin recognition长(大约长1-2s) 4、Android Toast 因为show message采用的是android Toast方案,因此会有Toast行为本身的局限性,比如锁屏时,不能show message,插着不兼容耳机开机,开机后不能show message所以如果定义了宏ACCDET_PIN_RECOGNIZATION 就有这样的限制,是没有办法优化的,如果无法接受limitation,就关闭该宏, 9. 参考(来源于网页,待确认) MICBIAS(偏置电压) 偏置:在电路某点给一个参考分量,使电路能适应工作需要。 偏置可以是DC偏置,也可以是AC偏置。也可分为电流偏置和电压偏置。常见的是DC偏置。即电路某点经过一个起偏置作用的元件接到某个DC电源上。例如单级三极管发射极放大电路,至少需要一个基极偏置电阻。由于三极管放大电路经常用电流放大系数来计算放大效果。因此偏置电阻定义为电流偏置电阻,以便于计算和分析。 CMOS门电路输入端,接的上拉电阻或下拉电阻,一般可认为是电压偏置电阻。因为通过这个电阻的电流很少,电阻基本上是给门输入端一个静态参考电压。交流偏置的一个典型应用例子:录音机的交流偏磁。 AC/DC couple(交流、直流耦合) 直流耦合 直流耦合(DC Coupling)就是直通,交流直流一起过,并不去掉了交流分量。 比如在3V的直流电平上叠加一个1Vpp的正弦波,如果用直流耦合,看到的是以3V为基准,+/-0.5V的正弦波。在功率放大中有重要应用。 交流耦合 交流耦合(AC Coupling)就是通过隔直电容耦合,去掉了直流分量。 交流耦合和直流耦合在匹配电路上的区别 直流耦合就是直接的导线连接,包括通过像电阻之类的线性元件的连接。它适用于对包括直流分量的信号的放大电路中。在直流耦合电路中,各级电路的静态工作点是互相影响的。一级的工作点改变了相邻的二级也会受到影响。因此不能单独地调整工作点电流和电压。而在交流耦合直流不耦合的电路中各级电路是用电容或者是电感隔离开的。因此静态工作点是独立的,调整静态工作点比较容易。直流耦合中因为各级的输入和输出阻抗是一定的,不好作阻抗变换,直接耦合时高效率匹配就很难做到。而在交流耦合电路中用线间变压器就很好地进行阻抗变换实现高效率的匹配。特别是选频放大电路中普遍采用的LC谐振电路更是极大地提高了电路的效率。 其他网页 http://andiha.no/articles/audio/dcamp.htm http://e2e.ti.com/blogs_/b/behind_the_wheel/archive/2014/11/19/can-you-hear-me-now-audio-jack-switches-could-be-the-answer https://en.wikipedia.org/wiki/Phone_connector_(audio)#TRRS_standards MTK文档: Driver_All_in_One_V1.0_MT6735_6753.pdf Accessory_Detection_introduction_customer_V1.0.pdf MT6328_Audio_Speech_Design_Note_V0.1.pdf