MIPI (Mobile Industry Processor Interface) 是2003年由ARM, Nokia, ST ,TI等公司成立的一个联盟,目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性。MIPI设备接口分为两种:摄像头接口CSI(Camera Serial Interface)和显示接口DSI(Display Serial Interface)。
提示:rk3568 设计时预留两路MIPI-DSI,其中一路与lvds复用,两路可同时使用,即支持8lane mipi屏。
a) rk3568 适配 mipi 屏幕
b) rk3568 适配 8lane mipi 屏幕
c) rk3568 适配过程异常情况
经过翻阅屏幕手册,屏幕亮起前须适配屏的 LCD_VDD、LCD_STABY、LCD_RST 和背光的使能 IO、PWM 信号。
仔细核对原理图发现控制信号与屏幕对应关系:
MIPI 4 lanes --> MIPI_DSI_TX0
LCD_RST --> GPIO3_D1
LCD_STABY --> GPIO3_D2
LCD_EN_H --> GPIO3_D3
发现LCD_EN_H 为供电控制,LCD_STABY实则为屏幕使能控制。
背光PWM信号,pwm4 与 rk3568-evb.dtsi中声明 backlight 相同;只是增加一个背光控制GPIO2_D5。
当前设备树引用 rk3568-evb.dtsi,恰好在其中有声明 vcc3v3_lcd0_n 和 backlight;仅仅作简单的覆写即可。rk3568 的 MIPI-DSI0 屏需要同时启用 dsi0、video_phy0、vp1_out_dsi0(本篇使用 vop 中 vp1,vp0预留给HDMI)。需要开机显示 logo图片则要额外配置 route_dsi0。
MIPI 屏一般需要初始化代码和屏参,这块屏幕很好无例外。屏供应厂商提供的屏幕相关资料时同时提供屏幕手册和初始化代码;初始化代码大多为点屏幕治具使用,经过简单转化即可在rk3568上应用。
&backlight {
enable-gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
};
&vcc3v3_lcd0_n {
gpio = <&gpio3 RK_PD3 GPIO_ACTIVE_HIGH>;
};
/*
* video_phy0 needs to be enabled
* when dsi0 is enabled
*/
&dsi0 {
status = "okay";
};
&dsi0_in_vp0 {
status = "disabled";
};
&dsi0_in_vp1 {
status = "okay";
};
&dsi0_panel {
power-supply = <&vcc3v3_lcd0_n>;
enable-gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_LOW>;
panel-init-sequence = [
15 05 02 8F A5
15 14 02 01 00
15 05 02 8F A5
39 00 03 83 AA 11
15 00 02 A9 4B
39 00 03 83 00 00
15 00 02 8F 00
05 00 01 11
05 05 01 29
];
panel-init-sequence = [
05 00 01 28
05 00 01 10
};
disp_timings0: display-timings {
native-mode = <&dsi0_timing0>;
dsi0_timing0: timing0 {
clock-frequency = <150000000>;
hactive = <1200>;
hfront-porch = <80>;
hback-porch = <60>;
hsync-len = <1>;
vactive = <1920>;
vfront-porch = <35>;
vback-porch = <25>;
vsync-len = <1>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
};
接下来是 video_phy0 和 route_dsi0。根据描述此时需要开启 video_phy0。
&video_phy0 {
status = "okay";
};
&video_phy1 {
status = "disabled";
};
&route_dsi0 {
status = "okay";
connect = <&vp1_out_dsi0>;
};
到此DSI-0 设备树匹配基本完成,如有无法点亮可查看 章节2 调试过程异常情况。
当前设备树引用 rk3568-evb.dtsi,恰好在其中有声明 vcc3v3_lcd1_n 和 backlight1;仅仅作简单的覆写即可。rk3568 的 MIPI-DSI1 屏需要同时启用 dsi1、video_phy1、vp1_out_dsi1(本篇使用 vop 中 vp1,vp0预留给HDMI)。需要开机显示 logo图片则要额外配置 route_dsi1。
DSI1与DSI0使用相同的屏幕,屏参和初始化代码与上一个块相同。仔细核对原理图控制信号与屏幕对应关系如下:
MIPI 4 lanes --> MIPI_DSI_TX1
LCD_RST --> GPIO4_C2
LCD_STABY --> GPIO4_C5
LCD_EN_H --> GPIO4_C6
发现LCD_EN_H 为供电控制,LCD_STABY实则为屏幕使能控制。
背光PWM信号,pwm5 与 rk3568-evb.dtsi中声明 backlight 相同;只是增加一个背光控制GPIO2_D6。
&backlight {
enable-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;
};
&vcc3v3_lcd0_n {
gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
};
/*
* video_phy0 needs to be enabled
* when dsi0 is enabled
*/
&dsi0 {
status = "okay";
};
&dsi0_in_vp0 {
status = "disabled";
};
&dsi0_in_vp1 {
status = "okay";
};
&dsi0_panel {
power-supply = <&vcc3v3_lcd0_n>;
enable-gpios = <&gpio4 RK_PC5 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>;
panel-init-sequence = [
15 05 02 8F A5
15 14 02 01 00
15 05 02 8F A5
39 00 03 83 AA 11
15 00 02 A9 4B
39 00 03 83 00 00
15 00 02 8F 00
05 00 01 11
05 05 01 29
];
panel-init-sequence = [
05 00 01 28
05 00 01 10
};
disp_timings1: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
clock-frequency = <150000000>;
hactive = <1200>;
hfront-porch = <80>;
hback-porch = <60>;
hsync-len = <1>;
vactive = <1920>;
vfront-porch = <35>;
vback-porch = <25>;
vsync-len = <1>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
};
接下来是 video_phy1 和 route_dsi1。根据描述此时需要开启 video_phy1。
&video_phy0 {
status = "disabled";
};
&video_phy1 {
status = "okay";
};
&route_dsi1 {
status = "okay";
connect = <&vp1_out_dsi1>;
};
到此DSI-1 设备树匹配基本完成,如有无法点亮可查看 章节2 调试过程异常情况。
rk3568 硬件设计2组 DSI,单屏模式可分别点亮2个屏幕;也可双通道模式点亮一块屏幕或者左右两块相同屏幕。
设配设备树时需要增加对dsi0的引用,支持此种模式还有rk3288/rk3399/rk3566。
&dsi0 {
rockchip,dual-channel = <&dsi1>;
};
&dis1 {
status = "okay";
};
注意:引用DSI-1同样需要启用 video_phy1。
3) 双通道双屏幕(1~4lane MIPI 双屏)
每个通道分别接相同的屏,组合成 dual-channel 接口 MIPI 屏,panel0 显示左半屏,panel1 显示右半屏。需要注意上电时须和初始化代码。
设备树配置与双通道模式相同。
4) 双链路模式
RK3566/RK3568 独立的 MIPI_PHY_TX0 和 MIPI_PHY_TX1,panel 0/1没有相同屏幕限制。但是rk3399 因 MIPI_PHY0/1共用PLL锁相环始终,需要两块屏幕使用相同的 mipi总线速率。调试时这点有点费脑细胞。
此种模式下与分别点亮度两块屏幕,唯一区别就是多占用一路 VP。VOP需要如下配置:
&video_phy0 {
status = "okay";
};
&video_phy1 {
status = "okay";
};
&route_dsi0 {
status = "okay";
connect = <&vp0_out_dsi0>;
};
&route_dsi1 {
status = "okay";
connect = <&vp1_out_dsi1>;
};
与eDP屏幕相比增加MIPI下载初始化代码,上电时许要求更为严苛。出现问题硬件电路检查必不可少哦。首先是屏幕各个电压是否正常,然后上电过程无电源塌陷、时许是否符合要求;最后是上电时许和总线信号。硬件核验完成且异常基本都可正常点亮屏幕,除非屏幕损坏或者SOC mipi模块损坏。接下来分享几个简单现象。
这种情况处理起来比较简单,查硬件上电时许就可以发现问题;或者休眠唤醒时对比GPIO状态。
adb shell
su
cat /d/gpio
如果开机后立即查看GPIO状态,发现 LCD-RST 是低电平,而经过休眠唤醒恢复正常。
LCD-RST 所在那组GPIO电源域配置出错,可根据"IO-Domain"文档详细排查。
内核设备树排查请参考核查原理图,适配DSI连接MIPI屏
4. 核查 mipi 信号 ESD 是否异常,或短路
万用表排查ESD两端对比电阻,都接近0恭喜ESD损坏。
可以用简单粗暴方法,直接拆除MIPI差分信号上的 ESD。
5. 屏幕已烧
可拿同款其它样品,或者换到正常主板上做交叉验证。
开机时黑屏一段时间,然后是正常开机动画。这种情况缺少类似如下配置:
&route_dsi0 {
status = "okay";
connect = <&vp1_out_dsi0>;
};
出现这种情况,排除上电时许和排线接触不良;很大概率时屏参不对,可找屏幕厂家核对参数。
a) 每种表象背后都有原因,或一种或多种;仔细核查会发现
b) mipi 信号是否不良时,使用参数设定mipi总线速率 rockchip,lane-rate = <500>;
c) LCD的使能、复位信号控制GPIO需要匹配电平,屏幕电源域要与GPIO电源域电压相同
懂得经验总结积累,方可不重蹈覆辙。