轉自:https://blog.csdn.net/liuxd3000/article/details/82591444
D- PHY的物理層支持HS(High Speed)和LP(Low Power)兩種工作模式
- 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 Sync Event Packet: V Sync Start
• VSE: DSI Sync Event Packet: V Sync End
• BLLP: DSI Packet: Arbitrary sequence of non-restricted DSI packets or Low Power Mode incluing optional BTA.
• HSS: DSI Sync Event Packet: H Sync Start
• HAS: DSI Blanking Packet: Horizontal Sync Active or Low Power Mode, No Data
• HSE: DSI Sync Event Packet: H Sync End
• HFP: DSI Blanking Packet: Horizontal Front Porch or Low Power Mode
• HBP: DSI Blanking Packet: Horizontal Back Porch or Low Power Mode
• RGB: DSI Packet: Arbitrary sequence of pixel stream and Null Packets
• LPM: Low Power Mode incuding optional 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就不會發,不過這個只用於這種模式下有效。