亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android亮屏速度分析總結

2019-10-21 21:25:50
字體:
來源:轉載
供稿:網友

前面聊的

最近在調試項目的亮屏速度,我們希望在按下power鍵后到亮屏這個時間能達到500MS以內,在Rockchip 3399和3288上面的時間都不能達到要求,因此引發了一系列的調試之路。

計算按下power鍵到亮屏的時間

Android 喚醒時間統計

剛開始的時候,我只在android階段統計時間,也能看到時間的差異,但是不是最準確的,我統計的時間日志如下

01-18 09:13:40.992 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 743ms
01-18 09:13:45.304 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 757ms
01-18 09:13:49.559 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 725ms
01-18 09:18:27.461 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 741ms
01-18 09:18:32.766 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 743ms
01-18 09:18:35.861 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 745ms
01-18 09:18:38.345 683 772 D SurfaceControl: Excessive delay in setPowerMode(): 733ms

Kernel從Power到亮屏的時間統計

后來同事中的精英古總在他的代碼上加入了從按下Power鍵到亮屏的時間,直接通過printk打印,代碼如下

diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.cold mode 100644new mode 100755index 17c3b94..2b39662--- a/drivers/gpu/drm/panel/panel-simple.c+++ b/drivers/gpu/drm/panel/panel-simple.c@@ -504,6 +504,7 @@ static int panel_simple_enable(struct drm_panel *panel)    }    p->enabled = true;+    printk("%s exit/n", __func__);    return 0; }diff --git a/drivers/input/keyboard/rk_keys.c b/drivers/input/keyboard/rk_keys.cold mode 100644new mode 100755index fed5ced..537b599--- a/drivers/input/keyboard/rk_keys.c+++ b/drivers/input/keyboard/rk_keys.c@@ -134,6 +134,10 @@ static void keys_timer(unsigned long _data)        key_dbg(pdata, "%skey[%s]: report event[%d] state[%d]/n",            button->type == TYPE_ADC ? "adc" : "gpio",            button->desc, button->code, button->state);+        if(strcmp(button->desc, "power") == 0)+        printk("%skey[%s]: report event[%d] state[%d]/n",+            button->type == TYPE_ADC ? "adc" : "gpio",+            button->desc, button->code, button->state);        input_event(input, EV_KEY, button->code, button->state);        input_sync(input);    }

統計每個驅動的resume函數調用時間

上面的時間對我們調試非常有用,然后就需要細分到每個驅動的resume函數執行的時間,用的方法是我之前寫過的,大概統計了下TP,LCD,sensor的resume時間,發現TP和LCD占用的時間非常多,然后跟同事一起看了下,同事把TP resume里面的代碼用工作隊列實現后速度明顯有了提升。

然后有很長一段時間不知道干嘛,向打印其他每個驅動的resume時間,一直沒找到方法,后面看到一個代碼,非常有用。

kernel/drivers/base/power/main.c

static void dpm_show_time(ktime_t starttime, pm_message_t state, char *info)                            {          ktime_t calltime;  u64 usecs64;  int usecs;  calltime = ktime_get();  usecs64 = ktime_to_ns(ktime_sub(calltime, starttime));  do_div(usecs64, NSEC_PER_USEC);  usecs = usecs64;  if (usecs == 0)    usecs = 1;   pr_info("PM: %s%s%s of devices complete after %ld.%03ld msecs/n",    info ?: "", info ? " " : "", pm_verb(state.event),    usecs / USEC_PER_MSEC, usecs % USEC_PER_MSEC);}

這個函數用來打印resume的函數消耗的時間,但是如何去觸發打印這個函數呢?

  • 一定保證設備進入深度睡眠,串口也進入深度睡眠,沒有任何打印后。
  • 執行以下命令
echo N > /sys/module/printk/parameters/console_suspend//使控制臺在suspend最后才關閉,這樣可以打印出休眠過程完整信息echo 1 > /sys/power/pm_print_times//使能調試變量

打印的LOG類似下面的

[ 37.031413] bcmsdh_sdmmc_resume Exit
[ 37.082174] PM: resume of devices complete after 78.589 msecs
[ 37.085277] [BT_RFKILL]: ** disable irq
[ 37.087645] Restarting tasks ... 

修改Lcd配置減小resume時間

古總在調試過程中展現了非常厲害的功底,第一步就是修改了LCD的參數,讓亮屏時間加快。修改如下

--- a/arch/arm/boot/dts/rk3288-pad.dts+++ b/arch/arm/boot/dts/rk3288-pad.dts@@ -169,10 +169,10 @@        dsi,lanes = <4>;        prepare-delay-ms = <20>;-        init-delay-ms = <20>;-        enable-delay-ms = <100>;-        disable-delay-ms = <20>;-        unprepare-delay-ms = <20>;+        //init-delay-ms = <20>;+        enable-delay-ms = <1>;+        disable-delay-ms = <1>;+        unprepare-delay-ms = <1>;        panel-init-sequence = [            15 32 02 8F A5            15 01 02 83 00

