1、前言
在驅動開發中,我們往往需要適配一些新的屏幕或者調試一些屏幕的參數等,對於Qualcomm的MSM8909這款SoC,當啟動Android系統時,會有一個LK階段,該階段用來啟動Linux內核系統,本文,將簡單介紹如何在MSM8909的LK階段中如何進行LCM屏的兼容和適配流程,並對LK階段中,LCD屏幕的初始化和顯示流程進行簡要分析。
2、LCM接口框圖
下圖為LCM的接口框圖,屏幕的背光燈使用PWM波進行控制:
3、適配LCM屏幕
接下來,將基於MSM8909的Android系統平台,介紹如何在LK階段適配一款LCM屏幕,使用GCDB工具生成屏幕的參數文件並借助於Qualcomm的LK驅動框架,能夠很快速地完成適配,下面,簡單給出大概流程。
首先進入Android源碼根目錄,找到GCDB工具相關的路徑,並進入工具路徑,運行下面命令:
$ cd msm8909_7.1/device/qcom/common/display/tools $ cp panel_ili9881c_720p_video.xml panel_noname_720p_video.xml
$ vim panel_noname_720p_video.xml
然后,就是根據要適配的屏幕,去修改.xml中屏幕參數描述:
- PanelID:將會生成kernel中的屏幕參數的設備樹文件的名稱;
- PanelH:將會生成LK階段的屏幕參數頭文件。
接下來,修改panel的配置信息:
- PanelName:LCM屏幕的名稱;
- PanelType:LCM屏幕的模式,0代表VIDEO_MODE,1代表COMMAND_MODE;
- PanelOrientation:僅在LK階段使用,1代表旋轉0度,2代表旋轉180度,如果默認不配置則代表旋轉0度;
- PanelFrameRate:表示屏幕每秒的刷新頻率,例如56則代表56fps。
接下來,修改panel的分辨率配置信息:
- PanelWidth:屏幕寬度的分辨率;
- PanelHeight:屏幕高度的分辨率;
- HFrontPorch:水平前廊值;
- HBackPorch:水平后廊值;
- HPulseWidth:水平脈沖寬度;
- HSyncSkew:水平同步傾斜值;
- VBackPorch:垂直后廊值;
- VFrontPorch:垂直前廊值;
- VPulseWidth:垂直脈沖寬度值。
接下來,則是修改panel的顏色信息配置:
- ColorFormat:定義了每個像素點的位數;
- ColorOrder:定義了在msm芯片和panel之間每位顏色系列的組成。
ColorFormat和ColorOrder值的含義如下:
接下來,則是panel命令的信息配置:
- OnCommand:panel打開的命令字節數組,而命令的格式如下所示:
- OffCommand:panel關閉的的命令字節數組;
- OnCommandState:發送OnCommand時屏幕的狀態,0代表DSI_LP_MODE模式,1代表DSI_HP_MODE模式;
- OffCommandState:發送OffCommand時屏幕的狀態。
對於命令的格式如下所示:
經常要修改的值為PayloadSize和Payload,如下:
接下來,修改panel在Video模式下的信息配置:
- HSyncPulse:水平同步脈沖,它確定硬件是否發送水平同步脈沖在垂直消隱期間,0代表Sync Pulse不使能,1則代表使能;
- TrafficMode:屏幕流量模式類型,0代表non burst with sync pulses,1代表non burst with sync start event,2代表burst mode。
接下來,則是修改dsi線相關的配置:
- DSILanes:DSI通信的線路數量,4則代表了4組panel線路;
- DSILaneMap代表了數據線是怎么映射到panel上的,它的值代表如下:
- LaneNState(N:0-3):代表了線路N的狀態,1代表使能,0代表不使能。
對於DSILaneMap的值含義如下所示:
接下來,則是panel的時序控制相關參數配置,需要使用Qualcomm提供的工具80-NH713-1_DSI.zip自動生成:
PanelTimings:代表了長度為12的字節數組,指定panel的時序配置;
TClkPost:DSI時序控制時鍾的post值;
TClkPre:DSI時序控制時鍾pre值。
接下來,則是panel的背光燈信息配置:
- BLMinLevel:代表背光燈的最小值;
- BLMaxLevel:代表背光燈的最大值;
- BLPMICControlType:代表背光燈的控制類型,它的值代表如下:
通常情況下,一般都使用PWM來進行背光燈的控制。
根據要適配的LCM屏幕配置好.xml文件后,接下來,則是使用GCDB工具命令,生成屏幕配置參數的頭文件和設備樹文件,對於頭文件,是在LK啟動階段使用的,設備樹文件則是在Linux內核驅動中使用的,命令如下:
$ perl parser.pl panel_noname_720p_video.xml panel $ ls -al panel_noname*
將會在當前目錄下,自動生成的屏幕頭文件和設備樹文件:
# 屏幕配置參數頭文件
panel_noname_720p_video.h
# 屏幕配置的設備樹文件
dsi-panel-noname-720p-video.dtsi
在本章節,只介紹在LK啟動階段中的適配,將相關的文件移動到對應使用的目錄:
對於LK啟動階段中,使用下面命令:
$ mv panel_noname_720p_video.h ~/msm8909_7.1/bootable/bootloader/lk/dev/gcdb/display/include/
對於Linux內核驅動,使用下面命令:
$ mv dsi-panel-noname-720p-video.dtsi ~/msm8909_7.1/kernel/arch/arm/boot/dts/qcom/
重點來咯,接下來就是在LK的啟動文件中,基於Qualcomm的軟件驅動框架,修改對應的驅動文件,將屏幕適配,步驟如下:
編輯和修改oem_panel.c文件:
$ cd msm8909_7.1/bootable/bootloader/lk/target/msm8909 $ vim oem_panel.c
首先,是添加剛剛自動生成的屏幕配置頭文件:
添加適配新屏幕的索引號,將通過該索引號選擇相應的屏幕:
在panel_list中添加適配的新屏幕,該結構體表示目標板中支持的屏幕:
接下來,則是在init_panel_data()函數中添加新屏幕的配置參數,該函數用與初始化panel的參數配置:
最后,則是在oem_panel_select()函數中添加新屏幕的索引號,LK啟動階段將通過該函數進行屏幕的選擇:
大概的修改步驟就描述完了,使用make aboot命令編譯bootloader后,重新燒寫即可。
4、小結
本文簡單介紹了在MSM8909的Android平台中使用GCDB生成LCM屏的配置文件,並介紹了在LK啟動階段適配新屏幕的大概流程。