1 关键字

连续按;电源键

2 问题描述

设备型号:XXXXX

系统版本:OpenHarmony 3.2 Release

代码版本:XXXXXX

问题现象:在熄屏状态下,连续快速按遥控器上的电源键,不论按了多少次,最终设备屏幕都会被点亮。

3 问题原因

3.1 正常机制

在熄屏状态下,连续快速点击遥控上的电源键,如若点击次数是奇数,如1次,3次,5次...设备屏幕被正常点亮;如若点击次数是偶数,如2次,4次,6次...设备屏

幕应该还是熄屏,不应该被点亮。

3.2 异常机制

在熄屏状态下,连续快速点击遥控上的电源键,不论点击按键多少次,最后设备屏幕都是被点亮的状态。

4 解决方案

通过HDMI外接时,使用不带屏保机制的显示屏。

5 定位过程

5.1 先根据现象,不管按键多少次,最后都是亮屏现象,那初步判断是否在连续快速按键过程中:1、事件只响应了一次? 2、还是在这个过程中, 是熄屏、亮屏

的状态流程不对?根据这2个初步怀疑,抓取一份连续按键4次的日志;

 

5.2 从上面可以看出key事件进行了4次响应,4次按键按下,4次按键抬起;跟着代码流程查看亮屏和熄屏的接口;

void PowerMgrService::HandlePowerKeyUp()
{
    ...........
    ...........
    if (this->IsScreenOn()) {
        this->SuspendDevice(now, SuspendDeviceType::SUSPEND_DEVICE_REASON_POWER_BUTTON, false);
    } else {
        this->WakeupDevice(now, WakeupDeviceType::WAKEUP_DEVICE_POWER_BUTTON, REASON_POWER_KEY);
    }
}

熄屏SuspendDevice接口继续调用SuspendDeviceInner做进一步处理 ;

唤醒亮屏WakeupDevice继续调用WakeupDeviceInner 做进一步处理 ;

5.3 在继续分析上面的2个接口,查看当前的状态是否正确,通过代码和日志分析,流程与中间状态没有问题,同时这2个接口也主要是做一个状态的赋值,没有其他的多余操作;

上面4次按键操作:

2次亮屏:

 

2次熄屏:

 

 

5.4 而且可以看出,响应的时间上,也是正确的;

 

 

5.5 那么通过现有的分析,基本可以排除直接由于电源按键操作的问题了,继续分析;

5.6 将硬件驱动接口的信息打印,看其接收到的状态信息是否与按键事件一致;

 

 

5.7 发现驱动接口与HDI层的状态不一致,那么至此可初步知道该问题是由于设备状态不一致导致的,那么这个状态还有什么其他操作或者流程改变了熄屏和亮屏

的状态吗?继续查看日志;

 

 

5.8 可以看出,除了key事件处理,还触发了plug in事件 ;然后与产品显示驱动对接,发现其在hdmirx触发事件其流程会调用了以下接口,打开了hdmi;

 

5.9 由于我们是没有进行操作hdmi的,只是通过hdmi接口连接电脑显示屏,那么就初步可分析指导,当前电脑显示屏是具有hdmirx功能的;然后接入TV屏和电视屏进行操作,现象正常;

5.10 TV屏或者电视屏才是我们当前产品的实际场景,电脑显示屏的屏保及显示机制导致自动调用了HDMI接口,才出现上面的问题。最终分析得出是由于我们的显

示环境问题。

6 知识分享

电源模块与按键事件、display、state_machine之间是有比较复杂关系的;可通过电源唤醒或者熄屏一个点的流程,了解当前设计框架上的一个面。

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