rk3568 Android11/12 适配 mipi 屏
MIPI (Mobile Industry Processor Interface) 是2003年由ARM, Nokia, ST ,TI等公司成立的一个联盟,目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性。MIPI设备接口分为两种:摄像头接口CSI(Camera Serial Interface)和显示接口DSI(Display Serial Interface)。
- MIPI 不仅能够传输视频数据,还能传输控制指令;
- MIPI DSI 接口是按照特定的握手顺序和指令规则传输屏幕控制所需的视频数据和控制数据;
- MIPI 接口的模组,相较于并口具有速度快,传输数据量大,功耗低,抗干扰好。并且专门为移动设备进行的优化,因而更适合手机和智能平板的连接。
提示:rk3568 设计时预留两路MIPI-DSI,其中一路与lvds复用,两路可同时使用,即支持8lane mipi屏。
文章目录
- rk3568 Android11/12 适配 mipi 屏
- 圈重点 看想学
- 1. rk3568 适配mipi屏
- 1.1 核查理图,适配 DSI-0连接MIPI屏
- 1.2 核查理图,适配 DSI-1连接MIPI屏
- 1.3 适配 8lane MIPI屏
- 2 调试过程异常情况
- 2.1 开机只亮背光,休眠唤醒后正常显示
- 2.2 开机只亮背光,休眠唤醒后仍然黑屏
- 2.3 开机无 logo
- 2.4 屏幕闪烁、偏位
- Tips
- 总结
圈重点 看想学
a) rk3568 适配 mipi 屏幕
b) rk3568 适配 8lane mipi 屏幕
c) rk3568 适配过程异常情况
1. rk3568 适配mipi屏
经过翻阅屏幕手册,屏幕亮起前须适配屏的 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。
1.1 核查理图,适配 DSI-0连接MIPI屏
当前设备树引用 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 调试过程异常情况。
1.2 核查理图,适配 DSI-1连接MIPI屏
当前设备树引用 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 调试过程异常情况。
1.3 适配 8lane MIPI屏
rk3568 硬件设计2组 DSI,单屏模式可分别点亮2个屏幕;也可双通道模式点亮一块屏幕或者左右两块相同屏幕。
- 单通道模式(1~4 lane MIPI 单屏)
- 双通道模式(5~8lane MIPI 单屏)
设配设备树时需要增加对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>;
};
2 调试过程异常情况
与eDP屏幕相比增加MIPI下载初始化代码,上电时许要求更为严苛。出现问题硬件电路检查必不可少哦。首先是屏幕各个电压是否正常,然后上电过程无电源塌陷、时许是否符合要求;最后是上电时许和总线信号。硬件核验完成且异常基本都可正常点亮屏幕,除非屏幕损坏或者SOC mipi模块损坏。接下来分享几个简单现象。
2.1 开机只亮背光,休眠唤醒后正常显示
这种情况处理起来比较简单,查硬件上电时许就可以发现问题;或者休眠唤醒时对比GPIO状态。
adb shell
su
cat /d/gpio
如果开机后立即查看GPIO状态,发现 LCD-RST 是低电平,而经过休眠唤醒恢复正常。
LCD-RST 所在那组GPIO电源域配置出错,可根据"IO-Domain"文档详细排查。
2.2 开机只亮背光,休眠唤醒后仍然黑屏
- 核查各路供电电压:MIPI_AVDD_1V8、MIPI_AVDD_0V9、vdd_lcd、avdd_lcd;
如果发现异常供电,可在设备树中修正或者硬件修复。 - 核查GPIO状态:GPIO 申请是否正常,GPIO 是否可控。
核查方法与 2.1 中相同,对比 /d/gpio 生情编号和休眠唤醒前后GPIO高低电平变化。如GPIO未被申请,需要核查设备树是否正确填写申请GPIO;被其它功能复用在内核 dmesg 信息中会出现 GPIO 申请异常的错误提示。
出现复用就要根据DTS排查,去掉被复用的位置。 - 核查 video_phy 是否正常开启
内核设备树排查请参考核查原理图,适配DSI连接MIPI屏
4. 核查 mipi 信号 ESD 是否异常,或短路
万用表排查ESD两端对比电阻,都接近0恭喜ESD损坏。
可以用简单粗暴方法,直接拆除MIPI差分信号上的 ESD。
5. 屏幕已烧
可拿同款其它样品,或者换到正常主板上做交叉验证。
2.3 开机无 logo
开机时黑屏一段时间,然后是正常开机动画。这种情况缺少类似如下配置:
&route_dsi0 {
status = "okay";
connect = <&vp1_out_dsi0>;
};
2.4 屏幕闪烁、偏位
出现这种情况,排除上电时许和排线接触不良;很大概率时屏参不对,可找屏幕厂家核对参数。
Tips
a) 每种表象背后都有原因,或一种或多种;仔细核查会发现
b) mipi 信号是否不良时,使用参数设定mipi总线速率 rockchip,lane-rate = <500>;
c) LCD的使能、复位信号控制GPIO需要匹配电平,屏幕电源域要与GPIO电源域电压相同
总结
懂得经验总结积累,方可不重蹈覆辙。