华为P9的4minute volume up mvup key是哪个键

后使用快捷导航没有帐号?
平板/笔记本
云服务专区
使用P9半年时间,有两个问题还是要说下,都是“卡”
&渐入佳境&
来自:华为P9 EVA-AL10
1、系统开始变卡,反应变慢,尤其是多个软件之间切换的时候,非常明显,所以我不得不对mate9去期待了。
2、充电的时候,卡得更是夸张。不管是原装的充电器还是在车上冲,都一样。尝试过在电池管理里面去调整CPU的性能,都一样卡。而且我说的这些情况都是手机还没发热就出现了,不夸张的说,插上充电器5分钟左右,点亮屏幕后点击任何一个软件都会出现卡顿和延迟,吓尿了………
上述两种情况的发生都经过了自带的内存优化和清理,而且还经过了鲁大师的深层次碎片整理后仍然出现,尤其是充电状态的卡顿,那是100%的事件。
我是完全无语了,期待mate9 pro了。
width:100%">
&渐入佳境&
来自:浏览器
大嘴说,mate9pro会越用越快,一代胜n代。。期待吧。。。。。。
width:100%">
&新学乍练&
来自:华为P9 EVA-AL00
我的就没有这种情况,啥时候都差不多,但是肯定比新机速度要慢点,但是速度也没有慢太多
width:100%">
&花粉特种部队&
来自:浏览器
楼主,您好。建议您备好份,双清次。关机状态下,音量上键与电源键同时按数秒后松开,出现荣耀英文Logo,再一会儿,手机进入Recovery界面,进行操作,选择“恢复出厂设置”和“清除CACHE分区”这两项就是双清操作,然后重启手机即可。
width:100%">
&渐入佳境&
来自:华为P9 EVA-AL10
完全没有啊
width:100%">
&独步江湖&
来自:华为P9 EVA-DL00
我的没有啊
width:100%">
&渐入佳境&
来自:华为P9 Plus VIE-AL10
路过打酱油(?????)
width:100%">
把【秋】做成标本随拍:生活的‘远方’夕照上阳宫秋色白桦林再次邂逅坝上公主湖,依然惊艳!
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
没有最新动态
关注花粉俱乐部
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利Linux(53)
Android(54)
嵌入式(71)
【问题现象】
& 根据测试组同事反馈:在我们的设备上使用 JBL 品牌某款带有 3 个按键的有线耳机时,按下“音量+”键时设备会减小音量而不是增加音量,按下“音量-”键时设备无响应;在设备上使用 Samsung 品牌某款带有 3 个按键的有线耳机时,按下“音量-”键时设备会启动语音助手而不是减小音量。但按下 2 款耳机的中间键(播放/暂停键)均可以得到正确的响应。
【分析问题】
& 首先查看这 2 款耳机的音频接口,均为 3.5mm 耳机插头,其中三星耳机是白色环的 CTIA 标准插头,JBL耳机是黑色环的 OMTP 标准插头。这 2 种标准插头的区别在于第 3、4个金属环的接法是相反的。CTIA标准的第 3 个金属环为 GND,第 4 个金属环为 MIC;OMTP标准的第 3 个金属环则为 MIC,而第 4 个金属环为 GND。更具体的信息可以参考我之前写的这篇文章。
& 然后 adb 登录到设备上,使用 getevent 命令查看耳机按键按下时,设备的实时上报键值和响应。类似下图中这样,参数 /dev/input/event9 :
& 经过实时查看发现:JBL耳机的“音量+”键按下时,实际上报的键值为 KEY_VOLUMEDOWN,所以设备上相应地做出了减小音量的响应,而“音量-”键按下时,没有键值被上报。这很异常。三星耳机的“音量-”键按下时,实际上报的键值为 KEY_VOICECOMMAND,所以设备上相应地启动了语音助手程序。至此可以看到,不是系统上层做出了错误的响应,而是系统底层上报按键事件时就发生了错误,所以应该在底层驱动来解决这个问题。
& 可是为什么按下 JBL 耳机的“音量-”时没有键值被上报呢?让我们从按键事件的本质来分析:按键本身是个硬件,当它被按下时实际上是接通了耳机检测芯片到地线(GND)的一条通路。这条通路可以是直接连接到 GND,也可以是通过电阻连接到 GND。建立这样的连接通路会在耳机检测芯片上造成电平变化(上升沿或下降沿),而这实际上就是一个中断信号。耳机检测芯片接收到这个中断后,会对连接到按键的芯片引脚上的电平进行 ADC 采样,再将得到的数值与芯片内存储的各按键值(KEY_VOLUMEUP、KEY_VOLUMEDOWN、KEY_MEDIA、KEY_VOICECOMMAND)进行对比,如果有符合的键值,则向
SoC 芯片发送一个中断,同时发送该键值,如果没有找到匹配的键值,自然也就不会上报了。
& 我们可以通过 /proc/interrupts 节点来查看 SoC 芯片是否收到了中断。比如可以像下方这样查看 ts3a227e 发送的中断数,如果按下“音量-”按键后中断计数没有增加,那么就说明耳机检测芯片确实没有向 SoC 芯片发出中断:
& 耳机按键分压电路模型类似于下图:
& 之所以 2 款耳机的中间键被按下时都可以得到正确的响应,是因为大部分耳机的中间键都是直接接地的,按键被按下时对应的电平都是 0V。具体电路类似下图:
& 综上所述,各键值与各电压值是对应的,这个问题的本质实际上是底层驱动检测到了错误的电压继而上报了错误的键值或没有上报键值。我们无法改变耳机本身各按键所对应的电阻,但可以通过修改芯片的寄存器值来改变按键分压电路上总的偏置电压(也就是上图的MICBIAS),从而改变每个按键上的电压值。
【解决问题】
& 在我参与开发的设备上,耳机按键检测使用的是 ts3a227e 这款芯片,偏置电压则由 Codec 芯片 RT5677 提供。所以要修改耳机按键分压电路的偏置电压需要修改 RT5677 芯片的寄存器,要修改电平与键值的对应关系需要修改 ts3a227e 芯片的寄存器。查阅 2 款芯片的 datasheet,对电压配置作出如下修改:
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
index 6b356 100644
--- a/sound/soc/codecs/rt5677.c
+++ b/sound/soc/codecs/rt5677.c
@@ -99,7 +99,7 @@ static struct rt5677_init_reg init_list[] = {
{RT5677_PRIV_INDEX
, 0x0014},
{RT5677_PRIV_DATA
, 0x018a},
{RT5677_IN1
, 0x00c0},
- {RT5677_MICBIAS
, 0x4000},
+ {RT5677_MICBIAS
, 0x0000},
{RT5677_STO1_ADC_MIXER
, 0x5480},
//{RT5677_STO2_ADC_MIXER
, 0x9440},
{RT5677_DMIC_CTRL1
, 0x2505},
diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c
index e4f30f9..796b686 100644
--- a/sound/soc/codecs/ts3a227e.c
+++ b/sound/soc/codecs/ts3a227e.c
@@ -169,7 +169,7 @@ static const struct reg_default ts3a227e_reg_defaults[] = {
{ TS3A227E_REG_INTERRUPT_DISABLE, 0x08 },
{ TS3A227E_REG_SETTING_1, 0x27 },
{ TS3A227E_REG_SETTING_2, 0x00 },
- { TS3A227E_REG_SETTING_3, 0x3f },
+ { TS3A227E_REG_SETTING_3, 0x27 },
{ TS3A227E_REG_SWITCH_CONTROL_1, 0x00 },
{ TS3A227E_REG_SWITCH_CONTROL_2, 0x00 },
{ TS3A227E_REG_SWITCH_STATUS_1, 0x0c },
& 按照上方所示修改好电压后,三星耳机的按键就可以正常使用了,但 JBL 耳机的“音量-”按键依然会被识别为语音助手,在尝试了其它可配置的电压组合后依然如此。既然无法通过修改电压来完全解决问题,那么我们可以从软件上修改键值-上报事件映射的逻辑,使系统底层上报 KEY_VOICECOMMAND 键值的时候,系统上层依然可以作为 KEY_VOLUMEDOWN 来处理。为了看懂我接下来要对驱动代码进行的改动,这里先看一下驱动代码里对耳机按键状态数组的定义:
struct ts3a227e_keystatus {
volatile int key_
struct ts3a227e_keystatus key_status_map[] = {
{KEY_MEDIA, KEY_IS_UP},
{KEY_VOLUMEUP, KEY_IS_UP},
{KEY_VOICECOMMAND, KEY_IS_UP},
{KEY_VOLUMEDOWN, KEY_IS_UP},
& 为了重新映射键值消息与上报事件的关系,我对耳机检测芯片 ts3a227e 的驱动代码作如下具体改动:
diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c
index e4f30f9..796b686 100644
--- a/sound/soc/codecs/ts3a227e.c
+++ b/sound/soc/codecs/ts3a227e.c
@@ -286,6 +286,25 @@ static void long_press_func(struct work_struct *work)
/*volume up&down
long press */
// 添加 KEY_MEDIA 的长按功能代码,仅在这种情况下上报 KEY_VOICECOMMAND 事件以启动语音助手
for (i = 0; i & TS3A227E_NUM_KEYS;
/* add key_media long press
if (key_status_map[i].key_num == KEY_MEDIA &&
key_status_map[i].key_value == KEY_IS_DOWN) {
key_status_map[i].key_value = KEY_IS_WAIT_UP;
pr_err(&%s, i:%x , key_voicecommand down %d ,value:%d\n&, __func__, i,
KEY_VOICECOMMAND, key_status_map[i].key_value);
input_report_key(ts3a227e-&button_dev, KEY_VOICECOMMAND, 1);
input_sync(ts3a227e-&button_dev);
/* add key_voicecommand long press
// 添加 KEY_VOICECOMMAND 的长按功能代码,上报 KEY_VOLUMEDOWN 长按时的 KEY_NEXTSONG 事件
if (key_status_map[i].key_num == KEY_VOICECOMMAND&&
key_status_map[i + 1].key_value == KEY_IS_DOWN) {
key_status_map[i + 1].key_value = KEY_IS_WAIT_UP;
pr_err(&%s, i:%x , key_voicecommand down %d ,value:%d\n&, __func__, i,
KEY_NEXTSONG, key_status_map[i + 1].key_value);
input_report_key(ts3a227e-&button_dev, KEY_NEXTSONG, 1);
input_sync(ts3a227e-&button_dev);
if (key_status_map[i].key_num == KEY_VOLUMEUP &&
key_status_map[i].key_value == KEY_IS_DOWN) {
key_status_map[i].key_value = KEY_IS_WAIT_UP;
@@ -324,6 +343,7 @@ static void check_jack_status(struct ts3a227e *ts3a227e)
for (i = 0; i & TS3A227E_NUM_KEYS; i++) {
if (ts3a227e-&kp_int_reg & PRESS_MASK(i)) {
pr_err(&%s, kp %d down \n&, __func__, i);
if (key_status_map[i].key_num
!= KEY_VOLUMEUP
key_status_map[i].key_num != KEY_VOLUMEDOWN)
input_report_key(ts3a227e-&button_dev, ts3a227e_keycodes[i], 1);
@@ -331,29 +351,60 @@ static void check_jack_status(struct ts3a227e *ts3a227e)
key_status_map[i].key_value = KEY_IS_DOWN;
long_press_det =
if (key_status_map[i].key_num != KEY_VOICECOMMAND) {
key_status_map[i].key_value = KEY_IS_DOWN;
pr_err(&%s, key_voicecommand %d is detected, remap to key %d.\n&, __func__, key_status_map[i].key_num, key_status_map[i+1].key_num);
key_status_map[i+1].key_value = KEY_IS_DOWN;
// 在检测到 KEY_VOICECOMMAND 消息时,将其视为 KEY_VOLUMEDOWN 进行处理
long_press_det =
pr_err(&Qidi - keypress - key_status_map[%d].value = %d\n&, i, key_status_map[i].key_value);
if (ts3a227e-&kp_int_reg & RELEASE_MASK(i)) {
pr_err(&%s, kp %d up\n&, __func__, i);
/* just for volume up & down long press */
if (key_status_map[i].key_value == KEY_IS_DOWN) {
pr_err(&%s, kp %d short up \n&, __func__, i);
cancel_delayed_work_sync(&ts3a227e-&long_press_work);
input_report_key(ts3a227e-&button_dev,
ts3a227e_keycodes[i], 1);
if (i != 2) {
// 检测到非 KEY_VOICECOMMAND 消息时,按照正常流程进行处理
/* just for volume up & down long press */
if (key_status_map[i].key_value == KEY_IS_DOWN) {
pr_err(&%s, kp %d short up \n&, __func__, i);
cancel_delayed_work_sync(&ts3a227e-&long_press_work);
input_report_key(ts3a227e-&button_dev,
ts3a227e_keycodes[i], 1);
key_status_map[i].key_value = KEY_IS_UP;
} else if (key_status_map[i].key_value == KEY_IS_WAIT_UP) {
pr_err(&%s, kp %d long up
code:%d\n&, __func__, i, key_status_map[i].key_num);
if (key_status_map[i].key_num == KEY_VOLUMEUP)
input_report_key(ts3a227e-&button_dev, KEY_PREVIOUSSONG, 0);
else if (key_status_map[i].key_num == KEY_VOLUMEDOWN)
input_report_key(ts3a227e-&button_dev, KEY_NEXTSONG, 0);
else if (key_status_map[i].key_num == KEY_MEDIA)
input_report_key(ts3a227e-&button_dev, KEY_VOICECOMMAND, 0);
key_status_map[i].key_value = KEY_IS_UP;
} else if (key_status_map[i].key_value == KEY_IS_WAIT_UP) {
pr_err(&%s, kp %d long up
code:%d\n&, __func__, i, key_status_map[i].key_num);
if (key_status_map[i].key_num == KEY_VOLUMEUP)
input_report_key(ts3a227e-&button_dev, KEY_PREVIOUSSONG, 0);
else if (key_status_map[i].key_num == KEY_VOLUMEDOWN)
input_report_key(ts3a227e-&button_dev, KEY_NEXTSONG, 0);
key_status_map[i].key_value = KEY_IS_UP;
input_report_key(ts3a227e-&button_dev,
ts3a227e_keycodes[i], 0);
// 在检测到 KEY_VOICECOMMAND 消息时,将其视为 KEY_VOLUMEDOWN 进行处理
/* just for key_voicecommand long press */
if (key_status_map[i + 1].key_value == KEY_IS_DOWN) {
pr_err(&%s, kp %d short up \n&, __func__, i + 1);
cancel_delayed_work_sync(&ts3a227e-&long_press_work);
input_report_key(ts3a227e-&button_dev,
ts3a227e_keycodes[i + 1], 1);
key_status_map[i + 1].key_value = KEY_IS_UP;
} else if (key_status_map[i + 1].key_value == KEY_IS_WAIT_UP) {
pr_err(&%s, kp %d long up
code:%d\n&, __func__, i + 1, key_status_map[i + 1].key_num);
if (key_status_map[i + 1].key_num == KEY_VOLUMEDOWN)
input_report_key(ts3a227e-&button_dev, KEY_NEXTSONG, 0);
key_status_map[i + 1].key_value = KEY_IS_UP;
input_report_key(ts3a227e-&button_dev,
ts3a227e_keycodes[i + 1], 0);
input_report_key(ts3a227e-&button_dev,
ts3a227e_keycodes[i], 0);
}& 按照上文所述进行修改后,重新编译代码并烧写设备进行测试,发现耳机按键功能已经可以正常工作了。
& 其实这就是纯底层驱动的修改,不仅可以解决 Android 系统上这样的问题,纯 Linux 系统下出现了这样的问题也可以如此类比修改。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:193699次
积分:3276
积分:3276
排名:第10992名
原创:120篇
转载:11篇
评论:173条
(4)(4)(1)(6)(2)(3)(7)(5)(2)(11)(10)(7)(10)(15)(8)(8)(8)(13)(3)(3)(3)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'后使用快捷导航没有帐号?
其他登录方式
—— 新手入门 ——
—— 智友精华 ——
查看: 2140|回复: 5
在线时间101 小时最后登录阅读权限20UID8830217注册时间积分447精华0
, 积分 447, 距离下一级还需 253 积分
主题帖子 金币442 元 智豆136 点
本帖最后由 sofood 于
22:52 编辑
荣耀V8使用adb解锁之后,启动手机出现白色黄色英文界面后进入系统界面?怎样去除不出现这画面?
your device has been unlocked and can not be trusted
您的设备已被解锁,不能信任
to learn more,visit 要了解更多,访问:
(1)press power key to continue 按电源键继续
(2)press volume up key up to 3 seconds to enter erecovery to restore your device
& && &&&按音量键达3秒钟进入品牌来恢复您的设备
(3)your device will contiune to boot 5 seconds later if there is no operation
& && &&&5秒后如果没有操作您的设备将继续开机
附件: 你需要才可以下载或查看附件。没有帐号?
在线时间101 小时最后登录阅读权限20UID8830217注册时间积分447精华0
, 积分 447, 距离下一级还需 253 积分
主题帖子 金币442 元 智豆136 点
本帖最后由 sofood 于
22:55 编辑
手机可以正常进入系统,只是多了图片启动界面,重新锁上手机就没有。
还有就是华为官方没有V8官方固件下载
在线时间461 小时最后登录阅读权限100UID注册时间积分2066精华3
主题帖子 金币2728 元 智豆257 点
这个是正常的 解锁完都会
在线时间101 小时最后登录阅读权限20UID8830217注册时间积分447精华0
, 积分 447, 距离下一级还需 253 积分
主题帖子 金币442 元 智豆136 点
Vinceying 发表于
这个是正常的 解锁完都会
记得以前三星、摩托机子解锁就会出现黄色叹号启动界面,刷入一个小插件是可以消除禁止的。
希望有花粉友可以在华为手机上实现
在线时间267 小时最后登录阅读权限20UID6341061注册时间积分535精华0
, 积分 535, 距离下一级还需 165 积分
主题帖子 金币795 元 智豆16 点
只有解锁后第一次有这个界面吧,我的解锁后有但再重启手机就没有见过了
在线时间278 小时最后登录阅读权限20UID920178注册时间积分688精华0
, 积分 688, 距离下一级还需 12 积分
主题帖子 金币2167 元 智豆121 点
wsqzj210592 发表于
只有解锁后第一次有这个界面吧,我的解锁后有但再重启手机就没有见过了
没回锁前,每次重启都会有这个界面
好学生勋章
客户端申请 注册天数≥7并且 发帖数≥30并且 主题数≥3并且 在线时间≥30小时
给你300万勋章
客户端【我的任务】—完成【给你300万】任务
老司机勋章
客户端申请 主题数 ≥ 100或在线时间≥ 500小时或精华帖数 ≥ 10或注册天数≥ 1000

我要回帖

更多关于 key volumedown 72 的文章

 

随机推荐