我们在安卓点mipi屏的时候经常遇到mipi屏休眠后点不亮的情况,一般的方法就是休眠起来的时候断下vcc_lcd,然后就可以了,但是有一种情况原理图做死了,vcc无法控制,这种方法点不亮mipi真没好的办法了,只能用一种曲线救国的方法----不休眠而用关背光替代休眠,从应用层休眠的地方退出。
1.通过power键控制息屏亮屏
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
找到处理power键地方
case KeyEvent.KEYCODE_POWER:
跟踪按键抬起的地方
interceptPowerKeyUp(event, interactive, canceled);
private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) {
final boolean handled = canceled || mPowerKeyHandled;
mScreenshotChordPowerKeyTriggered = false;
cancelPendingScreenshotChordAction();
cancelPendingPowerKeyAction();
if (!handled) {
// Figure out how to handle the key now that it has been released.
mPowerKeyPressCounter += 1;
final int maxCount = getMaxMultiPressPowerCount();
final long eventTime = event.getDownTime();
if (mPowerKeyPressCounter < maxCount) {
// This could be a multi-press. Wait a little bit longer to confirm.
// Continue holding the wake lock.
Message msg = mHandler.obtainMessage(MSG_POWER_DELAYED_PRESS,
interactive ? 1 : 0, mPowerKeyPressCounter, eventTime);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg, ViewConfiguration.getDoubleTapTimeout());
return;
}
// No other actions. Handle it immediately.
powerPress(eventTime, interactive, mPowerKeyPressCounter);//在这里处理按键的功能
}
// Done. Reset our state.
if(close_lcd_flg==1)return;
finishPowerKeyPress();
}
private void powerPress(long eventTime, boolean interactive, int count) {
if (mScreenOnEarly && !mScreenOnFully) {
Slog.i(TAG, "Suppressed redundant power key press while "
+ "already in the process of turning the screen on.");
return;
}
if (count == 2) {
powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);
} else if (count == 3) {
powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);
} else if (interactive && !mBeganFromNonInteractive) {
Log.i("fan","fan going to sleep");
if(ReadFromFile("/sys/class/backlight/backlight/bl_power").equals("1"))
{
Log.i("fan","read brightness ="+SystemProperties.getInt("persist.sys.brightness",0));
String cmd = "echo " +SystemProperties.getInt("persist.sys.brightness",0)+ " > /sys/class/backlight/backlight/brightness";
exe_cmd(cmd);
delay(200);
exe_cmd("echo 0 > /sys/class/backlight/backlight/bl_power");
Log.i("fan","open backlight");
}
else{
exe_cmd("echo 1 > /sys/class/backlight/backlight/bl_power");
Log.i("fan","close backlight");
}
}
2.休眠后要通过触摸能亮屏
base/core/java/com/android/internal/policy/PhoneWindow.java
@@ -1819,6 +1855,12 @@
switch (actionMasked1) {
case MotionEvent.ACTION_UP: {
+
+ if(ReadFromFile("/sys/class/backlight/backlight/bl_power").equals("1"))
+ {
+ exe_cmd("echo 0 > /sys/class/backlight/backlight/bl_power");
+ Log.i("fan","touch open backlight");
+ }
final float x = event.getRawX();
final float y =event.getRawY();
3.通过定时设置要能够休眠
core/java/com/android/server/power/PowerManagerService.java
private boolean goToSleepNoUpdateLocked(long eventTime, int reason, int flags, int uid) {
- if (DEBUG_SPEW) {
+ Slog.d("fan","fan goToSleepNoUpdateLocked close lcd");
+ //Log.d("fan",Log.getStackTraceString(new Throwable()));
+ exe_cmd("echo 1 > /sys/class/backlight/backlight/bl_power");
+ if(true)return false;
4.这样做基本就可以实现像休眠一样的息屏,亮屏效果了