rk3568 芯片非常強大,可以支持的屏幕接口有很多,顯示接口支持可是非常豐富的,
iTOP-rk3568 開發板支持 MIPI 接口的屏幕,接口如下圖所示:
1 屏幕點亮流程
點亮屏幕基本的流程是一致的,一般是背光使能---->背光點亮---->屏幕使能---->reset 引
腳按照指定的時序/波形拉高或者拉低---->初始化序列命令發送。
流程主要是以下幾步
l
需要向屏幕廠商要一些屏幕關鍵參數和資料
l
進行關鍵引腳對應
l
進行設備樹配置
l
進行驅動配置
l
源碼編譯,燒寫鏡像測試
15.2.1關鍵引腳對應
15.2.2屏幕關鍵參數
15.2.3屏幕初始化序列改寫
2根據屏參和硬件設計填寫 dts
這一部分是重點,全部之前的工作全為此處進行准備。我們新建一個 dtsi 文件特意放屏
幕相關的:kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi
然后在 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts 文件中加入這個頭文
件,如下圖所示:
另注意,由於 DTS 文件設計到層層包含(DTS 文件可以包含后綴為.dtsi 的文件,作用就
像 C 語言中的.h 文件),故建議重要配置及板卡特性配置寫到最后一級的 DTS 文件中,防
止由於在較高層級的 dtsi 配置后手誤在后面又進行了配置,導致配置被錯誤覆蓋。
共需要以下幾個重點內容:dsi, route_dsi, backlight, vcc_lcd, dsi_in_vopb,
dsi_in_vopl,vopb。
2.1 dsi節點
mipi 屏幕我們使用 dsi1 接口,所以需要在設備樹里面查找 dsi 節點,如下圖所示:
kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
(瑞芯微寫好的)
kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi (瑞芯微寫好的)
dsi1: dsi@fe070000 {
compatible = "rockchip,rk3568-mipi-dsi";
reg = <0x0 0xfe070000 0x0 0x10000>;
interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_DSITX_1>, <&cru HCLK_VO>, <&video_phy1>;
clock-names = "pclk", "hclk", "hs_clk";
resets = <&cru SRST_P_DSITX_1>;
reset-names = "apb";
phys = <&video_phy1>;
phy-names = "mipi_dphy";
power-domains = <&power RK3568_PD_VO>;
rockchip,grf = <&grf>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
dsi1_in: port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
dsi1_in_vp0: endpoint@0 {
reg = <0>;
remote-endpoint = <&vp0_out_dsi1>;
status = "disabled";
};
dsi1_in_vp1: endpoint@1 {
reg = <1>;
remote-endpoint = <&vp1_out_dsi1>;
status = "disabled";
};
};
};
};
默認的源碼中是配置了 dsi1 節點的,是適配的瑞芯微的屏幕。現在我們要適配迅為的
MIPI 7 寸屏,所以我們在修改之前,要刪掉瑞芯微之前適配的屏幕節點。在下圖的設備樹中
找到&dsi1 以及和 dsi1 相關的注釋掉。
好,現在接下來便可以在 topeet_rk3568_lcds.dtsi 中配置迅為的屏幕了。配置如下:
&dsi1 {
status = "okay";
dsi1_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
reg = <0>;
//供電電壓是 3.3V
power-supply = <&vcc3v3_lcd1_n>;
//設置背光
backlight = <&backlight>;
//reset-gpios 表示屏幕 reset 引腳,拉低,具體的拉高或者拉低要根據內
核配置和時序要求來進行對應的修改
reset-gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>;
//enable-gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>;
//下述配置中有一些延時,reset-delay-ms 是在屏幕初始化過程中,第一次
操作 reset 引腳之前的延時。init-delay-ms,是在屏幕初始化過程中,第一次操作 reset 引腳
之后的延時。
reset-delay-ms = <60>;
enable-delay-ms = <60>;//<35>; //<60>;
prepare-delay-ms = <60>;//<6>; //<60>;
unprepare-delay-ms = <60>;//<0>; //<60>;
disable-delay-ms = <60>;//<20>; //<60>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
//dsi,lanes = <4>;是配置當前 mipi 是幾通道的,需根據屏幕實際情況配置。
dsi,lanes = <4>;
// panel-init-sequence 填寫剛剛改寫好的初始化序列
panel-init-sequence = [
39 00 03 E0 AB BA
39 00 03 E1 BA AB
.................
05 C8 01 11
05 14 01 29
];
//panel-exit-sequence 填寫 display off 序列,一般為兩條,也需要廠家提供。
panel-exit-sequence = [
05 05 01 28
05 78 01 10
];
//這一部分也很重要,是屏幕的一些參數。hactive 和 vactive 就是水平數值的像素,也就是
屏 幕 分 辨 率 了 。 hback-porch,hfront-porch,vback-porch,vfront-porch 按 順 序 簡 寫 為
HBP,HFP,VBP,VFP,這個跟廠家討要后,根據簡寫字母對應即可。這個在之前的章節中已經講解
過了。
disp_timings0: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
//clock-frequency 像素時鍾頻率
//像素時鍾頻率 = (
hactive+hbp+hfp+hsync-len)x (vactive+vbp+vfp+vsync-len)xfps
// 然后保留兩位有效數字(不要四舍五入),后面數據直接填 0 即可。
clock-frequency = <72000000>;
//以下的這些參數在數據手冊中,我們已經查找到了。
hactive = <800>;
vactive = <1280>;
hfront-porch = <48>; //20
hsync-len = <20>;
hback-porch = <48>; //20
vfront-porch = <16>; //10
vsync-len = <6>; //10
vback-porch = <15>; //4
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
//配置 ports
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};
};
};
};
我們使用 dsi1 綁定到 vp1 上,所以 dsi1_in_vp0 節點為 disabled,dsi1_in_vp1 節點為 okay
當 dsi1 使能的時候,video_phy1 要使能,video_phy0 要關閉。設備樹 topeet_rk3568_lcds.dtsi
中添加如下圖所示:
2.2 Backlight
背光常用的有三種情況:
一是 常開。
二是 背光 IC 使能后,輸入 PWM 信號調光。
三是 背光 IC 使能后,通過 FB 獲得反饋自動進行調光。
設備樹里面配置背光。首先根據原理圖,我們知道使用的是 pwm5,
kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi 文件里面 backlight1 節點如下所示:
backlight1: backlight1 {
compatible = "pwm-backlight";
pwms = <&pwm5 0 25000 0>;
brightness-levels = <
0 20 20 21 21 22 22 23
23 24 24 25 25 26 26 27
27 28 28 29 29 30 30 31
.................................................
>;
default-brightness-level = <200>;
};
kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi 設備樹中添加背光節點
&backlight {
status = "okay";
pwm = <&pwm5 0 25000 0>;
};
pwms = <&pwm5 0 25000 0>; 配置 pwm,使用 pwm5,25000 是周期,pwm 為正極性。
brightness-levels 屬性:配置背光亮度數組,一般以值 255 為一個 scale,當 pwm 設置為正
極時,從 0~255 表示背光為正極,占空比從 0%~100%變化,,255~0 為負極性,占空比從
100%~0%變化,當 pwm 設置為負極性時,反之。
default-brightness-level 屬性,時開機時默認背光亮度,范圍是 0~255
2.3 logo 顯示
設備樹 kernel/scripts/dtc/include-prefixes/arm64/rockchip/rk3568.dtsi 中節點如下:
所以我們要使用 route_dsi1 顯示通路,綁定到 vp1 上,修改
kernel/scripts/dtc/include-prefixes/arm64/rockchip/topeet_rk3568_lcds.dtsi 文件,添加如下所
示:
3 Config 配置
RK3568 SDK 下 kernel/arch/arm64/configs/*_defconfig 已經把 LCD 相關的配置設置好了,
如果自己做了修改,修改 kernel/arch/arm64/configs/rockchip_defconfig 配置文件,增加如下
所示:
CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_DRM_PANEL_SIMPLE=y
4燒寫驗證
4.1測試顯示
重新編譯 android 源碼,燒寫鏡像,發現 mipi 屏幕顯示正常。如下圖所示:
4.2 背光亮度調節測試
目前還沒有配置屏幕觸摸,我們可以在開發板上插上鼠標,進入”設置”APP,依次點擊
“顯示”,“亮度”,拖動滑條可以調節亮度。
也可以使用命令行來設置屏幕亮度,數值可以在 0~250 中設置,數字越大,亮度越高。
echo 100 > /sys/class/backlight/backlight/brightness