主要用到了这么几个文件:wcd-mbhc-v2.c    wcd-mbhc-adc.c    bengal.c

入口wcd_mbhc_init

 switch (mbhc->mbhc_detection_logic) {case WCD_DETECTION_LEGACY:wcd_mbhc_legacy_init(mbhc);break;case WCD_DETECTION_ADC:wcd_mbhc_adc_init(mbhc);break;default:pr_err("%s: Unknown detection logic type %d\n",__func__, mbhc->mbhc_detection_logic);break;}if (!mbhc->mbhc_fn ||!mbhc->mbhc_fn->wcd_mbhc_hs_ins_irq ||!mbhc->mbhc_fn->wcd_mbhc_hs_rem_irq ||!mbhc->mbhc_fn->wcd_mbhc_detect_plug_type ||!mbhc->mbhc_fn->wcd_cancel_hs_detect_plug) {pr_err("%s: mbhc function pointer is NULL\n", __func__);goto err_mbhc_sw_irq;}ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->mbhc_sw_intr,wcd_mbhc_mech_plug_detect_irq,"mbhc sw intr", mbhc);if (ret) {pr_err("%s: Failed to request irq %d, ret = %d\n", __func__,mbhc->intr_ids->mbhc_sw_intr, ret);goto err_mbhc_sw_irq;}ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->mbhc_btn_press_intr,wcd_mbhc_btn_press_handler,"Button Press detect", mbhc);if (ret) {pr_err("%s: Failed to request irq %d\n", __func__,mbhc->intr_ids->mbhc_btn_press_intr);goto err_btn_press_irq;}ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->mbhc_btn_release_intr,wcd_mbhc_release_handler,"Button Release detect", mbhc);if (ret) {pr_err("%s: Failed to request irq %d\n", __func__,mbhc->intr_ids->mbhc_btn_release_intr);goto err_btn_release_irq;}ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->mbhc_hs_ins_intr,mbhc->mbhc_fn->wcd_mbhc_hs_ins_irq,"Elect Insert", mbhc);if (ret) {pr_err("%s: Failed to request irq %d\n", __func__,mbhc->intr_ids->mbhc_hs_ins_intr);goto err_mbhc_hs_ins_irq;}mbhc->mbhc_cb->irq_control(component, mbhc->intr_ids->mbhc_hs_ins_intr,false);clear_bit(WCD_MBHC_ELEC_HS_INS, &mbhc->intr_status);ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->mbhc_hs_rem_intr,mbhc->mbhc_fn->wcd_mbhc_hs_rem_irq,"Elect Remove", mbhc);if (ret) {pr_err("%s: Failed to request irq %d\n", __func__,mbhc->intr_ids->mbhc_hs_rem_intr);goto err_mbhc_hs_rem_irq;}mbhc->mbhc_cb->irq_control(component, mbhc->intr_ids->mbhc_hs_rem_intr,false);clear_bit(WCD_MBHC_ELEC_HS_REM, &mbhc->intr_status);ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->hph_left_ocp,wcd_mbhc_hphl_ocp_irq, "HPH_L OCP detect",mbhc);if (ret) {pr_err("%s: Failed to request irq %d\n", __func__,mbhc->intr_ids->hph_left_ocp);goto err_hphl_ocp_irq;}ret = mbhc->mbhc_cb->request_irq(component,mbhc->intr_ids->hph_right_ocp,wcd_mbhc_hphr_ocp_irq, "HPH_R OCP detect",mbhc);if (ret) {pr_err("%s: Failed to request irq %d\n", __func__,mbhc->intr_ids->hph_right_ocp);goto err_hphr_ocp_irq;}mbhc->deinit_in_progress = false;pr_debug("%s: leave ret %d\n", __func__, ret);return ret;

1.初始化wcd-mbhc-adc.c里的wcd_mbhc_adc_init:主要INIT_WORK(&mbhc->correct_plug_swch, wcd_correct_swch_plug);创建一个任务队列纠正当前类型。

2.注册了七个中断。

wcd_mbhc_mech_plug_detect_irq ----耳机中断,无论怎么插耳机必走

wcd_mbhc_btn_press_handler ----按键按下中断

wcd_mbhc_release_handler ----按键松开中断

wcd_mbhc_hs_ins_irq ----选择插入中断(一般插着typec转接线再插耳机会触发)WCD_MBHC_ELEC_HS_INS是标志位,通过wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false);打开或者关闭这个中断。

wcd_mbhc_hs_rem_irq ----选择拔出中断,同上。

 do {retry++;/** read output_mv every 10ms to look for* any change in IN2_P*/usleep_range(10000, 10100);output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P);pr_debug("%s: Check for fake removal: output_mv %d\n",__func__, output_mv);if ((output_mv <= adc_threshold) &&retry > FAKE_REM_RETRY_ATTEMPTS) {pr_debug("%s: headset is NOT actually removed\n",__func__);goto exit;}} while (!time_after(jiffies, timeout));

