SM7250(高通5G)平臺LCD bringup
寫在前面的話
高通平臺顯示這一塊,自從去年開始,高通全面使用SMxxxx命名的芯片
比如高端系列:SM8350(驍龍888),SM8250(驍龍865),SM8150(驍龍855)
中端系列:SM7250(驍龍765g),SM7350(驍龍775g)
低端系列:SM6250,SM6350
入門系列:SM4250,SM4350
SMxxxx系列跟SDMxxx系列相比較,主要變化如下:
SMxxxx系列采用了DRM顯示架構(gòu)(Direct Rendering Manager),代碼位于: kernel/drivers/gpu/drmSDMxxx系列采用FB(framebuffer)顯示架構(gòu),代碼位于: kernel/drivers/video/fbdev
1. 代碼路徑
display驅(qū)動路徑:
部分平臺kernel/msm-4.19/techpack/display部分平臺kernel/msm-4.19/drivers總之都是在kernel下,可以搜素關(guān)鍵文件來查找find ./ -name dsi_display.c
displayDTS路徑:
從arch/arm64/boot/dts軟連接到 vendor/qcom/proprietary/devicetree-4.19/qcom/display
display UEFI路徑:
boot_images/QcomPkg/SocPkg/XXXpanPkg
2.準(zhǔn)備工作:
原理圖端:
查看原理圖,確定LCD上電和接口 查看背光控制方式 查看與TP的連接
代碼端:
根據(jù)原理圖寫出lcd的dts配置文件
查看驅(qū)動代碼中的關(guān)鍵代碼:
1> lcd panel的選擇和加載
2> 背光的初始化和控制
3> Lcd 初始化時序和init code下載流程確認(rèn)
3.點(diǎn)亮順序:
先點(diǎn)亮kernel,再點(diǎn)亮UEFI。Lcd的點(diǎn)亮工作2-3天之內(nèi)完成,kernel點(diǎn)亮后,lcd功能正常,不會影響別的模塊的開發(fā)
工作,uefi可以慢慢調(diào)試,盡量自己掌握工作的進(jìn)度,不要被工作牽著鼻子走。
關(guān)閉UEFI panel的添加(DISP_MODE_PANEL_NONE)和禁止連續(xù)顯示(DISABLE_SEAMLESS_SPLASH) kernel正確加載dts中配置的panel,獲取panel的name 點(diǎn)亮背光 點(diǎn)亮lcd 調(diào)試LCD的休眠喚醒 點(diǎn)亮UEFI。
4.LCD 原理圖分析:

Lcd引腳主要包括:
MIPI信號線:(4對差分信號MIPI_DSI0~3_LANE0_P_CON MIPI_DSI0~3_LANE0_N_CON
1對時鐘線:MIPI_DSI0_CLK_P>_CON、MIPI_DSI0_CLK_N_CON)
偏壓供電:(+5V5_LCD_VSP -5V5_LCD_VSN),1.8v常用電(VREG_L1C_1P80)
LCD 復(fù)位引腳:LCM_RESET_N
背光控制引腳:PWM控制或者(PMIC DC控制,接背光led正極)
背光負(fù)極引腳:LCD_LED_K1、LCD_LED_K2(背光物理結(jié)構(gòu)布局為2串并列起來,所以負(fù)極有2串)
Lcd TE引腳:LCM_FTE(video mode不用)

LCD兼容問題
LCD ID引腳: LCD_ID0 LCD_ID1 LCD_ID2這個3個引腳主要用來同一套代碼,不同項(xiàng)目,不同屏幕之間的兼容。多
款屏幕兼容最極端的條件是,一套代碼,做3-5款產(chǎn)品,都使用了相同的屏幕IC,相同的模組。兼容的方法有3種
1>通過ID引腳讀取電平高低確定哪款LCD
2>通過讀取lcd的只讀寄存器確定哪款LCD
3>通過product id( 這個變量里面加入產(chǎn)品name IC name 模組name)
這些識別要在UEFI中實(shí)現(xiàn),通過cmdline傳遞到kernel解析出來

LCD供電方式
Lcd的供電一般有兩種方式:
1>外接regulator(外接的regulator本身也需要使能和控制),輸出vsp和vsn(+-5.5V)
2>PMIC (ldo 和ncp)直接輸出
為了方便描述,本例中l(wèi)cd不外接背光IC和偏壓IC,使用高通原生的設(shè)計方式。
5.點(diǎn)亮流程:
5.1 創(chuàng)建并配置Panel的dtsi文件
在目錄 vendor/qcom/proprietary/devicetree-4.19/qcom/display下,創(chuàng)建該主板配套Panel的dtsi文件:dsi-panel-ft8719p-1080p-video.dtsi填寫模塊名:參考同目錄下已有的其他型號Panel的dtsi文件,在文件 dsi-panel-ft8719p-1080p-video.dtsi中輸入文件頭:
&mdss_mdp {
dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {
};
};
配置LCM參數(shù):LCD屏參數(shù):porch
根據(jù)從廠商處獲取的porch資料,在文件dsi-panel-ft8719p-1080p-video.dtsi中于步驟2.輸入的{ };中輸入:
qcom,mdss-dsi-panel-framerate = <60>;
qcom,mdss-dsi-panel-width = <1080>;
qcom,mdss-dsi-panel-height = <2340>;
qcom,mdss-dsi-h-front-porch = <24>;
qcom,mdss-dsi-h-back-porch = <24>;
qcom,mdss-dsi-h-pulse-width = <4>;
qcom,mdss-dsi-h-sync-skew = <0>;
qcom,mdss-dsi-v-back-porch = <26>;
qcom,mdss-dsi-v-front-porch = <112>;
qcom,mdss-dsi-v-pulse-width = <4>;
qcom,mdss-dsi-h-left-border = <0>;
qcom,mdss-dsi-h-right-border = <0>;
qcom,mdss-dsi-v-top-border = <0>;
qcom,mdss-dsi-v-bottom-border = <0>;
一般先直接使用廠商提供的porch值,若顯示有問題再進(jìn)行修改
配置on/off command:根據(jù)從廠商處獲取的init code 在文件 dsi-panel-ft8719p-1080p-video.dtsi中與步驟3.并列輸入:
qcom,mdss-dsi-on-command = [
15 01 00 00 00 00 02 00 00
39 01 00 00 00 00 04 FF 87 19 01
15 01 00 00 00 00 02 00 80
39 01 00 00 00 00 03 FF 87 19
15 01 00 00 05 00 02 3A 70
39 01 00 00 00 00 07 B3 04 38 09 24 C0 F8
15 01 00 00 00 00 02 00 82
39 01 00 00 00 00 03 a7 22 04
15 01 00 00 00 00 02 00 83
...
05 01 00 00 78 00 02 11 00
05 01 00 00 32 00 02 29 00];
qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00
05 01 00 00 78 00 02 10 00];
qcom,mdss-dsi-on-command-state = "dsi_lp_mode";
qcom,mdss-dsi-off-command-state = "dsi_hs_mode";
廠商提供的initcode不可直接使用,需轉(zhuǎn)換command格式,格式要求如下:
由多個基于 qcom DSI 控制器協(xié)議的 dcs 數(shù)據(jù)包構(gòu)成的字節(jié)流。
字節(jié) 0:dcs 數(shù)據(jù)類型(無參數(shù)默認(rèn)05;一參數(shù)默認(rèn)15;多參數(shù)默認(rèn)39)
字節(jié) 1:設(shè)定指明這是獨(dú)立數(shù)據(jù)包(無鏈)
字節(jié) 2:虛擬通道數(shù)
字節(jié) 3:需要來自客戶端的確認(rèn)(dcs 讀取命令)
字節(jié) 4:在傳輸 dcs 命令后等待指定的毫秒數(shù)
字節(jié) 5 和 6:按網(wǎng)絡(luò)字節(jié)順序列出的 16 位長度
字節(jié) 7 及以上:凈荷的字節(jié)數(shù)
Example:第5行數(shù)據(jù)如圖
字節(jié)0: 一參數(shù)寫: 15(無參數(shù)默認(rèn)05;一參數(shù)默認(rèn)15;多參數(shù)默認(rèn)39)
字節(jié)1\2\3: 01 00 00(一般不動)
字節(jié)4: 5ms: 05
字節(jié)5\6: 2bytes: 00 02
字節(jié)7+: 寄存器及參數(shù):3A 70
5.配置MIPI信號:
根據(jù)從原理圖中了解到的所使用的MIPI信號,在文件dsi-panel-ft8719p-1080p-video.dtsi中與步驟3.并列輸入:
qcom,mdss-dsi-lane-0-state;
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
6.配置CLK:
根據(jù)高通提供的計算timing的表格80-nh713-1_yb_dsi timing parameters user interactive spreadsheet.xlsm計算clk timing,在文件dsi-panel-ft8719p-1080p-video.dtsi中與步驟3.并列輸入:
qcom,mdss-dsi-panel-phy-timings = [
00 1E 09 08 0E 0C 09
09 06 02 04 00 19 0D];
SM7250使用的是DSI PHY 4.0.0 DPHY timing,在DSI and MDP registers sheet填寫porch、frame rate(默認(rèn)60),并選擇chip,在DSI PHY 4.0.0 DPHY timing處自動生成timing,舉例如下圖(不是本例中的portch值)
結(jié)果如下:
qcom,mdss-dsi-display-timings {
timing@0 {
qcom,mdss-dsi-panel-phy-timings = [00 14 05 05 1f 1e 05
05 03 02 04 00 12 15];
qcom,mdss-dsi-t-clk-post和 qcom,mdss-dsi-t-clk-pre 不再需要配置
7.配置Panel的其他參數(shù):
&mdss_mdp {
dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {
qcom,mdss-dsi-panel-name = "ft8719p 1080p video mode dsi panel";
qcom,mdss-dsi-panel-type = "dsi_video_mode";
qcom,dsi-ctrl-num = <0>;
qcom,dsi-phy-num = <0>;
qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0";
qcom,mdss-dsi-virtual-channel-id = <0>;
qcom,mdss-dsi-stream = <0>;
qcom,mdss-dsi-bpp = <24>;
qcom,mdss-dsi-underflow-color = <0xff>;
qcom,mdss-dsi-border-color = <0>;
qcom,mdss-dsi-traffic-mode = "burst_mode";
qcom,mdss-dsi-bllp-eof-power-mode;
qcom,mdss-dsi-bllp-power-mode;
qcom,mdss-dsi-lane-0-state;
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
qcom,mdss-dsi-dma-trigger = "trigger_sw";
qcom,mdss-dsi-mdp-trigger = "none";
qcom,mdss-dsi-reset-sequence = <1 20>, <0 10>, <1 100>;
qcom,mdss-dsi-display-timings {
timing@0 {
qcom,mdss-dsi-panel-framerate = <60>;
qcom,mdss-dsi-panel-width = <1080>;
qcom,mdss-dsi-panel-height = <2340>;
qcom,mdss-dsi-h-front-porch = <24>;
qcom,mdss-dsi-h-back-porch = <24>;
qcom,mdss-dsi-h-pulse-width = <4>;
qcom,mdss-dsi-h-sync-skew = <0>;
qcom,mdss-dsi-v-back-porch = <26>;
qcom,mdss-dsi-v-front-porch = <112>;
qcom,mdss-dsi-v-pulse-width = <4>;
qcom,mdss-dsi-h-left-border = <0>;
qcom,mdss-dsi-h-right-border = <0>;
qcom,mdss-dsi-v-top-border = <0>;
qcom,mdss-dsi-v-bottom-border = <0>;
qcom,mdss-dsi-on-command = [
15 01 00 00 00 00 02 00 00
39 01 00 00 00 00 04 FF 87 19 01
15 01 00 00 00 00 02 00 80
......
05 01 00 00 78 00 02 11 00
05 01 00 00 32 00 02 29 00
];
qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00
05 01 00 00 78 00 02 10 00];
qcom,mdss-dsi-on-command-state = "dsi_lp_mode";
qcom,mdss-dsi-off-command-state = "dsi_hs_mode";
qcom,mdss-dsi-h-sync-pulse = <1>;
qcom,mdss-dsi-panel-phy-timings = [
00 1E 09 08 0E 0C 09
09 06 02 04 00 19 0D];
qcom,display-topology = <1 0 1>;
qcom,default-topology-index = <0>;
};
};
};
};
5.2 修改文件lito-sde-display.dtsi
將5.1步驟配置好的 dsi-panel-ft8719p-1080p-video.dtsi文件添加到lito-sde-display.dtsi
+#include "dsi-panel-ft8719p-1080p-video.dtsi"
配置默認(rèn)屏幕
lito-sde-display.dtsi
sde_dsi: qcom,dsi-display-primary {
qcom,dsi-default-panel = <&dsi_ft8719p_1080p_video>;
}
添加背光控制、LCD復(fù)位和上電
為了LCD dts的規(guī)范性,把背光控制、LCD復(fù)位和上電的配置放到了lito-sde-display.dtsi文件中
&dsi_ft8719p_1080p_video {
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
qcom,mdss-dsi-bl-min-level = <1>;
qcom,mdss-dsi-bl-max-level = <4095>;
qcom,mdss-brightness-max-level = <255>;
qcom,platform-reset-gpio = <&pm8150l_gpios 3 0>;
qcom,panel-supply-entries = <&dsi_panel_pwr_supply_labibb>;
};
5.3驗(yàn)證驅(qū)動是否正常加載
1.開機(jī)看屏幕是否可以正常顯示開機(jī)logo,背光是否正常點(diǎn)亮,是否正常顯示圖像
2.進(jìn)入系統(tǒng)后,按power鍵進(jìn)行休眠喚醒,看屏幕是否可以正常滅屏、亮屏
3.調(diào)節(jié)背光亮度,查看背光亮度是否改變,也可以使用adb命令查看屏幕亮度及調(diào)節(jié)屏幕亮度:
adb shell
cd sys/class/leds/lcd-backlight
cat brightness // 查看當(dāng)前屏幕亮度
echo * > brightness // 設(shè)置亮度,*可以是0~255之間任意的值
后面的文章會跟新LCD的dts分析以及其他LCD內(nèi)容。

