日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux耳机检测,Audio Jack 的耳机检测和按键检测

發布時間:2024/2/28 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux耳机检测,Audio Jack 的耳机检测和按键检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于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 的耳机检测和按键检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久精品区 | 欧美日韩中字 | 久久国产精品免费 | 一级黄色片毛片 | 国产高清一区 | 亚洲人成电影在线 | 激情综合在线 | 国产成年妇视频 | 一区二区免费在线播放 | 国产毛片a级| 性欧美17一18内谢 | 中文字幕视频免费 | 91福利影院 | 老汉av网站 | 亚洲成人高清 | 色婷婷av一区二区三区之红樱桃 | www.久久久久久久久 | 欧美高清一区二区 | 黄色特级视频 | 国产精品久久国产愉拍 | 国内视频一区二区 | 欧美成人精品欧美一级 | 中文字幕亚洲欧美日韩 | 成人精品三级av在线看 | 欧美日韩高清在线观看 | 超碰997| 污视频免费在线观看网站 | 日韩在线不卡 | 日日夜夜免费精品 | 美女黄色av| 亚洲精品视频导航 | 熟女视频一区二区三区 | 超碰人人99 | 色图社区 | 天天干夜夜怕 | 91精品91久久久中77777老牛 | 日韩夜色 | 中文字幕av专区 | 国产福利视频导航 | 欧洲一区二区视频 | 成人免费黄色大片 | 韩日视频在线 | 国产色视频一区二区三区qq号 | 五月婷婷综合在线 | 中国美女洗澡免费看网站 | 久久久国产打桩机 | 成人小视频免费看 | 欧美视频xxx | 外国黄色网 | 麻豆国产在线视频 | 久久女同互慰一区二区三区 | 免费黄色小视频网站 | 91福利视频网 | 欧美日韩在线综合 | caopor超碰 | 成人av图片| 色四月| 免费观看视频一区 | 日本少妇电影 | 久久av在线 | 麻豆传媒mv| 99re国产精品 | 在线岛国 | 国产免费无码一区二区 | 黄色小视频网 | 九色国产视频 | 国产剧情在线观看 | 四虎影库永久在线 | 欧美日韩视频在线 | 97久久综合 | 国产成人无码精品久久久久久 | 国产精品v欧美精品v日韩 | 波多野结衣激情视频 | 一区二区免费视频 | 特级一级黄色片 | 日韩黄色网络 | 男人天堂视频网站 | 中文区中文字幕免费看 | 亚洲欧美一区二区三区久久 | 午夜高清视频 | 国产熟女一区二区丰满 | 国产老熟女一区二区三区 | 91免费福利视频 | 宿舍女女闺蜜调教羞辱 | 国产精品国产三级国产专区51区 | 欧美视频一区二区三区四区 | 欧美a级黄色片 | 久热一区| 手机看片福利在线 | 最近日韩中文字幕中文 | 欧美日韩一区二区在线视频 | 国产成人无码一区二区在线播放 | 色爱区综合 | 丰满少妇一级 | 国产激情福利 | 精品人妻一区二区三区日产乱码卜 | 看av网站 | 精品无码av一区二区三区 | 亚洲色图 美腿丝袜 |