有时候micbiae电压变化也会发出拔出中断,可以提高WCD_MBHC_ADC_HS_THRESHOLD_MV的值,比如2200。

最后bengal.c里.detect_extn_cable = true代表检测外部的连接线,会把WCD_MBHC_ELEC_HS_INS和WCD_MBHC_ELEC_HS_REM赋值为true,打开第4、5个中断。反之关掉这俩中断。

SM4250平台typec耳机检测相关推荐

  1. mtk平台typec模拟耳机补丁

    typec模拟耳机在某些高端手机上已经很常见了,但拿到的代码默认不支持typec模拟耳机(在某些平台上默认就是typec模拟耳机),那只能自己修改了. 这里用的版本为Android11,kernel4 ...

  2. android type c 耳机检测,USB Type-C 的新音频标准将帮助 Android 设备去掉 3.5mm 耳机孔...

    原标题:USB Type-C 的新音频标准将帮助 Android 设备去掉 3.5mm 耳机孔 苹果往往能够带领硬件行业的一个潮流,虽然在刚开始的时候,充满争议.但随着 iPhone 7 正式去除 3 ...

  3. typec耳机知识介绍

    数字耳机和模拟耳机 模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图. 数字耳机(右图)包含一个usb声卡+DAC&&ADC+amp+模拟耳机,当数字耳机 ...

  4. 小知识·typec耳机原理

    目录 数字耳机和模拟耳机 手机中模拟和数字耳机的差异 typec耳机介绍 数字耳机和模拟耳机 模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图. 数字耳机(右图)包含一个 ...

  5. typec耳机知识介绍-数字耳机,模拟耳机

    数字耳机和模拟耳机 模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图. 数字耳机(右图)包含一个usb声卡+DAC&&ADC+amp+模拟耳机,当数字耳机 ...

  6. ALSA子系统(十七)------支持Type-C耳机驱动

    你好!这里是风筝的博客, 欢迎和我一起交流. 之前讲解了耳机驱动: ALSA子系统(十六)------虚拟耳机驱动 Android音频子系统(四)------耳机拔插流程 那么必然少不了现在市场上较多 ...

  7. Android 耳机检测原理介绍

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  8. 高通平台的耳机检测(msm8909)

    记录高通msm8909耳机检测的机制,相关代码 kernel/arch/arm/boot/dts/qcom/msm8909-qrd-skuc.dtsi sound {         compatib ...

  9. Android Switch驱动的耳机检测

    在 Android 中添加了一个 switch 驱动,用于监测一些开关的变化,例如:HDMI.耳机的插拔检测之类的. 驱动源码存在内核源码的 drivers/switch 中,目录下有两个主要文件:s ...

最新文章

  1. 关于《资产负债表》中未分配利润项目的填列
  2. Apache 与 Nginx
  3. 连续液位测量行业调研报告 - 市场现状分析与发展前景预测
  4. 记录下我的Linux系统中vim文件的配置---(.vimrc文件配置模板)
  5. c 调用java map_如何从C中的map迭代器调用类成员函数?
  6. SVN下载安装及使用教程
  7. [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法
  8. win10+ubuntu16.04双系统下完全删除并重装ubuntu16.04
  9. 电脑计算机推荐笔记本电脑,十佳办公笔记本电脑排名,性价比高的笔记本电脑推荐...
  10. 手机日志抓取工具及注意事项
  11. 802d简明调试手册_802D 简明调试指南.pdf
  12. 如何部署一个属于自己的网站
  13. 前端的几种数据存储方式
  14. 智能科学与技术与数据科学与大数据技术哪个好
  15. 不会写代码,我就偏偏就做自动化测试了。
  16. 柔性电子: Triboelectric Nanogenerator摩擦生电
  17. VMware workstation搭建华为FusionCompute实验环境(二)保姆级安装教程,可运行虚拟机
  18. vue-cli初始化项目时localhost打不开
  19. python io密集 多线程_Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程...
  20. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

热门文章

  1. 我认识的七个理想主义者
  2. imap java 接收_javamail实现邮件接收功能IMap和pop3方式
  3. 2013驾考科目一理论知识重点归纳
  4. mysql 按拼音码查询,MySQL拼音首字母查询
  5. 常用计算机系统包括,常用的保护计算机系统的方法有()。
  6. React Native学习资源汇总
  7. python 单词纠错_用 Python 实现英文单词纠错功能
  8. 欧姆龙PLC网关BL110之41:实现欧姆龙 PLC 接入Modbus TCP 云平台
  9. 时间加减计算器_财政局刚刚回应丨禁止携带计算器,否则成绩无效!
  10. 班级优化大师显示网络或服务器异常,希沃班级优化大师常见问题总汇