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

这里用的版本为Android11,kernel4.19。

由于默认的耳机检测驱动mt6357-accdet.c已换成ko的形式(非ko方式可忽略该修改),导致无法调用该驱动里的函数,先把该驱动编译进内核。

defconfig加入CONFIG_SND_SOC_MT6357_ACCDET=y

BoardConfig.mk

@@ -53,8 +53,7 @@ BOARD_FLASH_BLOCK_SIZE := 4096KERNEL_OUT ?= $(OUT_DIR)/target/project/$(TARGET_DEVICE)/obj/KERNEL_OBJ# in-tree kernel modules installed to vendor# For Common
-BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_OUT)/sound/soc/codecs/mt6357-accdet.ko \
-                   $(KERNEL_OUT)/kernel/trace/trace_mmstat.ko \
+BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_OUT)/kernel/trace/trace_mmstat.ko \

然后将CC脚检测到的耳机信号发出来

--- a/kernel-4.19/drivers/misc/mediatek/typec/tcpc/rt_pd_manager.c
+++ b/kernel-4.19/drivers/misc/mediatek/typec/tcpc/rt_pd_manager.c
@@ -52,7 +52,7 @@ void __attribute__((weak)) usb_dpdm_pulldown(bool enable){pr_notice("%s is not defined\n", __func__);}
-
+extern void typec_headphone_irq_handler(int state);static int pd_tcp_notifier_call(struct notifier_block *nb,unsigned long event, void *data){
@@ -91,10 +91,12 @@ static int pd_tcp_notifier_call(struct notifier_block *nb,if (noti->typec_state.old_state == TYPEC_UNATTACHED &&noti->typec_state.new_state == TYPEC_ATTACHED_AUDIO) {/* AUDIO plug in */
+          typec_headphone_irq_handler(1);pr_info("%s audio plug in\n", __func__);} else if (noti->typec_state.old_state == TYPEC_ATTACHED_AUDIO&& noti->typec_state.new_state == TYPEC_UNATTACHED) {/* AUDIO plug out */
+          typec_headphone_irq_handler(0);pr_info("%s audio plug out\n", __func__);}break;

在mt6357-accdet.c加入如下修改

+void typec_headphone_irq_handler(int state)
+{
+  if (accdet->cur_eint_state == EINT_PLUG_IN) {
+      accdet->cur_eint_state = EINT_PLUG_OUT;
+  } else {
+      accdet->cur_eint_state = EINT_PLUG_IN;
+      mod_timer(&micbias_timer,jiffies + MICBIAS_DISABLE_TIMER);
+  }
+  queue_work(accdet->eint_workqueue, &accdet->eint_work);
+}
+EXPORT_SYMBOL(typec_headphone_irq_handler);

这时,系统已经能检测到耳机了,播放音乐能正常听到音乐。

但检测到都是3段耳机,理论上正插和反插有一次是对的,不需要进行mic和gnd的切换。

这时测量micbias电压(有将micbias关闭的地方屏蔽),妥妥的0v。

跟mtk沟通,说要屏蔽住这里

 ret = of_property_read_u32(node,"headset-eint-num", &tmp);if (ret)tmp = 0;if (tmp == 0)accdet->data->caps |= ACCDET_PMIC_EINT0;else if (tmp == 1)accdet->data->caps |= ACCDET_PMIC_EINT1;else if (tmp == 2)accdet->data->caps |= ACCDET_PMIC_BI_EINT;

同时加入如下修改

 &pmic_accdet{
+  headset-use-ap-eint=<1>;
}

屏蔽后,正插能识别到4段耳机,反插识别为3段耳机。猜测PMIC_EINT的作用是accdet中断来了,才能打开micbias,但由于触发不了accdet中断,导致micbias无法开启。

如果像小米一样采用自动切换mic和gnd的ic FSA4480(https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/cezanne-q-oss/drivers/misc/mediatek/accdet/mt6359/accdet.c),这里的工作已经是完成了。

但这里采用切换ic是需要手工识别的,还需判断mic引脚的电压,如果电压偏低,需要进行切换。

用dct工具配置切换ic的引脚为普通gpio模式,同时确认该引脚没有被占用

+&pmic_accdet{
+  pinctrl-names ="mic_state1","mic_state2";
+  pinctrl-0 = <&mic_state1>;
+  pinctrl-1 = <&mic_state2>;
+};
+&pio {
+  mic_state1:mic_state1{
+      pins_cmd_dat {
+          pinmux = <PINMUX_GPIO155__FUNC_GPIO155>;
+          slew-rate = <1>;  //1输出 0输入
+          bias-disable;
+          output-low;
+      };
+  };
+  mic_state2:mic_state2{
+      pins_cmd_dat {
+          pinmux = <PINMUX_GPIO155__FUNC_GPIO155>;
+          slew-rate = <1>;
+          bias-disable;
+          output-high;
+      };
+  };
+};

在probe中加入如下函数mic_gpio_get(pdev);

static inline int mic_gpio_get(struct platform_device *platform_device)
{int ret = 0;accdet->pinctrl = devm_pinctrl_get(&platform_device->dev);if (IS_ERR(accdet->pinctrl)) {ret = PTR_ERR(accdet->pinctrl);return ret;}accdet->mic1 = pinctrl_lookup_state(accdet->pinctrl,"mic_state1");if (IS_ERR(accdet->mic1)) {ret = PTR_ERR(accdet->mic1);return ret;}accdet->mic2 = pinctrl_lookup_state(accdet->pinctrl,"mic_state2");if (IS_ERR(accdet->mic2)) {ret = PTR_ERR(accdet->mic2);return ret;}return 0;
}
--- a/kernel-4.19/sound/soc/codecs/mt6357-accdet.c
+++ b/kernel-4.19/sound/soc/codecs/mt6357-accdet.c
@@ -99,6 +99,8 @@ struct mt63xx_accdet_data {/* when caps include ACCDET_AP_GPIO_EINT */struct pinctrl *pinctrl;struct pinctrl_state *pins_eint;
+  struct pinctrl_state *mic1;
+  struct pinctrl_state *mic2;u32 gpiopin;u32 gpio_hp_deb;u32 gpioirq;

这里的600对应0.6v,实际该值改为0.4v,应该也是可以的。

mtk平台typec模拟耳机补丁相关推荐

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

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

  2. 两种 Type-C 耳机:模拟耳机 数字耳机

    模拟耳机 模拟耳机使用手机内部的解码芯片和耳放电路解码数字信号并输出,兼容性更好. 数字耳机 数字耳机自带 DAC 和放大器,可播放超高码率的无损音乐,手机只承担数字信号输出和供电任务,不再解码数字信 ...

  3. mtk平台 声音从mic到speaker loadspeaker handset间的关系

    关于audio相关的名称解释如下: 1. mic( 麦克风):声音输入源: 2. speaker(听筒)loadspeaker(喇叭) handset(耳机):声音输出源: 3. 音频解码器(eg:A ...

  4. Android 功耗(4)---MTK平台待机功耗分析流程

    MTK平台待机功耗分析流程 MTK平台待机功耗分析流程 1.目的 2.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法.  测试功耗数据之前,请先确认 ...

  5. MTK平台性能优化---(1)综述

    1.概述 手机性能优化越来越重要,本文介绍了性能评估.分析和优化的方法.在接下来的章节中,将会分别介绍关于系统.开机启动时间.应用启动速度性能优化,同时也会介绍如何使用一些有用的工具去评测性能瓶颈. ...

  6. MTK平台功耗分析总结

    1.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法.  测试功耗数据之前,请先确认以下配置:  1.关闭 WIFI/BT/GPS,关闭数据连接,设置 ...

  7. MTK平台待机功耗分析流程

    MTK平台待机功耗分析流程 版本信息: 作者 版本 日期 备注 陈征鼎 V1.0 2016/01/21 1.目的 2.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用 ...

  8. android平板待机电流,Android 功耗(4)---MTK平台待机功耗分析流程

    MTK平台待机功耗分析流程 1.目的 2.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法. 测试功耗数据之前,请先确认以下配置: 1.关闭 WIFI ...

  9. 基于mtk平台调试FM发射芯片KT0805

    一个比较简单的i2c设备,原理图如下, 主要是供电,硬件连接好了,软件不需要处理,音频数据是接在耳机模式上AU_HPL,AU_HPR,数据芯片自己接受发射, 软件需要处理的是SW1或者SW2,连接的G ...

最新文章

  1. 不可不知的STL sort函数实现原理
  2. 计算机视觉及深度学习_面试问题(一)
  3. 存款利息python题_python入门教程NO.8 用python写个存款利息计算器 已
  4. python 数据类型 、运算符
  5. Mediostream框架filter使用说明
  6. python 天气预报地图_在树莓派上用 python 做一个炫酷的天气预报
  7. 【数据结构与算法】拓扑排序问题C语言实现
  8. pyqt5 python qlineedit信号_Pyqt5_QlineEdit
  9. centos7切换root为mysql_Linux(centos 7)系统下mysql8及以上版本修改root账户密码
  10. JavaScript高级编程
  11. ArcGIS 10 SDE for ORACLE ---迁移 (1)
  12. 信息论与编码冯桂周林著答案_信息论与编码技术+(冯桂+林其伟+陈东华+著)+清华大学出版社+课后答案.pdf...
  13. 浏览器默认打开360搜索怎么办?
  14. php文字如何排版,文字如何实现完美UI?文本排版设计告诉你
  15. python 图片识别_Python—识别图片中的文字
  16. windows7安装中文语言包及文乱码问题解决方法
  17. 基于深度学习的人脸识别考勤系统设计
  18. jquery下载图片
  19. iPhone4平台上实时音视频对话(经验)
  20. ZeroMQ 中文指南 第四章 可靠的请求-应答模式【转载】

热门文章

  1. 使用Foxmail设置Gmail以及Hotmail
  2. “3D游戏之父”考古“诺基亚时代”手游,网友:求支持智能手机!
  3. python中科学记数法表示_matplotlib中的科学记数法
  4. 上高职业技术学校计算机专科,上高县职业技术学校
  5. 电力,地铁,医生等行业值班员全能倒班日历助手
  6. 小窍门解决大问题(绝对值得收藏)
  7. 直流电机驱动电路中L298与电机间二极管的作用
  8. 网站反爬指南:政府网站篇
  9. C#从IE浏览器获取Cookie
  10. 2-4 第18次课 高项之沟通管理与干系人管理