修改DRM 超時時間減小喚醒時間

這是最關鍵的,DRM框架非常復雜,RK也是從開源的DRM移植過來使用,在DRM部分有個時間導致問題,最終跟RK拿到最新的patch讓喚醒時間直接加速500MS.

我們在日志下發現問題,并給詢問了RK,最終發現這部分代碼沒有更新到最新的部分。

hi rk:
為什么亮屏的時候有時候會打印這句VOP等待超時?請問下這是什么意思。
[ 1211.293492] rockchip-vop ff930000.vop: wait win close timeout
[ 1211.293514] rockchip-vop ff930000.vop: [drm:vop_crtc_enable] Update mode to 1200*1920, close all win
有時候卻不會打印。

[ 1216.423283] rockchip-vop ff930000.vop: [drm:vop_crtc_enable] Update mode to 12001920, close all win [ 1223.899741] rockchip-vop ff930000.vop: [drm:vop_crtc_enable] Update mode to 12001920, close all win
[ 1234.386252] rockchip-vop ff930000.vop: [drm:vop_crtc_enable] Update mode to 1200*1920, close all win

代碼如下

--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c@@ -139,6 +139,9 @@ #define to_vop_win(x) container_of(x, struct vop_win, base) #define to_vop_plane_state(x) container_of(x, struct vop_plane_state, base)+/*add by VENDOR_PATCH for seep up the drm vop driver at 2018/1/18 for RK Defect #191554, VENDOR_PATCH PAD100-193*/+#define VENDOR_PATCH+ struct vop_zpos {    int win_id;    int zpos;@@ -868,9 +871,15 @@ static void vop_disable_all_planes(struct vop *vop)    vop_disable_allwin(vop);    vop_cfg_done(vop);+#ifdef VENDOR_PATCH    ret = readx_poll_timeout_atomic(vop_is_allwin_disabled,                    vop, active, active,+                    0, 100 * 1000);+#else+    ret = readx_poll_timeout_atomic(vop_is_allwin_disabled,+                vop, active, active,                    0, 500 * 1000);+#endif    if (ret)        dev_err(vop->dev, "wait win close timeout/n"); }@@ -2215,20 +2224,36 @@ static size_t vop_crtc_bandwidth(struct drm_crtc *crtc,    u16 htotal = adjusted_mode->crtc_htotal;    u16 vdisplay = adjusted_mode->crtc_vdisplay;    int clock = adjusted_mode->crtc_clock;+#ifndef VENDOR_PATCH    struct vop *vop = to_vop(crtc);    const struct vop_data *vop_data = vop->data;+#endif    struct vop_plane_state *vop_plane_state;    struct drm_plane_state *pstate;    struct vop_bandwidth *pbandwidth;    struct drm_plane *plane;    u64 bandwidth;    int i, cnt = 0;+#ifdef VENDOR_PATCH+    int plane_num = 0;+#endif    if (!htotal || !vdisplay)        return 0;+#ifndef VENDOR_PATCH    pbandwidth = kmalloc_array(vop_data->win_size, sizeof(*pbandwidth),                  GFP_KERNEL);+#else+    for_each_plane_in_state(state, plane, pstate, i) {+        if (pstate->crtc != crtc || !pstate->fb)+            continue;+        plane_num++;+    }+    pbandwidth = kmalloc_array(plane_num, sizeof(*pbandwidth),+                 GFP_KERNEL);+#endif+    if (!pbandwidth)        return -ENOMEM;@@ -2421,7 +2446,10 @@ static void vop_crtc_enable(struct drm_crtc *crtc)    rockchip_set_system_status(sys_status);    mutex_lock(&vop->vop_lock);    vop_initial(crtc);-+#ifdef VENDOR_PATCH+    vop_disable_allwin(vop);+    VOP_CTRL_SET(vop, standby, 0);+#endif    VOP_CTRL_SET(vop, dclk_pol, 1);    val = (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ?          0 : BIT(HSYNC_POSITIVE);@@ -2549,8 +2577,9 @@ static void vop_crtc_enable(struct drm_crtc *crtc)    /*     * enable vop, all the register would take effect when vop exit standby     */+#ifndef VENDOR_PATCH    VOP_CTRL_SET(vop, standby, 0);-+#endif    enable_irq(vop->irq);    drm_crtc_vblank_on(crtc);    mutex_unlock(&vop->vop_lock);

休眠喚醒流程圖

從網上拷貝了個休眠喚醒的流程圖,如果以后有問題需要分析的話,可以跟進這個流程去排查。

Android,亮屏

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲永久精品大片ww免费漫画| 国产91精品久久久久| 亚洲精品美女视频| 亚洲一区二区久久久久久久| 日韩免费在线视频| 亚洲综合自拍一区| 人人爽久久涩噜噜噜网站| 国产成人aa精品一区在线播放| 清纯唯美亚洲激情| 亚洲欧洲午夜一线一品| 91社区国产高清| 97精品视频在线| 久久夜精品香蕉| 国产91精品久久久久| 日韩中文字幕在线视频播放| 精品久久久久久中文字幕一区奶水| 日韩在线视频免费观看高清中文| 久久久久久久国产| 97超碰国产精品女人人人爽| 亚洲精品日韩欧美| 国产视频在线观看一区二区| 国产精品电影久久久久电影网| 欧美床上激情在线观看| 亚洲免费一在线| 欧美另类在线播放| 57pao成人国产永久免费| 国产欧洲精品视频| 正在播放欧美视频| 亚洲精品日韩在线| 91精品视频播放| 国产精品久久久久久久久久尿| 成人精品在线视频| 亚洲精品久久久久久久久久久久| 美日韩精品免费观看视频| 亚洲精品免费一区二区三区| 久久综合伊人77777蜜臀| 欧美成人手机在线| 91色在线视频| 欧美在线一级视频| 国产69精品久久久久9999| 亚洲一区久久久| 欧美电影在线观看| 国产精品高精视频免费| 亚洲网在线观看| 国产亚洲美女精品久久久| 国产欧美最新羞羞视频在线观看| 亚洲美女免费精品视频在线观看| 日韩精品极品在线观看| 亚洲综合小说区| 精品日韩美女的视频高清| 亚洲精品久久久久国产| 欧美性极品xxxx做受| 91国内揄拍国内精品对白| 日韩中文字幕在线免费观看| 国产日韩中文字幕在线| 欧美三级xxx| 欧美黑人性猛交| 尤物九九久久国产精品的特点| 久久精品青青大伊人av| 欧美特级www| 欧美日韩精品在线观看| 亚洲欧美日韩国产中文| 亚洲综合一区二区不卡| 黑人巨大精品欧美一区二区| 狠狠躁夜夜躁人人躁婷婷91| 午夜精品一区二区三区在线视| 国产一区二区av| 精品小视频在线| 色综合伊人色综合网| 精品久久久久久久久中文字幕| 日本精品一区二区三区在线播放视频| 欧美激情精品久久久久| 国产精品天天狠天天看| 国产精品一区二区女厕厕| 国产一区二区三区日韩欧美| 久久久久久国产精品久久| 欧美成人精品激情在线观看| 日韩av第一页| 国产91精品久久久久久| 国产亚洲视频在线观看| 97视频在线观看亚洲| 91久久久久久久久| 国产精品久在线观看| 伦伦影院午夜日韩欧美限制| 法国裸体一区二区| 亚洲日本中文字幕免费在线不卡| 亚洲黄页视频免费观看| 国产精品第七影院| 91大神在线播放精品| 亚洲国产欧美一区二区三区同亚洲| 国产精品美女免费视频| 国产一区二区日韩| 久久久欧美一区二区| 久久久亚洲影院| 韩国一区二区电影| 欧美疯狂xxxx大交乱88av| 久久精品亚洲一区| 国产精品va在线| 人妖精品videosex性欧美| 一区二区三区回区在观看免费视频| 色www亚洲国产张柏芝| 亚洲精品456在线播放狼人| 中日韩美女免费视频网站在线观看| 98精品在线视频| 欧美精品国产精品日韩精品| 久久视频在线免费观看| 久久夜色精品国产亚洲aⅴ| 亚洲国产天堂久久综合| 欧美成人小视频| 久久免费在线观看| 国产欧美精品xxxx另类| 日韩免费观看在线观看| 中文字幕一区日韩电影| 亚洲剧情一区二区| xxx一区二区| 日韩av中文字幕在线| 欧美韩国理论所午夜片917电影| 中文字幕免费精品一区| 亚洲精品综合精品自拍| 日韩中文字幕精品视频| 国产美女主播一区| 亚州成人av在线| 91视频免费网站| 国产精品视频久久久久| 国产在线拍揄自揄视频不卡99| 91精品在线国产| 国产成人欧美在线观看| 亚洲第一视频网| 亚洲欧洲在线播放| 欧美性高跟鞋xxxxhd| 91天堂在线视频| 亚洲精品电影网在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲性线免费观看视频成熟| 欧美激情精品久久久久久变态| 亚洲欧美激情在线视频| 韩国福利视频一区| 欧美人与性动交a欧美精品| 欧美成人h版在线观看| 亚洲大胆人体av| 精品女同一区二区三区在线播放| 成人h视频在线观看播放| 国产精品视频网| 欧美亚洲午夜视频在线观看| 欧美午夜视频在线观看| 亚洲人成网站999久久久综合| 日韩av影片在线观看| 欧美精品videosex性欧美| 日韩中文字幕在线| 日韩综合视频在线观看| 久久久久久久久久婷婷| 亚洲福利小视频| 国产成人精品免高潮在线观看| 欧日韩不卡在线视频| 精品福利免费观看| 亚洲人成电影在线播放| 中文字幕日韩精品在线观看| 日本高清久久天堂| 亚洲深夜福利在线| 亚洲aa中文字幕| 欧美国产亚洲视频| 久久久久久久久电影| 国产成人一区二区三区小说| 亚洲激情免费观看|