1. 程式人生 > >Android MIPI轉LVDS顯示屏除錯--- bootloader階段顯示(4)

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。

  1. 顯示屏是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則黑屏

  1. 初始化流程

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屏除錯