原文: https://blog.csdn.net/eliot_shao/article/details/52474348
D- PHY的物理層支持HS(High Speed)和LP(Low Power)兩種工作模式
Video模式時,物理層只能選擇HS模式,下面是video模式下傳遞一個些圖片像素數據包(長包)。
- HS模式:低壓查分信號功耗大高速率(80M -1Gbps) 信號幅值(100mv-300mv)
- LP模式:單端信號功耗小,速率低(< 10Mbps) 信號幅值(0-1.2V)
在高速模式下,通道狀態是差分的0或1,定義P比N高時定義為1,P比N低時定義為0,此時線上典型電壓為差分200mv
在LP模式下,只用lane0傳輸數據和時鐘,雙向數據傳輸。
鏈路層的模式分為:Command模式和Video模式。
- 鏈路層選擇Command模式時,物理層可以為HS模式,也可以為LP模式;
- 鏈路層選擇Video模式時,物理層只能選擇HS模式。
Video模式時,物理層只能選擇HS模式,下面是video模式下傳遞一個些圖片像素數據包(長包)。
和command模式不同的是Data Type,這裡的Data Type是3Eh,下面有一張Data Type的表。
下面介紹一下qualcomm平台dtsi配置文件中關於對video模式配置說明:
qcom,mdss-dsi-panel-type =“ dsi_video_mode ”;
qcom,mdss-dsi-on-command = [29 01 00 00 00 00 04 B9 FF 83 94
29 01 00 00 00 00 02 C6 EF
05 01 00 00 78 00 02 11 00
05 01 00 00 14 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-on-command是在Mdss_dsi_panel.c (drivers\video\msm\mdss)的
static int mdss_dsi_panel_on(struct mdss_panel_data *pdata)函數里用到的,點亮LCM的指令,未來這個函數將會被FB驅動resume裡面調用到。
類似的,qcom,mdss-dsi-off-command
同樣在文件
Mdss_dsi_panel.c (drivers\video\msm\mdss)的static int mdss_dsi_panel_off(struct mdss_panel_data *pdata)用到,未來將會被FB驅動的suspend函數里調用,用於關掉LCM的指令。
定義這個panel為" dsi_video_mode ",在下發mdss-dsi-on-command之後會把DSI轉換到video-hs模式下。
那麼mdss-dsi-on-command和mdss-dsi-off-command是什麼時候調用的呢?
如果按照MTK平台對LCM處理的思維,大概是這樣的:
LCM_DRIVER nt52021_hd720_dsi_vdo_lcm_drv =
{
.name =“nt52021_hd720_dsi_vdo”,
.set_util_funcs = lcm_set_util_funcs,
.get_params = lcm_get_params,
.init = lcm_init,//reset 調用DSI發初始化數據
.suspend = lcm_suspend,//調用DSI發滅panel數據
.resume = lcm_resume,//reset 調用DSI發初始化數據
.compare_id = lcm_compare_id,
#if(LCM_DSI_CMD_MODE)
.update = lcm_update,
#ENDIF
};
而高通平台是則是在LCM的FB驅動裡面,probe通過調用MDP驅動結構體的初始化函數,調用DSI驅動想MDPcore註冊的回調函數,這些回調函數就是操作DSI發送不同的數據,而這些數據恰恰就是dtsi裡面需要配置的mdss-dsi-on-command和mdss-dsi-off-command。
言歸正傳,前面說明了DSI 在video模式下面發送一些像素圖片的數據包內容,但是在實際傳輸這些數據包的時候需要遵守一些時序控制。
Video模式又分三種子模式:
1
Non-burst Mode Sync pulses:在這種模式下,DSI基於各種不同的同步數據包來做數據同步。這種數據包括:重構,時間校準等。更具體的請參考DSI協議標準。
2
Non-burst Mode Sync event :這種模式和第一種模式很像,但是這種模式不會發重構和時間校準的數據包,它們只發送一種叫做”Sync event”的包。
3
Burst mode:在horizontal的時序是一樣的情況下DSI會把連接的速度提升到Panel支持的最大速度。在這種模式下發送RGB數據包的時間被壓縮,以留出更多的時間用來傳送其他的數據。
為了使能Video模式Host需要發送各種不同的包到panel用來設置開始和結束的Porch.以下是Video模式中用到的數據包:
•VSS:DSI同步事件包:V同步啟動
•VSE:DSI同步事件包:V同步結束
•BLLP:DSI數據包:任意序列的非限制性DSI數據包或低功耗模式,包括可選的BTA。
•HSS:DSI同步事件包:H同步開始
•HAS:DSI消隱數據包:水平同步活動或低功耗模式,無數據
•HSE:DSI同步事件包:H同步結束
•HFP:DSI消隱數據包:水平前沿或低功耗模式
•HBP:DSI消隱數據包:水平後沿或低功耗模式
•RGB:DSI包:像素流和空包的任意序列
•LPM:低功耗模式包含可選的BTA
上圖頂部有圓弧的代表數據包,長方形的代表時序的狀態。
那麼MIPI host如何輸入一幀的數據呢,下面分別是三種video mode下的數據傳輸時序圖:
結合屏的物理結構才看得動上面時序圖的含義:
以BURST mode為例:
首先會發送VSPW行(VSA lines)的空數據包,在發送VBP lines的空數據包,接著發送VACT lines(屏寬)的有效RGB數據,其中每一行數據都包含HSS 行開始信號+HBP數據包+RGB+HFP數據包。最後就是發送VFP lines的空數據包。這樣就刷滿了一整屏,也就是一幀的數據。
那麼這三種video模式的區別就是傳遞的數序和數據包位置的不同,至於最終在dtsi配置哪一個模式就要根據實際的panel IC所支持video 模式來。
dtsi對應項:
qcom,mdss-dsi-traffic-mode =“non_burst_sync_event”;
另外說明一下dtsi 裡面qcom,mdss-dsi-h-sync-pulse 的含義
在kernel/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt:196中說明了:
這裡所說的pulse mode就是Non-burst Mode Sync pulses模式。
根據時序圖,如果這個值為1就會發圖中紅色圈圈的部分,如果為0就不會發,不過這個只用於這種模式下有效。