1. 程式人生 > >高通平臺點亮LCD個人總結

高通平臺點亮LCD個人總結

      高通平臺LCD模組大致分為兩部分:KERNEL和LK。在進行點屏之前,應該認真檢視LCD原理圖,弄清楚LCD亮屏需要滿足的條件和上電時序,同時可以跟LCD IC原廠拿到初始化程式碼。

      首先點亮KERNEL。

      在點亮KERNEL之前,先進入bootable/bootloader/lk/target/msm****/rules.mk檔案,將DEFINES += DISPLAY_SPLASH_SCREEN=1置0,disable掉LK中的顯示。然後正式進入核心開始點亮LCD。對於一個新的專案,建議先進入msm****-mtp.dtsi或者msm****-mdss.dtsi檔案,找到它include的相應的屏配置檔案,因為這個是平臺預設使用的LCD,我們可以借鑑它來實現點亮屏。我這裡專案中預設使用的是#include "dsi-panel-sharp-dualmipi0-wqxga-video.dtsi",而我需要點亮的是信利CMD屏,於是複製dsi-panel-sharp-dualmipi0-wqxga-video.dtsi並重命名為dsi-panel-truly-dualmipi0-wqxga-cmd.dtsi,因為是雙DSI,所以需要重新命名兩個dtsi檔案。進入重新命名後的dsi-panel-truly-dualmipi0-wqxga-cmd.dtsi檔案,將sharp修改為truly,將video修改為cmd,將“qcom,mdss-dsi-panel-width” 和“qcom,mdss-dsi-panel-height” 修改成相應的解析度(其他比如hfp屬性可以先不修改),將屏初始化程式碼寫入“qcom,mdss-dsi-on-command”,同時大致瀏覽一下其他屬性值,比如broadcast,如果雙dsi使用的只有一個IC,那麼這個屬性必須去掉,否則會導致系統進入Android動畫之後,機器掛掉。具體去掉方法是在dualmipi0中刪除“qcom,cmd-sync-wait-broadcast”,在dualmipi1中刪除“qcom,cmd-sync-wait-broadcast”和“qcom,cmd-sync-wait-trigger”。當然這個還是不會影響LCD的顯示的。接著進入msm****-mtp.dtsi檔案,將屏的dtsi檔案include進來,比如#include "dsi-panel-truly-dualmipi0-wqxga-cmd.dtsi"和#include "dsi-panel-truly-dualmipi1-wqxga-cmd.dtsi",然後將DSI設定成主要介面,即qcom,mdss-pref-prim-intf = "dsi",再設定PANEL NODE,即qcom,dsi-pref-prim-pan = <&dsi_dual_truly_cmd_0>和qcom,dsi-pref-prim-pan = <&dsi_dual_truly_cmd_1>,注意的是這個值需要和屏dtsi檔案裡面的值保持一致。然後再新增&dsi_dual_truly_cmd_0相關程式碼,注意由於LK中disable掉顯示的,這裡面的qcom,cont-splash-enabled也應該disabled掉。接下來就需要根據原理圖來設定LCD和背光的各路電壓了,一般系統預設是有新增Reset的gpio口的,找到qcom,platform-reset-gpio的位置,仿照新增其他gpio口,比如lcd_reg_en供電1.8v,tps的正負5V,背光的使能口等等。這個時候注意各GPIO口的分類,PMU端和CPU端的GPIO口配置是不一樣的。到此dtsi檔案就處理完畢了,接下來進入MDSS資料夾下,開啟mdss_dsi.c檔案,還是仿照Reset口,獲取其他gpio相應的屬性節點,同時在mdss_dsi.h中宣告。然後進入mdss_dsi_panel.c檔案,在mdss_dsi_request_gpios中模仿Reset口申請其餘gpio口,接下來就是重中之中的復位函式mdss_dsi_panel_reset了,這裡面一定要根據上電時序來設定各路gpio口的高低電平的有效值以及下電時關閉各路電壓。

   到此理論上來說,KERNEL應該可以點亮了。接下來介紹下LK的點亮,記得先將將DEFINES += DISPLAY_SPLASH_SCREEN=1,再將qcom,cont-splash-enabled。

  在bootable\bootloader\lk\dev\gcdb\display\include目錄下,複製panel_sharp_wqxga_dualdsi_video.h並重命名panel_truly_wqxga_dualdsi_cmd.h,進入檔案將sharp改為truly,video改為cmd,這裡需要注意幾點,一是結構體panel_config中的panel_node_id,需要跟dtsi中的名稱保持一致;二是panel_config中的panel_type,video是MIPI_VIDEO_PANEL(0),cmd是MIPI_CMD_PANEL(1);三是初始化程式碼,小於或等於2個引數的,資料佔一行,引數寫在前面,datatype寫在後面,dtsi裡面datatype是29的且只有2個數值的,在LK裡面如果只寫成一行,則datatype寫成23,寫成二行就用29,並補0xff;大於2個引數的,第一行第一個數和第二個數之和是數值的個數(第2個一般是0x00),後面兩個是datatype,第二行開始寫數值,結尾一行不足4個的填寫0xff. (23,15,05對應80,29和39對應c0).四是在結構體mipi_dsi_cmd中,第一個引數是相應陣列的總個數,包括填充的oxff在內,同時初始化命令的個數一定要修改正確,否則會導致屏不亮。在點亮LK時,建議開啟命令傳送完成的列印資訊mipi_dsi.c--》mdss_dual_dsi_cmd_dma_trigger_for_panel--》dprintf(INFO, "Panel CMD: command mode dma tested successfully\n");有多少條命令傳送成功,就有多少個successfully列印的資訊。然後將此panel_truly_wqxga_dualdsi_cmd.h檔案include進oem_panel.c檔案,然後仿照參考的panel_sharp_wqxga_dualdsi_video.h檔案對應的SHARP_WQXGA_DUALDSI_VIDEO_PANEL新增相應的truly程式碼,主要是oem_panel_select和init_panel_data兩個函式,新增case TRULY_WQXGA_DUALDSI_CMD_PANEL和修改panel_id;接下來就是在display.h中仿照Reset新增各路gpio口,等同於核心中mtp檔案中的新增gpio口程式碼。最後就是target_display.c檔案中的target_panel_reset復位函式,還是仿照Reset的配置和電平設定,來配置和設定其他各路GPIO相應的高低電平,注意gpio口的分類即可,這個和核心中的復位有點類似,只是LK和KERNEL中使用的函式可能有差異。

       此致,點亮LCD的相關程式碼已經完成,這個時候LK和KERNEL應該都已經可以點亮了,如果不行,連線串列埠檢視列印資訊,解決跟LCD相關的異常資訊;將各路GPIO口飛線測量各路電壓是否正常;使用示波器測試reset時序是否正常。

       當然,首先需要觀察的就是背光是否起來,如果背光不亮,也可以先使背光常亮,來排除其他的問題。