1. 程式人生 > >全志a20 新增觸控喚醒螢幕功能

全志a20 新增觸控喚醒螢幕功能

      一、螢幕喚醒流程

              這部分一開始我也不是很懂,然後百度一下,發現這哥們寫得不錯,所以這部分內容參考一下這個網址

     http://blog.csdn.net/shadow_dance/article/details/8070252

    二、觸控喚醒螢幕思路

    1.讓系統在休眠的時候,不要sleep觸控式螢幕

    2.在觸控式螢幕驅動上屏觸控資料時,先判斷是否處於休眠狀態,是的話就上報一個power按鍵事件,這樣就可以喚醒螢幕了

    三、修改驅動

      首先修改,讓系統在休眠的時候,不要sleep觸控式螢幕

先看一下kernel/kernel/power/earlysuspend.c  的以下函式

休眠時會呼叫這個

static void early_suspend(struct work_struct *work)

{

......

if (debug_mask & DEBUG_SUSPEND)

pr_info("early_suspend: call handlers\n");

                //這裡是遍歷所有需要休眠的裝置

list_for_each_entry(pos, &early_suspend_handlers, link) {
if (pos->suspend != NULL) {
if (debug_mask & DEBUG_VERBOSE){

pr_info("early_suspend: calling %pf\n", pos->suspend);
starttime = ktime_get();
}pos->suspend(pos); //執行休眠動作,最終會呼叫到這個函式

......

}

        喚醒會呼叫

       static void late_resume(struct work_struct *work)
      {
             ......
             if (debug_mask & DEBUG_SUSPEND)
                    pr_info("late_resume: call handlers\n");
                    pm_wd_enable();
                    list_for_each_entry_reverse(pos, &early_suspend_handlers, link) {
                             if (pos->resume != NULL) {
                                    if (debug_mask & DEBUG_VERBOSE){
                                              pr_info("late_resume: calling %pf\n", pos->resume);
                                               starttime = ktime_get();
                                    }
                                   pos->resume(pos);     //

執行喚醒動作最終會呼叫到這個函式

           ......

           }

  這時候我們就相應的找出觸控驅動裡的pos->suspend(pos)和pos->resume(pos) 指向的函式即可,找下驅動很容易就發現了 以下程式碼

(說明下,我用的 是gt9xx.c的驅動)

static s8 gtp_request_input_dev(struct goodix_ts_data *ts)

{

......

ts->early_suspend.suspend = goodix_ts_early_suspend; //休眠時呼叫這個函式

        ts->early_suspend.resume = goodix_ts_late_resume; //喚醒時呼叫這個函式
        register_early_suspend(&ts->early_suspend); //呼叫了這個註冊,就會在剛才那裡遍歷到這個裝置

......

}

所以只要遮蔽掉register_early_suspend(&ts->early_suspend)這個函式,就可以讓觸控式螢幕在休眠時也能工作,上報觸控資訊

修改為遮蔽,編譯,燒寫,果然是和預想的結果一樣,但是,這裡不能這樣修改,為什麼呢,因為我們還要靠這兩個goodix_t s_early_suspend和goodix_ts_late_resume 來獲取系統是否休眠的狀態,當然也還有別的方法可以獲取(比如讀取/sys/powe r/state 這個節點的狀態,又或者讀取屏幕亮度值)但是我覺得這種方法是最簡單的,所以我選擇不遮蔽,而是修改goodix_t s_early_suspend和goodix_ts_late_resume這兩個函式,讓兩個函式什麼都不做,直接設定一個休眠的標誌sleepFlag;,當然sleepFlag這個是自己定義的一個變數。

接下來就修改驅動上報的函式,其實也就是 判斷是否處於休眠狀態,是的話就上報一個power按鍵事件

static void goodix_ts_work_func(struct work_struct *work)

{

......

//這段程式碼新增在讀取完資料之後,上報觸控資訊之前,如果在上報觸控資訊之後,會有一些誤觸的可能,

if(sleepFlag == 0)//wake up the system

        {
            sleepFlag = 1;

//這裡上報一個power按鍵事件

            input_report_key(ts->input_dev, 116, 1);
            input_sync(ts->input_dev);
            input_report_key(ts->input_dev, 116, 0);
            input_sync(ts->input_dev);

return;

        }

......

}

這裡面還有一些初始按鍵事件的細節,可以參考其它類似程式碼,到此,修改成功!