展訊平臺 LCD(Mipi) 載入流程分析

小浩09發表於2018-07-02

stage1 階段的詳細分析參見 uboot 詳細註釋講解 
我們從 uboot 的 stage2 開始分析。

載入流程分析

首先是完成硬體的初始化。 
函式呼叫流程為: 
u-boot64/arch/arm/board.c: 
board_init_r() 
u-boot64/common/stdio.c: 
stdio_init() 
u-boot64/common/lcd.c: 
drv_lcd_init() 

lcd_init() 

u-boot/drivers/video/sprdfb/sprdfb_main.c: 
lcd_ctrl_init() 

sprdfb_probe() 

在 probe 中做了這樣幾件事: 
1. 設定背光(set_blacklight(0),在一開始向 PWM 暫存器中寫 0 ) 
2. 配置 GPIO(214 和 167,所以應該去檢查 214 和 167 分別是幹什麼的?) 
3. 將 sprdfb_dispc_ctrl 賦值給 dev->ctrl,呼叫 sprdfb_dispc_ctrl 中的 early_init : 
u-boot64/drivers/video/sprdfb/Sprdfb_dispc.c: 
先看 sprdfb_dispc_ctrl 結構體: 

在前面的 probe 中我們看到 最開始呼叫了回撥函式 early_init 

4. sprdfb_panel_probe() 

先執行 panel 的準備工作(panel_mount) 
在 panel_mount 裡: 
根據 lcd 的型別(mipi)選擇對應正確的結構體型別(dev->if_ctrl = & sprdfb_mipi_ctrl)。 
在這個裡面進行讀螢幕 id 的操作(adapt_panel_from_readid()) 
在 adapt_panel_from_readid 裡: 
進行 dev->panel->ops->panel_readid 的操作,呼叫驅動裡的 readid 函式讀取 lcd 暫存器中的 id。 
並且將其與 panel_cfg 結構體中的 id 進行比較。 
如果正確的話,就進行驅動中 panel_init 的操作, 
並且將 id 儲存為靜態全域性變數,以傳給 kernel, 
且將 panel_spec 型別的結構體 panel_cfg 返回到 sprdfb_panel_probe 中去。 
如果錯誤的話,就執行移除解除安裝 panel 的操作。 
5. 對螢幕的引數(解析度)進行初始化。 
6. 將 lcd 存為靜態全域性變數。 
7. 執行 ctrl 中的 sprdfb_dispc_init 初始化函式。 
在 u-boot64/drivers/video/sprdfb/Sprdfb_dispc.c 中的 init 函式 sprdfb_dispc_init 中,設定初始背景顏色等。

至此,完成了 LCD 的載入。

程式碼結構分析

sprdfb_main.c —- 與fbmem.c構成Framebuffer驅動 
sprdfb_panel.c —- Ctrl到I/F驅動和panel驅動的橋接器 
sprdfb_mipi.c —- Mipi介面驅動及為其提供操作介面的DSI驅動 
sprdfb_dispc.c —– DispC驅動

MIPI 介面工作模式介紹

DSI(VideoMode)視訊模式. 
這種工作模式與傳統RGB介面相似,主機需要持續重新整理顯示器。由於不使用專用的資料訊號傳輸同步資訊,控制訊號和RGB資料是以報文的形式通過MIPI匯流排傳輸的。因為主機需要定期重新整理顯示器,顯示器就不需要幀緩衝器。帶RAM的屏一般比不帶RAM的屏要貴一些,對於一些控制成本的方案,選擇屏供應商需要格外關注這個! 
DCS(Command mode)命令模式 
MIPI匯流排控制器使用顯示命令報文來向顯示器傳送畫素資料流。顯示器應該有一個全幀長的幀緩衝器來儲存所有的畫素資料。一旦資料被放在顯示器的幀緩衝器中,定時控制器就從幀緩衝器中取出資料,並自動把它們顯示在螢幕上。MIPI匯流排控制器不需要定期重新整理顯示器。 
兩種模式的優缺點 
在成本和功耗方面,每個工作模式都有優點和缺點。視訊模式顯示架構無須幀緩衝器。然而,主機定期以高速模式傳送DSI視訊報文卻消耗了大量的平均能量。 
在理想情況,當顯示內容不改變時(或不經常改變時),顯示系統的中央處理器就應該切換到低功耗模式,而處理器和顯示器之間的鏈路會在需要的時候啟用。由於主機定期重新整理的需要,部分中央處理器和儲存器介面也需要保持啟用狀態,這可以使系統不會達到最好的功率預算。 
另一方面,命令模式顯示架構允許顯示器直接對整個幀緩衝器進行自重新整理。然而,在顯示器中整合全幀長幀緩衝器總是需要成本的,特別是今天的大多數使用者所需求的高解析度顯示器。這就要求介面晶片有更大的管芯尺寸。顯示器製造商也不得不為每種顯示解析度提供具有特定容量幀緩衝器的顯示控制器。 
對於視訊模式和命令模式顯示架構,通常都需要對顯示控制器的暫存器程式設計來設定相應的顯示解析度、外觀比率和工作模式。MIPI並不定義任何標準協議來訪問這些內部暫存器,因此,不同的顯示器製造商可以定製自己專用的命令集。

在展訊平臺上點亮MIPI介面屏正常顯示需要滿足以下幾條: 
1:確認Lcd的驅動檔案被正常編譯編譯進去,並且lcd 和board name裡面註冊一致。 
2. 必須保證資料能夠正確的傳輸到屏上,一般在讀取ic 的id和初始化設定指令時,都是在mipi的低速(lp)模式下,在初始化完成後,需要切換到高速(hp)狀態下,才能正常的顯示! 
3. 必須保證ic設定的proch和timing,通道,速率正確,屏才可以正常的顯示,一般顯示出現花屏,顯示偏移等問題,通常情況下,就是因為你設定的某些引數不正確,導致顯示異常! 
4:仔細檢查上電同時測量,對於mipi和需要下code的RGB panel需要RST高低高操作,這樣code才生效。注意一般sleep out(0x11)和display on(0x29)之間需要mdelay(120)左右,貌似這個對於大部分panel是必須的。如果這部分延時不夠,會導致屏在進出睡眠或者顯示過程中出現白屏,無法正常的顯示! 
5:最後還要確認是否有framebuffer輸出,要是改動了display這塊的clk很有可能沒有buffer輸出的,可以通過cat 
/dev/graphyics/fb0檢視有沒有輸出字元。 
注:一般wvga以及更高解析度的陪你過通常採用2 line甚至更高的通道數,hvga及以下解析度的屏則通常採用單通道的mipi介面

相關文章