RK 平台 MIPI 點屏注意事項


2019-10-14

關鍵字:rk3288 MIPI 點屏


rk 平台關於 MIPI 屏幕的點屏流程已經非常完善了,基本上只要確定了硬件沒問題、接線沒問題、屏幕沒問題,再稍稍配置一下 dtsi 里的參數就可以的了。

 

MIPI 點屏流程大致可以概括為以下幾步:

1、確認硬件環境;

2、確認相關接口管腳;

3、配置屏幕背光 dts;

4、配置 MIPI 屏幕參數;

5、屏幕顯示效果調校。

 

1、確認硬件環境

確認硬件環境這個活理論上來說是由硬件人員來提供保證的,大多數軟件人員都不懂這塊的知識,只能相信他人。但他人畢竟是他人,你無法保證他人不會犯迷糊,所以有的時候身為軟件人員,要和硬件打交道的話,會很痛苦。

 

言歸正傳,所謂確認硬件環境,無非就是要確認以下幾點信息:

1、MIPI 排線接口電路正確;

2、板端接口到屏端接口的走線正確;

3、供電符合要求。

保證了以上三點就可以開始軟件點屏了。

 

2、確認相關接口管腳

這個是要根據板端原理圖來確認哪些引腳是接到我們要點的屏幕上去的。

 

例如,通常 rk 的芯片都會有多組視頻信號輸送接口,如 lcd0 ~ lcdx。我們要找到屬於我們的那個管腳。

 

還要找到控制背光開關的管腳。由於背光電流強度是由 pwm 來決定的,所以還要再確認好是哪組 pwm 用於控制我們要點的屏幕。

 

3、配置屏幕背光 dts

直接修改 kernel 的 dts 文件即可。

 

不同板端所使用的 dts 文件通常不一致,所以這步要自行確認自己使用的是哪一個文件。不過這個文件通常都位於以下目錄中:

./kernel/arch/arm/boot/dts/

 

在你的 dts 文件中,主要是要找到 backlight 節點,然后再配置 pwm 與 gpio 信息,如下所示:

    backlight {
        compatible = "pwm-backlight";
        pwms = <&pwm2 0 25000>;
        brightness-levels = <
              ...
              >;
        default-brightness-level = <200>;
        enable-gpios = <&gpio7 GPIO_C6 GPIO_ACTIVE_HIGH>;
    };

其次再將對應的 pwm 節點置為可用狀態:

&pwm2 {
        status = "okay";
};

然后可以關注一下以下節點配置,它表明了這個屏幕的參數被記載的節點名稱,后續初始化屏幕時就會去這里指定的節點里查找信息:

&rk_screen {
     display-timings = <&disp_timings>;
};

最后是將輸送視頻信號的相關功能置為開啟狀態,這個需要參考原理圖才能決定填哪個了:

&lcdc0 {
    status = "okay";
    rockchip,mirror = <NO_MIRROR>;
... }

 

4、配置MIPI屏幕參數

這一步就是配置上一步中提到的 display-timins = <&disp_timings>; 的信息了。

 

通常這個節點的信息會獨立保存在一個文件后綴為 dtsi 的文件中。它在配置好以后是通過前面的 dts 文件 include 進來使用的。

 

這個 dtsi 文件中的信息主要有以下四種節點:

1、disp_mipi_init: mipi_dsi_init 節點;

2、disp_timings: display-timings 節點;

3、disp_mipi_power_ctr: mipi_power_ctr 節點;

4、disp_mipi_init_cmds: screen-on-cmds 節點。

 

disp_mipi_init: mipi_dsi_init

這個節點一般記載有以下信息:

disp_mipi_init: mipi_dsi_init{
    compatible = "rockchip,mipi_dsi_init";
    rockchip,screen_init    = <1>;
    rockchip,dsi_lane        = <4>;
    rockchip,dsi_hs_clk        = <600>;
    rockchip,mipi_dsi_num    = <1>;
};

screen_init 參數表示這塊屏幕是否需要做初始化操作。通常 MIPI 屏幕都是要做的,置 1 表示需要,置 0 表示不需要。

 

dsi_lane 表示屏幕用於傳輸信息的通道數量。這個要根據屏幕規格書業確認,例如:

 

這就表示這塊 MIPI 屏幕有 4 組數據線,所以填 4 就好。

 

dsi_hs_clk 表示總時鍾數,單位為 MHZ。

 

mipi_dsi_num 一般填 1 就好。

 

disp_timings: display-timings

這個節點中的內容關乎於屏幕的參數信息。它的結構如下示例所示:

disp_timings: display-timings {
    native-mode = <&timing0>;
    compatible = "rockchip,display-timings";
    timing0: timing0 {
        screen-type = <SCREEN_MIPI>;
        out-face    = <OUT_P666>;
        clock-frequency = <50000000>;
        
        hactive = <800>;
        vactive = <1280>;
        
        hback-porch = <32>;
        hfront-porch = <32>;
        
        vback-porch = <32>;
        vfront-porch = <22>;
        
        hsync-len = <4>;
        vsync-len = <4>;
        
        hsync-active = <0>;
        vsync-active = <0>;
        
        de-active = <0>;
        pixelclk-active = <0>;
        
        swap-rb = <0>;
        swap-rg = <0>;
        swap-gb = <0>;
    };
    
};

