reference :
LCD driver的框架
以msm8909為例。
LCD命名規則
例如:
nt35521-720p-video
nt35521-wxga-video
nt35590-qvga-cmd
otm8018b-fwvga-video
ili9806e-fwvga-video_pixi445_tf
hx8379c-tdt-fwvga-video
……
名稱 = LCD的IC型號+ 該driver下屏的分辨率+ MIPI接口+ 接口下的模式+ 屛廠供應商+ 項目名
以上參數的含義:
-
分辨率會有:720p,fwvga,wvga,hd……(分別指的是:
720*1280
和856*480
,1024*600
,1280*720
) -
供應商:truly,TFT,TDT,BYD……
-
LCD的接口一般又分為:dsi,dbi,dpi
其中DSI MIPI接口,MIPI聯盟推出的一種高速低耗接口,根據是否有緩存分為:
-
CMD:Command Mode
-
VDO:Video Mode
MIPI
對於MIPI下的接口,CMD對應MPU接口,而VDO接口是對應的RGB接口。在VDO模式下視頻數據只能通過HS mode傳輸。
MIPI很多參數是需要根據LCD的datasheet來計算的,其中HFP,HBP,VFP,VBF都是以同步信號(HSYNC和VSYNC)為基准計算。
在同步信號之前為Front,在之后為Back。需要注意的是,這里並不是以有效像素為基准。
關於DSI bit clock(MIPI)的計算,在dtsi中的參數描述為:qcom,mdss-dsi-panel-clockrate=<>
,一般情況該值都不建議修改。
因為SRC files文件會根據porch,resolution以及fps來計算。如果由於RF信號干擾或者其他情況需要更改的話,建議是從porch或者fps實現。
LCD的fps一般都上限為60,正常使用時候一般設置為58,因為由於LCD panel range存在刷新率溫度漂移情況,所以在dtsi中關鍵panel-framerate
都不建議修改。
Backlight
LCD的開機在整個開機的時候是使用的是LK的initial code,只有在開機后睡眠喚醒后才會去調用kernel的參數。正常情況背光分為32階,並且最大亮度設置為255(dtsi),針對背光還需要驗證的是在開機關機休眠喚醒的時候,initial code和背光亮起的時候要搭配協調。否者會造成閃屏白屏等現象。
其次,要注意LCD的背光芯片操作背光的方式,一般分為兩種模式,一種是GPIO口直接操作的,一種是以PWM的MPP來操作的。對於GPIO操作的配置在mtp。dtsi中可以參考如下:
&pmx_mdss {
qcom,num-grp-pins = <2>;
qcom,pins = <&gp 25>, <&gp 17>;
};
&mdss_dsi0 {
qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_video>;
//qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_video_tdt>;
pinctrl-names = "mdss_default", "mdss_sleep";
pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
// qcom,platform-bklight-en-gpio = <&msm_gpio 37 0>;
qcom,platform-reset-gpio = <&msm_gpio 25 0>;
qcom,platform-blk-ctrl-gpio = <&msm_gpio 17 0>;
//modify by ke.li@tcl.com for LCD is ili9806e ,and the RST&backlight Ctrl had changed [End]--- 2015.8.28
};
而PWM的方式主要配置如下:
mpp@a100 { /* MPP 2 */
/* Backlight PWM */
// qcom,mode = <1>; /* Digital output */
// qcom,invert = <0>; /* Disable invert */
// qcom,src-sel = <4>; /* DTEST1 */
// qcom,vin-sel = <0>; /* VPH_PWR */
// qcom,master-en = <1>; /* Enable MPP */
status = "disabled";
};
而以上具體采用哪一種配置方法的選擇是在本身dtsi中如下配置:
qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_gpio";
//qcom,mdss-dsi-bl-pmic-pwm-frequency = <33>;
//qcom,mdss-dsi-bl-pmic-bank-select = <0>;
//qcom,mdss-dsi-pwm-gpio = <&pm8909_mpps 2 0>;
CABL
說到背光的話,還有一個算法與之有關系,是CABL,在mtk也叫CABA。
平台端的CABL功能算法是用於LCD背光燈相關計算,在更新灰階前,處理出現不連續不均勻等的狀況。當然該算法也可以回導致LCD出現灰階部分會有波紋以及短暫的不連續的條紋情況。該配置是在system.prop中可以配置。在MTK是需要在perjectconfig中配置MTK_AAL_SUPPORT=Y.
ili9806e : The CABC (Content Adaptive Brightness Control) dynamic backlight control function is used to reduce the power consumption of the luminance source.
Initial code
LCD還有很大的一塊是initial code,這塊主要是依靠FAE,因為不同的ic有不同的要求,當然有些是通用的,在這塊initial code中,我們需要注意的是在集成數據的時候,要保證參數take進入的正確性,否則會造成不亮,藍屏,白屏等問題。
在MTK平台下,initial code是在driver中配置的,在qcom平台下是在dtsi中配置的。
Initial code另外需要我們注意的是最后2個寄存器0x11和0x29。這是點亮屏幕最后的兩個參數,正常情況下延遲會在150ms和50ms。其余寄存器寫入值可以不需要延時。
在滅屏的時候,通常會去先寫0x28再寫0x10,延遲應該和亮屏的2911對應。這是通常說的2810的power off模式。
另外亮屏通常用的是lp mode,而滅屏用的是hig mode。
Porch
Proch是前后廊,用於描述切屏的數據,一般出現錯誤和誤差的情況會有上、下部分出現亮穩橫紋等情況。
這是由於LCD顯示的時候丟了幾行數據造成的,根本原因是在LCD顯示速度慢與主控寫的速度,而兩者沒有使用一個叫Tearing effect out line的機制。
關於porch的計算:
HFP:Horizontal Back Porch = left_margin
水平后沿:在每行或者每列像素數據開始輸出時要插入的像素時鍾周期。
HBP:Horizontal Front Porch = right_margin
水平前沿:在每行或每列的像素結束到LCD行時鍾輸出脈沖之間的像素時鍾。
VBP: Vertical Back Porch = upper_margin
垂直后沿:在垂直同步周期之后幀開頭時的無效行數。
VFP: Vertical Front Porch = lower_margin
垂直前沿:本幀數據輸出結束到下一個垂直同步周期開始之前的無效行數。
Hsync:Hsync plus width = HPW
行(水平)同步脈寬(單位是時鍾周期)
Vsync: Vertical plus width = VPW
同理Vsync=VPW,垂直時鍾周期。
DSI Clock
H-total = HorizontalActive + HorizontalFrontPorch + HorizontalBackPorch + HorizontalSyncPulse + HorizontalSyncSkew
V-total = VerticalActive + VerticalFrontPorch + VerticalBackPorch + VerticalSyncPulse + VerticalSyncSkew
Total pixel = H-total * V-total * 60(Hz通常都是這個,當然可以變).
Bitclk = Total pixel * bpp(byte) *8/lane number(有幾路mipi data lane).
Byteclk = bitclk/8
Dsipclk(Dsi pixel clock) = (Byteclk * lane number)/bpp(byte) = Total pixel * 8
Byteclk = pclk * pixel depth / lane number
ESD Check
ESD Check功能用於檢測靜電的干擾,在有靜電干擾的情況LCD會出現白屏,橫紋等臨時問題,即在休眠喚醒屏幕后能回復正常。ESD check主要的作用是檢測是否受到靜電干擾,並且在受到干擾的時候reset LCD使之回復正常。
在配置的時候在dtsi中,其中的配置如下:
- qcom,esd-check-enabled: Boolean used to enable ESDrecovery feature.
- qcom,mdss-dsi-panel-status-command: A byte stream formed by multiple dcspackets based on
qcomdsi controller protocol, to read the panel status.
Thisvalue is used to kick in the ESD recovery.
byte0: dcs data type
byte1: set to indicate this is an individual packet
(no chain)
byte2: virtual channel number
byte3: expect ack from client (dcs read command)
byte4: wait number of specified ms after dcs command
transmitted
byte5, 6: 16 bits length in network byte order
byte7 and beyond: number byte of payload
- qcom,mdss-dsi-panel-status-command-mode: Stringthat specifies the ctrl state for reading the panel status.
"dsi_lp_mode"= DSI low power mode
"dsi_hs_mode"= DSI high speed mode
- qcom,mdss-dsi-panel-status-check-mode: Specifies the panel status check method for ESD recovery.
"bta_check"= Uses BTA to check the panel status
"reg_read"= Reads panel status register to check the panel status
"te_signal_check"= Uses TE signal behaviour to check the panel status
- qcom,mdss-dsi-panel-status-value: Specifies the value of the panel statusregister when the panel is in good state.
LCD DTSI中各參數詳細解釋
大部分的設備樹解析代碼在:kernel/drivers/video/fbdev/msm/mdss_dsi_panel.c
中,可以自己參考去看對應的配置意義。
屬性 |
描述 |
代碼示例 | 參數詳解 |
qcom,mdss-dsi-panel-name | 用作面板描述名稱的字符串。 | qcom,mdss-dsi-panel-name = "tianma(otm1283a) 720p video mode dsi panel"; | 根據您的面板名稱進行定制 |
qcom,mdss-dsi-panel-controller | 指定此面板映射到的DSIcontroller的句柄。 | qcom,mdss-dsi-panel-controller =<&mdss_dsi0>; | 保持不變 |
qcom,mdss-dsi-panel-type | 指定面板操作模式。 “dsi_video_mode” = 啟用視頻模式 “dsi_cmd_mode” = 啟用命令模式 |
qcom,mdss-dsi-panel-type = "dsi_video_mode"; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-panel- destination | 指定面板目標顯示的字符串。 "display_1" = DISPLAY_1 "display_2" = DISPLAY_2 |
qcom,mdss-dsi-panel-destination = "display_1"; | 保持不變 |
qcom,mdss-dsi-bpp | 指定面板的每像素位數。 3 = 適用於 rgb111 8 = 適用於 rgb332 12 = 適用於 rgb444 16 = 適用於 rgb565 18 = 適用於 rgb666 24 = 適用於 rgb888 |
qcom,mdss-dsi-bpp= <24>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-panel-framerate | 指定面板的幀率。60 = 每秒 60 幀(默認值) | qcom,mdss-dsi-panel-framerate =<60>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-panel-width | 指定面板寬度(單位:像素)。 | qcom,mdss-dsi-panel-width =<720>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-panel-height | 指定面板高度(單位:像素)。 | qcom,mdss-dsi-panel-height =<1280>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-h-back-porch | 水平后沿值(單位:像素)。 | qcom,mdss-dsi-h- back-porch =<100>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-h-front-porch | 水平前沿值(單位:像素)。 | qcom,mdss-dsi-h- front-porch = <52>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-h-pulse-width | 水平脈沖寬度。 | qcom,mdss-dsi-h- pulse-width = <24>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-h-sync-skew | 水平同步傾斜值。0 = 默認值。 | qcom,mdss-dsi-h- sync-skew = <0>; | 保持不變 |
qcom,mdss-dsi-v-back-porch | 垂直后沿值(單位:像素)。 | qcom,mdss-dsi-v- back-porch = <20>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-v-front-porch | 垂直前沿值(單位:像素)。 | qcom,mdss-dsi-v- front-porch = <8>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-v-pulse-width | 垂直脈沖寬度。 | qcom,mdss-dsi-v- pulse-width = <4>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-h-left-border | 水平左邊框(單位:像素)。0 = 默認值 | qcom,mdss-dsi-h-left-border = <0>; | 保持不變 |
qcom,mdss-dsi-h-right-border | 水平右邊框(單位:像素)。0 = 默認值 | qcom,mdss-dsi-h- right-border = <0>; | 保持不變 |
qcom,mdss-dsi-v-top-border | 垂直上邊框(單位:像素)。0 = 默認值 | qcom,mdss-dsi-v- top-border = <0>; | 保持不變 |
qcom,mdss-dsi-v-bottom-border | 垂直下邊框(單位:像素)。0 = 默認值 | qcom,mdss-dsi-v- bottom-border =<0>; | 保持不變 |
qcom,mdss-dsi-border-color | 如有邊框,定義邊框顏色值。0 = 默認值。 | qcom,mdss-dsi-border-color = <0>; | 保持不變 |
qcom,mdss-dsi-panel-timings | 長度為 12 的數組,用於指定面板的PHY 定時設置。 | qcom,mdss-dsi-panel-timings = [92 1A 12 00 3E 42 161E 14 03 04 00]; | 開始嘗試啟動此面板時保持不變;如果面板啟動失敗,請創建用例,幫助微調參數 |
qcom,mdss-dsi-virtual- channel-id | 指定虛擬頻道標識符。0 = 默認值。 | qcom,mdss-dsi-virtual-channel-id =<0>; | 保持不變 |
qcom,mdss-dsi-stream | 指定要使用的數據包流。 0 = 流 0(默認值) 1 = 流 1 |
qcom,mdss-dsi-stream = <0>; | 保持不變 |
qcom,mdss-dsi-on-command | 長度可變的數組,用於列舉面板的 init命令。 關於格式,請參考 kernel\drivers\video\msm\mdss\mdss_dsi.h 中的 dsi_cmd_desc 結構定義。 由多個基於 qcom DSI 控制器協議的dcs 數據包構成的字節流。 字節 0 – DCS 數據類型字節 1 – 設置此字節表示這是獨立數據包(無鏈)字節 2 – 虛擬頻道編號字節 3 – 需要來自客戶端的確認(dcs 讀取命令)字節 4 – 在傳輸 dcs 命令后等待指定的毫秒數字節 5、6 – 按網絡字節順序列出的16 位長度字節 7 及以上 – 凈荷的字節數 |
qcom,mdss-dsi-on- command =[ 32 01 00 00 00 0002 00 00 29 01 00 00 10 00 02 FF 99]; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-off-command | 長度可變的數組,用於列舉面板關閉 命令。 | qcom,mdss-dsi-off-command =[ 05 01 00 00 32 02 28 00 05 01 00 00 7802 10 00]; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-on-command-state | 指定用於發送 ON 命令的控制狀態的字符串。 "dsi_lp_mode" = DSI 低功率模式(默認值) "dsi_hs_mode" = DSI 高速模式 |
qcom,mdss-dsi-on- command-state ="dsi_lp_mode"; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-off-command- state | 指定用於發送 OFF 命令的控制狀態的字符串。 "dsi_lp_mode" = DSI 低功率模式(默認值) "dsi_hs_mode" = DSI 高速模式 |
qcom,mdss-dsi-off- command-state ="dsi_hs_mode"; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-color-order | 指定 R、G 和 B 通道排序。 "rgb_swap_rgb" =DSI_RGB_SWAP_RGB(默認值) "rgb_swap_rbg" =DSI_RGB_SWAP_RBG "rgb_swap_brg" = DSI_RGB_SWAP_BRG "rgb_swap_grb" = |
qcom,mdss-dsi-color-order = "rgb_swap_rgb"; | 根據您的面板規格進行定制 |
DSI_RGB_SWAP_GRB "rgb_swap_gbr" =DSI_RGB_SWAP_GBR |
|||
qcom,mdss-dsi-underflow-color | 指定面板下溢顏色的控制器設置。0xff = 默認值。 | qcom,mdss-dsi-underflow-color =<0xff>; | 保持不變 |
qcom,mdss-dsi-h-sync-pulse | 指定面板的脈沖模式選項。 0 = 不在 vs/ve 數據包之后發送hsa/he(默認值) 1 = 在 vs/ve 數據包之后發送 hsa/he |
qcom,mdss-dsi-h-sync-pulse = <1>; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-hfp-power- mode | 用於確定水平前沿(HFP)空白期的DSI 通道狀態的布爾值 | qcom,mdss-dsi-hfp-power-mode; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-hbp-power- mode | 用於確定水平后沿(HBP)空白期期間的 DSI 通道狀態的布爾值。 | qcom,mdss-dsi-hbp-power-mode; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-hsa-power- mode | 用於確定水平同步活躍(HSA)模式 期間的 DSI 通道狀態的布爾值。 | qcom,mdss-dsi-hsa-power-mode; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-bllp-eof-Power- mode |
用於確定低功率空白期(BLLP)EOF 模式期間的 DSI 通道狀態的布爾值。 | qcom,mdss-dsi-bllp-eof-power-mode | 根據您的面板規格進行定制 |
qcom,mdss-dsi-bllp-power- mode | 用於確定低功率空白期(BLLP)模式 期間的 DSI 通道狀態的布爾值。 | qcom,mdss-dsi-bllp-power-mode; | 根據您的面板規格進行定制 |
qcom,mdss-dsi-traffic-mode | 指定面板流量模式。 "non_burst_sync_pulse" = 使用同步脈沖的非突發流量(默認值)。 "non_burst_sync_event" = 使用同步 啟動事件的非突發流量。 "burst_mode" = 突發模式。 |
qcom,mdss-dsi-traffic-mode = "burst_mode" | 根據您的面板規格進行定制 |
qcom, mdss-dsi-lane-0-state | 指定是否啟用數據通道 0 的布爾值。 | qcom, mdss-dsi-lane-0-state | 根據您的面板規格進行定制 |
qcom, mdss-dsi-lane-1-state | 指定是否啟用數據通道 1 的布爾值。 | qcom, mdss-dsi-lane-1-state | 根據您的面板規格進行定制 |
qcom, mdss-dsi-lane-2-state | 指定是否啟用數據通道 2 的布爾值。 | qcom, mdss-dsi-lane-2-state; | 根據您的面板規格進行定制 |
qcom, mdss-dsi-lane-3-state | 指定是否啟用數據通道 3 的布爾值。 | qcom, mdss-dsi-lane-3-state; | 根據您的面板規格進行定制 |
qcom, mdss-dsi-t-clk-post | 指定模式切換后的字節時鍾周期。 | qcom, mdss-dsi-t- clk-post = <0x04>; | 開始嘗試啟動此面板 時保持不變;如果面 板啟動失敗,請創建 用例,幫助微調參數 |
qcom, mdss-dsi-t-clk-pre | 指定模式切換前的字節時鍾周期。 | qcom, mdss-dsi-t-c-pre = <0x1C>; | 開始嘗試啟動此面板時 保持不變;如果面板啟 |
qcom, mdss-dsi-dma-trigger | 指定用於 DMA 路徑的觸發機制。"none" = 無觸發 "trigger_te" = 斷開用於觸發的檢查信 號線 "trigger_sw" = 由軟件觸發(默認設置) "trigger_sw_seof" = 軟件觸發和幀觸發的開始/結束。 "trigger_sw_te" = 軟件觸發和 TE |
qcom, mdss-dsi-dma-trigger = "trigger_sw"; | 保持不變 |
qcom, mdss-dsi-mdp-trigger | 指定用於 MDP 路徑的觸發機制。 "none" = 無觸發 "trigger_te" = 斷開用於觸發的檢查信號線 "trigger_sw" = 由軟件觸發(默認設置) "trigger_sw_te" = 軟件觸發和 TE |
qcom, mdss-dsi-mdp-trigger = "none"; | 保持不變 |
qcom, mdss-dsi-bl-pmic- control-type | 指定對此面板實施背光控制的字符串。 | qcom, mdss-dsi-bl- pmic-control-type = "bl_ctrl_wled"; (White Light Emitting Diode) |
根據您的面板規格進行定制 |
"bl_ctrl_pwm" = 由 PWM GPIO 控制的背光。 "bl_ctrl_wled" = 由 WLED 控制的背光。 "bl_ctrl_dcs" = 由 DCS 命令控制的背光。 其他:未知背光控制。(默認值) |
|||
qcom, mdss-dsi-reset- sequence | 列出重置 GPIO 值和睡眠序列的數組 每個命令具有下面定義的格式: --> 重置 GPIO 值 --> 睡眠值(毫秒) |
qcom, mdss-dsi-reset-sequence =<1 2>, <0 10>, <1 10>; | 根據您的面板規格進行定制 |
qcom, mdss-dsi-bl-min-level | 指定面板支持的最低背光級別。0 = 默認值。 | qcom, mdss-dsi-bl-min-level = <1>; | 保持不變 |
qcom, mdss-dsi-bl-max-level | 指定面板支持的最高背光級別。255 = 默認值。 | qcom, mdss-dsi-bl- max-level = <255>; | 保持不變 |
qcom, mdss-dsi-lane-map | 指定數據通道交換配置。 "lane_map_0123" = <0 1 2 3>(默認值) "lane_map_3012" = <3 0 1 2> "lane_map_2301" = <2 3 0 1> "lane_map_1230" = <1 2 3 0> "lane_map_0321" = <0 3 2 1> "lane_map_1032" = <1 0 3 2> " lane_map_2103" = <2 1 0 3> "lane_map_3210" = <3 2 1 0> |
qcom, mdss-dsi-lane-map = "lane_map_0123"; | 根據您的面板規格進行定制 |
附錄:Mipi中CMD和VDO模式的區別
Mipi兩種應用模式:VDO(video mode)是視頻模式,CMD是commond mode命令模式
與傳統工作模式RGB接口相似,由於不使用專用的數據信號傳輸同步,控制信號和RGB數據都以mipi總線傳輸,主機需要定期刷新顯示器,顯示器就不需要幀緩沖器。
Dsi雖然不需要幀緩沖器,但主機定期以告訴模式發送dsi視頻文報,消耗了大量的CPU資源。
所以一般在選擇driver的時候根據項目要求以下情況來選擇:
IC型號——MIPI接口——SYNC模式——分辨率——平台——模組廠商