Android MIPI轉LVDS顯示屏除錯--- bootloader階段顯示(4)
《80_NU323_3_Multimedia_Driver_Development_and_Bringup_Guide___Display.pdf》提到Once Kernel bringup is done, perform the following steps for little kernel (LK) bringup.,也就是說推薦先除錯kernel,但我們還是先介紹lk。
- 顯示屏是command還是video mode
我們的顯示屏是video mode
2. 建立panel(顯示屏)標頭檔案
到device\qcom\common\display\tools目錄下,找到此目錄下類似的xml檔案,比如panel_nt35596_1080p_video.xml,基於此檔案改為和我們顯示屏的,比如改為panel_lm215w_lvds_1080p_video.xml,此xml檔案裡的內容細節這裡不介紹了。
Xml可生成對應的.h和.dtsi檔案,生成的方法如下:
perl parser.pl panel_lm215w_lvds_1080p_video.xml panel
但是在生成標頭檔案的時候,沒有生成panel_config結構體的mode_gpio_state和slave_panel_node_id對應的值,也沒有生成lane_configuration結構體下force_clk_lane_hs成員的值。見下圖紅色部分,只能是我們手動增加,或是修改parser.pl檔案來生成對應的
在parser.pl和xml中增加ModeGPIOState和SlavePanelNodeID(這兩個名稱是我自己命名的),這樣用perl parser.pl panel_lm215w_lvds_1080p_video.xml panel生成的標頭檔案就可以了。
Xml檔案的配置,詳細參考文件
《80_NU323_3_Multimedia_Driver_Development_and_Bringup_Guide___Display.pdf》,xml中一些引數的生成需要用到《80-NH713-1_G_DSI_Timing_Parameters.xlsm》,比如我們要根據panel的引數來填寫
下面只介紹幾項
2.1 PanelTimings
An array of length 12 that specifies the PHY timing settings for the panel.
填寫好引數後,見excel表格的DSI PHY timing setting子表格
執行CTRL+J and CTRL+K後重新計算生成相關的,如下
PanelTimings對應DSI PHY registers的值,如下:
<PanelTimings>"0xD6, 0x32, 0x22, 0x00, 0x62, 0x66, 0x26, 0x36, 0x28, 0x03, 0x04, 0x00"
2.2 TclkPost和TClkPre
(1)TClkPost
DSI timing control clock post value
(2)TclkPre
DSI timing control clock pre value
這兩個值對應T_CLK_POST和T_CLK_PRE,
</PanelTimings>
<DSIMDPTrigger>0</DSIMDPTrigger>
<DSIDMATrigger>4</DSIDMATrigger>
<TClkPost>0x03</TClkPost>
<TClkPre>0x28</TClkPre>
2.3 ResetSequence
Reset sequence using ResetGPIO with pulse width.這是顯示屏使用的reset引腳的控制時序圖,我們本次設計的SN65DSI84沒有用到reset,我以之前專案用的顯示屏panel規格書說明下
這是panel reset引腳的時序圖,所以
<ResetSequence>
<PinState1>1</PinState1>
<PulseWidth1>20</PulseWidth1>
<PinState2>0</PinState2>
<PulseWidth2>2</PulseWidth2>
<PinState3>1</PinState3>
<PulseWidth3>20</PulseWidth3>
<EnableBit>2</EnableBit>
</ResetSequence>
這些值我還沒有改,需要根據實際panel來填寫,具體需要幾個階段,根據panel的規格書來定,比如這裡是3個階段
這裡的EnableBit是用於表示reset GPIO作為輸入還是輸出的,輸入對應0,輸出對應2,這個時序在target_panel_reset()中會用到
2.4 標頭檔案結構體lane_configuration的force_clk_lane_hs
這個表示是否強制DSK CLK工作在HS(高速)模式,一般情況下command panel此值為0,表示工作在LP(low power)模式;video panel此值為1,表示工作在HS模式。
因為我們硬體設計,SN65DSI84採用的是DSI CLK作為時鐘源,SN65DSI84的DSI Lane合併時需要在HS模式,所以我們這裡force_clk_lane_hs=1,如果為0則黑屏
- 初始化流程
aboot_init()--->sn65dsi84_Init()+target_display_init()--->gcdb_display_init()--->oem_panel_select()--->init_panel_data()
下面重點說明下我們修改涉及的部分:
3.1 sn65dsi84_Init()
這裡主要是對SN65DSI84初始化,主要的內容如下:
3.1.1 涉及到的GPIO控制
3.1.2 通過I2C對SN65DSI84寫暫存器,初始化
這涉及到I2C讀寫,有兩種實現方式:
(1)GPIO模擬I2C
這裡我省略到一部分暫存器,中間實際是有其他暫存器的。
(2)採用CPU的I2C匯流排協議
Lk下Msm8937對應的目錄是msm8952,查看了原始碼,lk階段8952沒有使用i2c,但msm8916下有配置i2c和使用i2c的地方,比如oem_panel.c下:
那我們基於8916的用法來在8952下新增的,需要根據採用的I2C對應的GPIO口來確定是哪個BLSP和QUP,比如我們採用SDA---GPIO6,SCL---GPIO7,最後確定是對應BLSP1和QUP_ID_1,詳細見連結
3.2 oem_panel_select()
確保panel_id的值為我們增加的顯示屏對應的,這裡還呼叫init_sn65dsi84()來對SN65DSI84上電控制和通過I2C寫初始化引數。
3.3 init_panel_data()
把xml檔案生成的mipi dsi相關引數來初始化panelstruct結構體
參考連結:
toshiba TC358764 mipi 轉LVDS屏除錯