這個節點的信息含義不作過多解釋,這里僅關注如何填值。

 

這塊節點的信息基本要從屏幕規格書中來。

screen_type 可填的值有:SCREEN_MIPI , SCREEN_DUAL_MIPI。

out-face 可填的值有:OUT_P565 , OUT_P666 , OUT_P888。

后面的信息就要查閱屏幕規格書,通常可以找到 INPUT_SIGNAL_TIMING 章節,其中通常會記載有類似信息:

 

 

clock-frequency 就是上圖中的 DCLK frequency 中的數據。這些表格中,我們一般取 Typ 列的值來使用。

hactive 與 vactive 就是屏幕分辨率,這個信息對應於上圖表中的 Horizontal Display Area 與 Vertical Display Area。

hback-porch 對應於 Hs Back Porch。

hfront-porch 對應於 Hs Front Porch。

vback-porch 對應於 Vs Back Porch。

vfront-porch 對應於 Vs Front Porch。

hsync-len 對應於Hs pulse width。

vsync-len 對應於 VS Pulse Width。

 

通常填好這幾個參數就可以了。

 

disp_mipi_power_ctr: mipi_power_ctr

這個節點記載 MIPI 屏幕的重置腳與使能腳的信息。根據實際情況配置即可。

disp_mipi_power_ctr: mipi_power_ctr {
    compatible = "rockchip,mipi_power_ctr";
    mipi_lcd_rst:mipi_lcd_rst{
        compatible = "rockchip,lcd_rst";
        rockchip,gpios = <&gpio7 GPIO_B4 GPIO_ACTIVE_HIGH>;
        rockchip,delay = <100>;
    };
    mipi_lcd_en:mipi_lcd_en {
        compatible = "rockchip,lcd_en";
        rockchip,gpios = <&gpio0 GPIO_A2 GPIO_ACTIVE_HIGH>;
        rockchip,delay = <100>;
    };
};

 

disp_mipi_init_cmds: screen-on-cmds

這個節點中記載的是屏幕的初始化指令。指令內容通常需要廠家提供。廠家給過來的指令有可能不是直接適配到 RK 平台的,需要做轉換。

 

那如何轉換呢?我這里直接援引某位大神博客(https://blog.csdn.net/sdkdlwk/article/details/78698494)中的內容了,如下圖所示:

 

 

我這里需要額外強調一點:0x29 和 0x39 是有區別的,不可通用,如果你發現自己的指令內容沒有錯,但就是點不起來,那么可以嘗試一下更改 0x29 系或 0x39 系看看效果。

 

5、屏幕顯示效果調校

如果按照上面的配置能正常顯示自然是最好,但也不能排除仍然無法顯示,或者是顯示的效果不好的。這種情況就需要調校上一步中的參數信息了。

 

 

首先是屏幕初始化指令,指令一定要正確,這里說的正確除了指令內容正確外還得保證指令成功寫了出去。有些屏幕它的單條初始化指令是很長的,而 RK 默認的單條指令長度又有限制,當指令內容過長時,就會導致段錯誤的發生,直接引起無法開機。

 

如何解決這個問題呢?答案是增大系統中保存指令的空間。在哪里改?在 uboot 中。

./u-boot/drivers/video/screen/lcd_mipi.c

在這份代碼中會去解析 dtsi 中的指令,並存於一個數組中,直接將數組長度增大即可,如下圖所示:

 

當然,不敢保證所有人的代碼結構都和筆者的是一樣的,如果你的代碼中並沒有這樣一個數組,那么還可以改這個結構體:

./u-boot/drivers/video/transmitter/mipi.dsi.h

在這個頭文件中有一個結構體 struct dcs_cmd,將它里面的 cmds 數組的長度更改一下即可:

 

如果改了這個仍然不起效果,那可能你的代碼是被改動過的。這個時候就需要自行跟蹤源碼,看看它究竟把這些初始化指令保存到哪里去的。一般直接跟蹤上面提到的 lcd_mipi.c 中的 rk_mipi_screen_init_dt 函數就可以的了。

 

 

其次是時鍾信息。時鍾不正確會導致顯示不出來內容或者顏色有偏差。這里說的時鍾包含:rockchip,dsi_hs_clk 與 clock-frequency。尤其是 dsi_hs_clk 節點,它代表總時鍾,clock-frequency 代表單通道的時鍾,因此前者時鍾總是要比后者時鍾大。關於這個關系的確定,我再貼上另一個大神博客(https://blog.csdn.net/u012715694/article/details/51751006)中的內容,如下圖所示:

 

 

 

最后還得關注下disp_timins 節點中的信息,它們也是會直接影響到顯示效果的:

 

 

實在不行的話,就用最笨的辦法,一個一個去調去試,看看哪個出來的效果最好。當然,如果你有專業的理論知識可以直接計算出來,那就最好不過了。筆者很遺憾,筆者沒有!

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM