也需打开此宏开关
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,检测电路实例如下: