基于QCM 8960

二十七、Audio jack1. https://wiki.sonyericsson.net/androiki/Huashan_legacy_feature:_Vibrator_%26_Audio_Jack

2. How to get debug info

1 dump register before and after headset plug, use following command to dump register

1.1 $ adb shell 'mount -t debugfs debugfs /sys/kernel/debug/'

1.2 $ adb shell 'cat /sys/kernel/debug/asoc/msm8960-snd-card/tabla_codec/codec_reg'

2 Log message during insertion please enable wcd9xxx-core.c +p, wcd9310.c +p, wcd9xxx-irq.c like following

2.1 $ adb shell 'mount -t debugfs debugfs /sys/kernel/debug/'

2.2 $ adb shell 'echo -n "file wcd9310.c +p" > /sys/kernel/debug/dynamic_debug/control'

2.3 $ adb shell 'echo -n "file wcd9xxx-core.c +p" > /sys/kernel/debug/dynamic_debug/control'

2.4 $ adb shell 'echo -n "file wcd9xxx-irq.c +p" > /sys/kernel/debug/dynamic_debug/control'

4. $ adb shell 'cat /sys/kernel/debug/gpio' 得到GPIO状态  gpio-189 = 151 + PMIC8921的38 Pin

gpio-189 (--          ) in         lo 0x05 0x10 0x22 0x30 0x40 0x58

5. cat sys/module/snd_soc_msm8960/parameters/hs_detect_use_gpio; 可查看是否使用gpio中断检测headset insert/remove

二十八、如何检测 headset/headphone 插入或拔出

0. 针对wcd9310不需要读取firmware.

1. 主要分析 /kernel/sound/soc/codecs/wcd9310.c, kernel/sound/soc/msm/msm8960.c

2. msm8960_audrx_init@msm8960.c中 全局变量hs_detect_use_gpio 设置是否用PMIC的GPIO检测耳机插入

err = tabla_hs_detect(codec, &mbhc_cfg); //设置GPIO38的中断处理函数

tabla_hs_detect->tabla_mbhc_init_and_calibrate 设置中断处理函数    tabla_mechanical_plug_detect_irq,

中断pin是tabla->mbhc_cfg.gpio_irq;

@kernel/sound/soc/msm/msm8960.c中找到中断Pin的定义msm8960_audrx_init函数中 mbhc_cfg.gpio_irq = JACK_DETECT_INT; 也就是PM8921的第38Pin

mbhc_cfg.gpio_level_insert=1;表示headset插入时,中断JACK_DETECT_INT的值为高

如果不用GPIO中断检测耳机插入,则需要用到 TABLA_IRQ_MBHC_INSERTION 的内部中断

wcd9xxx_enable_irq(codec->control_data, TABLA_IRQ_MBHC_INSERTION);

3. tabla_mbhc_init_and_calibrate@wcd9310.c中设置中断回调函数tabla_mechanical_plug_detect_irq --> tabla_hs_gpio_handler

insert = (gpio_get_value_cansleep(tabla->mbhc_cfg.gpio) == tabla->mbhc_cfg.gpio_level_insert);

4. tabla_codec_detect_plug_type-->tabla_codec_get_plug_type@wcd9310.c 检测耳机类型

其中plug_type_ptr->v_no_mic =73,

plug_type_ptr->v_hs_max = 2850

重要结构static struct tabla_mbhc_config mbhc_cfg @kernel/sound/soc/msm/msm8960.c

mbhc_cfg.gpio_level_insert = 1 //表示GPIO38为高时为耳机插入

struct viskan_mbhc_data viskan_mbhc_data@kernel/arch/arm/mach-msm

.v_hs_max = 2850,  //

S(v_no_mic, 73);

5. 支持的耳机jack顺序, MIC|GND|HPHR|HPHL, 在tabla_codec_get_plug_type@wcd9310.c中一共要读取4次电压

1和2时,分别读取两次MIC和GND之间的电压

3时,HPHR和GND都切换,读取两次MIC和GND之间的电压

4时,只有MIC切换,读取两次MIC和GND之间的电压,同时会判断是否为PLUG_TYPE_GND_MIC_SWAP或PLUG_TYPE_INVALID,没搞清楚具体硬件原理

如果 所有4次得到的MIC和GND之间的电压,均

< v_no_mic 则是headphone (PLUG_TYPE_HEADPHONE)

> v_hs_max 则是High impedance plug type,高阻态的耳机类型,线性输出(PLUG_TYPE_HIGH_HPH)

> v_no_mic & < v_hs_max,则是headset (PLUG_TYPE_HEADSET)

如果前后两次得到的耳机类型不一样,则说明该耳机不支持(PLUG_TYPE_INVALID)

支持的headset, 主要比较的是第一个电压mb_v[i]

DCE #1, 003e, V 1638, scaled V 1638, GND 0, VDDIO 0, inval 0

DCE #2, 0071, V 1733, scaled V 1733, GND 0, VDDIO 0, inval 0

DCE #3, ffa8, V 1360, scaled V 2092, GND 1, VDDIO 1, inval 1

DCE #4, ffa8, V 1360, scaled V 2092, GND 0, VDDIO 1, inval 0

不支持的headset

DCE #1, fe30, V 661, scaled V 661, GND 0, VDDIO 0, inval 0

DCE #2, fe30, V 661, scaled V 661, GND 0, VDDIO 0, inval 0

DCE #3, fd2f, V 183, scaled V 281, GND 1, VDDIO 1, inval 1

DCE #4, fe17, V 615, scaled V 946, GND 0, VDDIO 1, inval 1

支持的headphone

DCE #1, fcd2, V 11, scaled V 11, GND 0, VDDIO 0, inval 0

DCE #2, fcd2, V 11, scaled V 11, GND 0, VDDIO 0, inval 0

DCE #3, fcd0, V 7, scaled V 10, GND 1, VDDIO 1, inval 0

DCE #4, fcd0, V 7, scaled V 10, GND 0, VDDIO 1, inval 0

6. 根据测量audio jack中GND,MIC 脚与地之间的电压,来比较得出不同的耳机类型。目前只支持MIC|GND|HPHR|HPHL(CTIA)不支持(OMTP)

7. 耳机插入如何上报event

tabla_codec_detect_plug_type

-->tabla_codec_report_plug    (只有PLUG_TYPE_GND_MIC_SWAP,PLUG_TYPE_HEADPHONE,PLUG_TYPE_HEADSET,PLUG_TYPE_HIGH_HPH才上报)

-->tabla_snd_soc_jack_report

-->snd_soc_jack_report_no_dapm

-->snd_jack_report@kernel/sound/core/jack.c

-->input_report_switch@kernel/include/linux/input.h

-->input_event(dev, EV_SW, code, !!value);

二十九,如何检测耳机的按键事件

1. tabla_hs_gpio_handler-->tabla_codec_detect_plug_type

只有耳机类型为headset 才能触发tabla_codec_start_hs_polling, 设置各按键的 电压门限值;(mbhc_state == MBHC_STATE_POTENTIAL)

2. 设置中断处理函数 @tabla_codec_probe

wcd9xxx_request_irq(codec->control_data, TABLA_IRQ_MBHC_POTENTIAL,tabla_dce_handler, "DC Estimation detect", tabla);

其中 tabla_hs_detect->tabla_mbhc_init_and_calibrate-->tabla_mbhc_cal会enable 中断TABLA_IRQ_MBHC_POTENTIAL

wcd9xxx_enable_irq(codec->control_data, TABLA_IRQ_MBHC_POTENTIAL);

3. 当headset插入后,如果有按键则会触发 TABLA_IRQ_MBHC_POTENTIAL 中断,从而call tabla_dce_handler-->tabla_determine_button

tabla_determine_button函数会通过读取的此时 micphone pin上的电压来决定是那个button key.

4. 而具体的按键是通过

@kernel/sound/soc/msm/msm8960.c中的函数snd_soc_jack_new(codec, "Button Jack",TABLA_JACK_BUTTON_MASK, &button_jack);注册一个jack

-->snd_jack_new

最终button_jack会接收按键信息

5. 根据测量micphone pin上的电压决定是那个按键,

而各按键的电压定义在 def_tabla_mbhc_cal@kernel/sound/soc/msm/msm8960.c

各个按键的结构定义为 struct tabla_mbhc_btn_detect_cfg@kernel/sound/soc/codecs/wcd9310.c

目前定义了4个按键 TABLA_MBHC_DEF_BUTTONS = 4,电压区间如下

btn_low[0] = -30;

btn_high[0] = 73;

btn_low[1] = 74;

btn_high[1] = 336;

btn_low[2] = 337;

btn_high[2] = 680;

btn_low[3] = 681;

btn_high[3] = 1257;

6. 在tabla_dce_handler函数中得到 具体是那个button按键被按下,然后检测中断TABLA_IRQ_MBHC_RELEASE (该中断一直是enable),当按键释放后触发tabla_release_handler-->tabla_snd_soc_jack_report 然后上报该event

-->snd_jack_report-->input_report_key@kernel/sound/core/jack.c

-->input_event(dev, EV_KEY, code, !!value);

linux耳机检测,Audio Jack 的耳机检测和按键检测相关推荐

  1. 一个学妹写的按键检测函数把我秀翻了!

    摘要:今年实验室来了三个学妹,其中一个学妹以前是物联网专业的,进了实验室老师二话没说:先把STM32单片机过一遍 上来第一个例程就是使用按键点亮一个LED灯,好家伙.点灯小师弟比较在行,毕竟32.FP ...

  2. 【STC8A8K64S4A12开发板】—4x4矩阵按键检测

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件电路设计 1.矩阵按键检测介绍 2.矩阵按键检测原理介绍 二.软件设计 1.矩阵按键扫描实验 – 指示灯闪烁 1.1.工 ...

  3. STM32-蓝桥杯嵌入式之三行按键检测(按键的长、短,单击、双击)

    STM32-蓝桥杯嵌入式之三行按键检测(按键的长.短,单击.双击) 目录 STM32-蓝桥杯嵌入式之三行按键检测(按键的长.短,单击.双击) 一.检测按键下降沿分析 二.检测按键上升沿分析 三.按键检 ...

  4. 耳机驱动调试(插拔检测与按键检测)

    耳机驱动调试(插拔检测与按键检测) 小白一枚,欢各位大佬指出错误 耳机类型判断 三段和四段.欧标和美标 现在许多设备的耳机接口都采用3.5mm的耳机接口,其中终端就是,终端可以兼容三段和四段耳机:三段 ...

  5. Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用

    首先看一下Openwrt系统中关于按键功能的使用和修改,以18.06版本为例 按键功能实现在脚本中, 比如18.06/package/base-files/files/etc/rc.button/re ...

  6. linux按键检测程序,Tiny4412 Linux驱动之按键(使用查询方式) | 技术部落

    前几天在TIny4412开发板上做了LED点灯的Linux驱动,其实挺简单,GPIO驱动,今天再看一下按键的驱动,毕竟按键用的还是比较广泛的,本文使用查询的方式获取按键值,后面会有文章使用中断的方式进 ...

  7. linux tcp 丢包命令_在Linux下实现测试TCP和UDP的丢包检测!

    在Linux下实现测试TCP和UDP的丢包检测! 疯狂の猿猴 • 2020 年 12 月 11 日 前言 本人平时基本上都是win,一下子转战到linux,有点不习惯! 因此做个记录,便于以后自己查阅 ...

  8. 打开网站太慢linux如何检查,seo优化中网站访问慢的检测方法

    在我们平时做网站seo优化的过程中,速度体验是特别重要的,尤其是网站关键词已经优化到首页的访问速度更尤为重要,每慢一秒就会流失一部分用户,导致排名下降.网站访问慢不外乎以下三个原因,解析来成都seo优 ...

  9. linux 按键检测 防抖,GPIO输入——按键检测

    当按下一个按键时,系统是如何检测到的呢? 我们通过LED灯的亮灭状态来间接完成按键检测.当按下按键时,LED灯亮,再次按下时,LED灯灭. 要完成这个实验,我们就会用到GPIO外设的基本输入功能. 查 ...

最新文章

  1. Java 设计模式_代理模式(2016-08-19)
  2. oracle in的用法_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法
  3. Lingo 0-1规划
  4. android7.1 shotcuts,Android N App Shotcuts 学习
  5. soundbar未来发展_智能电视时代 Soundbar未来发展之路
  6. 【MSLearn 学习模块】Hi ! ⼀起来学Python
  7. Mercurial hg web server的配置
  8. java基础—方法重载(overload)
  9. 启动metabase_引入开源BI软件Metabase——数据分析平台建设(一)
  10. 《剑指Offer》 最小的K个数
  11. 如何查看sql2000 sp4是否安装成功 及sp4补丁安装
  12. 基于Qt、FFMpeg的音视频播放器设计四(视频播放进度控制)
  13. 汽车以太网芯片IP的功能安全验证和优化
  14. Minecraft 1.19.2 Forge模组开发 05.矿石生成
  15. r7 5800h和r7 4800h 的差别大吗
  16. 头歌平台数据可视化-第五关时间空间数据的可视化——等高线图
  17. 虚拟校园网络组件开发笔记
  18. Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理
  19. 全国职业院校技能大赛(中职组)网络安全竞赛试题解析教程
  20. python 石头剪刀布小游戏

热门文章

  1. 搞定系统设计 00:开篇
  2. 为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复
  3. LiveVideoStack 2021招聘季
  4. 探秘音视频网络优化与全球化部署最佳实践
  5. CDN调试—Debug Headers
  6. Netflix如何节省92%视频编码成本?
  7. 腾讯推出百万现金漏洞悬赏计划!
  8. 音视频同步(播放)原理
  9. Spring Cloud 与 Dubbo 的完美融合之手「Spring Cloud Alibaba」
  10. leetcode 813. Largest Sum of Averages | 813. 最大平均值和的分组(暴力递归->傻缓存->DP)