在瑞芯微Rockchip平台上做 MIPI DSI屏幕适配,几乎是每个嵌入式工程师都绕不开的一课:原理图信号怎么看、设备树节点怎么配、驱动代码从哪下手、安卓主屏为什么黑着但内核log却正常……问题往往卡在"差一层没打通"。

为此,我们基于RK3576开发板(触觉智能Purple Pi OH2),以Android14系统为例,整理出这份从原理图到屏幕点亮的完整实战指南,把MIPI DSI显示链路上每一个关键节点都拆开讲透。

受篇幅所限,全文分上下两篇连载:

  • 👉上篇内容聚焦"打地基":硬件概述、MIPI DSI基础概念、原理图分析、RK3576 显示子系统架构、设备树配置详解;

  • 👉下篇内容聚焦"上手":Panel/DSI Host 驱动分析、Android14显示配置、不同面板移植方法、调试与问题排查。

建议收藏,对着板子边读边调,点亮你的第一块屏。

1.硬件概述

  • Purple Pi OH2开发板

Purple Pi OH2是基于瑞芯微RK3576 SoC设计的开发板,也是作为触觉智能RK3576核心板SOM7609的评估板,核心规格如下:

项目

规格

SoC

Rockchip RK3576

CPU

4×Cortex-A72 + 4×Cortex-A53

GPU

Mali-G52 MC3

NPU

6 TOPS

RAM

4GB/8GB/16GB LPDDR4/LPDDR5

存储

eMMC 5.1 + Micro SD+M.2

显示接口

MIPI DSI(4-lane)、HDMI2.1、DP1.4(USB-C Alt Mode)

显示分辨率

最高4K@120fps(HDMI2.1)、MIPI DSI支持1200×1920等

  • RK3576的显示能力

RK3576显示控制器核心能力:

•1个主VOP(视频输出处理器)、1个轻量VOPL

•最多4路显示管道:VP0/VP1/VP2/VOPL

•兼容MIPI DSI(V1.3,支持DSI2)、HDMI2.1、eDP1.3、DP1.4、RGB/LVDS并行接口

•支持ARC音频同步

•支持双屏异显、三屏异显


  • 显示接口路由

VOP管线可自由路由至各类显示接口,本开发板MIPI DSI默认绑定VP1通道:

图片

2.MIPI DSI基础概念

  • 什么是MIPI DSI?

MIPI DSI(Display Serial Interface)是MIPI联盟推出的高速串行显示接口标准,采用差分信号传输,具备高速、低功耗、抗干扰强的特性。

  • DSI物理层(D-PHY)

底层基于MIPI D-PHY,核心组成:

1.差分信号:D_P、D_N成对传输

2.专用时钟通道、1~4组可选数据通道

3.两种工作模式

•HS高速模式:传输像素数据,差分电压约200mV

•LP低功耗模式:下发控制指令,单端电压0~1.2V

  • DSI像素格式

格式

标识符

说明

RGB888

MIPI_DSI_FMT_RGB888

24bpp,项目默认使用

RGB666

MIPI_DSI_FMT_RGB666

18bpp松散排列

RGB666_PACKED

MIPI_DSI_FMT_RGB666_PACKED

18bpp紧凑排列

RGB565

MIPI_DSI_FMT_RGB565

16bpp

本开发板默认配置:RGB888 24位色、4通道传输。

  • DSI视频模式(Video Mode)

实时流式传输像素画面,分3种子模式:

1.Non-Burst Sync Pulses:独立HSYNC/VSYNC脉冲同步

2.Non-Burst Sync Events:同步事件包,无脉冲

3.Burst Mode:消隐区间全速传输,本项目采用

  • DSI命令模式(Command Mode)

通过DCS显示指令集控制屏幕寄存器,带GRAM液晶屏常用;本板卡画面传输使用视频突发模式,屏幕初始化/熄屏流程下发DCS命令。

  • DSI命令类型速查

设备树panel-init-sequence首字节区分指令类型:

首字节(hex)

类型

宏定义

05

DCS短写(无参数)

MIPI_DSI_DCS_SHORT_WRITE

15

DCS短写(单参数)

MIPI_DSI_DCS_SHORT_WRITE_PARAM

39

DCS长写

MIPI_DSI_DCS_LONG_WRITE

03

通用短写(无参数)

-

13

通用短写(单参数)

-

29

通用长写

-

  • 标准初始化/退出序列示例

    panel-init-sequence = [
        05 78 01 11    # 退出睡眠,延时120ms
        05 14 01 29    # 点亮屏幕,延时20ms
    ];
    panel-exit-sequence = [
        05 00 01 28    # 关闭画面输出
        05 00 01 10    # 进入睡眠
    ];

    • 字节指令格式说明

    [指令类型] [延时ms] [参数长度] [命令/参数]

    •Long Write格式:39 [延时] [数据长度] [指令] [载荷...]

    图片

    3.原理图分析

    • 原理图分页总览

    图片

    • DSI接口信号链路

    图片

    • 关键硬件信号详解


    屏幕复位LCD_RSTB:

    •引脚:GPIO0_D3,复用多功能PAD

    •电平逻辑:低电平复位,板载3.3V上拉,串联22Ω匹配电阻

    •DTS配置:reset-gpios = <&gpio0 RK_PD3 GPIO_ACTIVE_LOW>;


    背光PWM控制LCD_BL_PWM:

    •引脚:GPIO0_D2,复用PWM1_CH5_M0

    •PWM周期25000ns,对应40kHz频率,默认亮度200/255级

      backlight: backlight {
          compatible = "pwm-backlight";
          pwms = <&pwm1_6ch_5 0 25000 0>;
          brightness-levels = <0 20 21 ... 255>;
          default-brightness-level = <200>;
      };

      面板供电链路:

      图片

      背光LED由3.3V经过接口VCC_LEDA/VCC_LEDK供电,部分面板自带片上LDO。

      • 触摸电路(GT911)

      •触控IC:汇顶GT911

      •I2C总线:i2c0,7位地址0x14

      •中断引脚:GPIO0_C5,低电平触发

      •复位引脚:GPIO0_C4,高电平复位

      图片

      4. RK3576显示子系统架构

      • 软件分层总览

      图片

      • VOP管道(CRTC)

      RK3576双VOP架构:

      1.主VOP:支持4K、多图层、AFBC压缩

      2.VOPL轻量处理器:适配小分辨率副屏
       

      管道分配惯例:

      •VP0:HDMI/DP主屏

      •VP1:MIPI DSI/eDP(本开发板使用)

      •VP2:RGB/LVDS副屏

      •VOPL:低功耗小屏、自刷新面板

      • 显示路由配置逻辑

      路由节点定义VP与显示控制器绑定关系,DSI固定绑定VP1:

        display_subsystem: display-subsystem {
            route {
                route_dsi: route-dsi {
                    status = "disabled";
                    connect = <&vp1_out_dsi>;
                    logo,uboot = "logo.bmp";
                    logo,kernel = "logo_kernel.bmp";
                    logo,mode = "center";
                };
                route_hdmi: route-hdmi {
                    connect = <&vp0_out_hdmi>;
                };
            };
        };

        • 完整数据流

        图片

        图片

        5.设备树配置详解

        • DTS文件层级依赖

        图片

        • SoC底层DSI控制器(rk3576.dtsi)

          dsi: dsi@27d80000 {
              compatible = "rockchip,rk3576-mipi-dsi2";
              reg = <0x0 0x27d80000 0x0 0x10000>;
              interrupts = <GIC_SPI 345 IRQ_TYPE_LEVEL_HIGH>;
              clocks = <&cru PCLK_DSIHOST0>, <&cru CLK_DSIHOST0>;
              clock-names = "pclk", "sys_clk";
              resets = <&cru SRST_P_DSIHOST0>;
              reset-names = "apb";
              power-domains = <&power RK3576_PD_VO0>;
              phys = <&mipidcphy0>;
              phy-names = "dcphy";
              rockchip,grf = <&vo0_grf>;
              #address-cells = <1>;
              #size-cells = <0>;
              status = "disabled";
              ports {
                  #address-cells = <1>;
                  #size-cells = <0>;
                  dsi_in: port@0 {
                      reg = <0>;
                      #address-cells = <1>;
                      #size-cells = <0>;
                      dsi_in_vp0: endpoint@0 { reg = <0>; remote-endpoint = <&vp0_out_dsi>; status = "disabled"; };
                      dsi_in_vp1: endpoint@1 { reg = <1>; remote-endpoint = <&vp1_out_dsi>; status = "disabled"; };
                      dsi_in_vp2: endpoint@2 { reg = <2>; remote-endpoint = <&vp2_out_dsi>; status = "disabled"; };
                      dsi_in_vopl: endpoint@3 { reg = <3>; remote-endpoint = <&vopl_out_dsi>; status = "disabled"; };
                  };
              };
          };

          核心字段说明:

          •phys:绑定MIPI D-PHY物理层

          •power-domains:VO0电源域,DSI工作必须上电

          •dsi_in_vp1:板级文件启用,绑定VP1输出管道

          • 板级MIPI面板完整DTS配置(核心)

            #include <dt-bindings/gpio/gpio.h>
            #include <dt-bindings/pwm/pwm.h>
            #include <dt-bindings/pinctrl/rockchip.h>
            #include <dt-bindings/display/drm_mipi_dsi.h>
            #include <dt-bindings/display/rockchip_vop.h>
            /{
                backlight: backlight {
                    compatible = "pwm-backlight";
                    pwms = <&pwm1_6ch_5 0 25000 0>;
                    brightness-levels = <0 20 21 ... 255>;
                    default-brightness-level = <200>;
                };
            };
            &pwm1_6ch_5 {
                status = "okay";
            };
            &dsi {
                status = "okay";
                dsi_panel: panel@0 {
                    status = "okay";
                    compatible = "simple-panel-dsi";
                    reg = <0>;
                    backlight = <&backlight>;
                    reset-gpios  = <&gpio0 RK_PD3 GPIO_ACTIVE_LOW>;
                    reset-delay-ms = <10>;
                    enable-delay-ms = <10>;
                    prepare-delay-ms = <10>;
                    unprepare-delay-ms = <10>;
                    disable-delay-ms = <60>;
                    init-delay-ms = <60>;
                    width-mm = <68>;
                    height-mm = <121>;
                    dsi,flags = <(MIPI_DSI_MODE_VIDEO |
                                  MIPI_DSI_MODE_VIDEO_BURST |
                                  MIPI_DSI_MODE_LPM |
                                  MIPI_DSI_MODE_NO_EOT_PACKET)>;
                    dsi,format = <MIPI_DSI_FMT_RGB888>;
                    dsi,lanes  = <4>;
                    panel-init-sequence = [
                        05 78 01 11
                        05 14 01 29
                    ];
                    panel-exit-sequence = [
                        05 00 01 28
                        05 00 01 10
                    ];
                    disp_timings0: display-timings {
                        native-mode = <&dsi_timing0>;
                        dsi_timing0: timing0 {
                            clock-frequency = <150000000>;
                            hactive = <1200>;
                            vactive = <1920>;
                            hback-porch = <120>;
                            hfront-porch = <10>;
                            vback-porch = <10>;
                            vfront-porch = <14>;
                            hsync-len = <24>;
                            vsync-len = <20>;
                            hsync-active = <0>;
                            vsync-active = <0>;
                            de-active = <0>;
                            pixelclk-active = <0>;
                        };
                    };
                    ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        port@0 {
                            reg = <0>;
                            panel_in_dsi: endpoint {
                                remote-endpoint = <&dsi_out_panel>;
                            };
                        };
                    };
                };
                ports {
                    #address-cells = <1>;
                    #size-cells = <0>;
                    port@1 {
                        reg = <1>;
                        dsi_out_panel: endpoint {
                            remote-endpoint = <&panel_in_dsi>;
                        };
                    };
                };
            };
            &dsi_in_vp1 {
                status = "okay";
            };
            &route_dsi {
                status = "okay";
            };

            • 显示时序计算

            水平总像素=有效宽 + 后肩 + 前肩 + 同步长度
            HTotal=1200 + 120 + 10 + 24 = 1354
            垂直总行数= 有效高 + 后肩 + 前肩 + 同步长度
            VTotal=1920 + 10 + 14 + 20 = 1964
            刷新率=像素时钟 / (HTotal × VTotal) ≈ 56.4Hz

            • 编译时显示接口切换机制

            通过宏#define HDMI 0/1切换HDMI/MIPI DSI显示:

            1.MIPI版本dts:#define HDMI 0,关闭HDMI、启用DSI、VP1路由

            2.HDMI版本dts:#define HDMI 1,关闭DSI、启用HDMI、VP0路由
            构建系统通过BoardConfig.mk指定编译对应的DTS文件。

            Logo

            北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

            更多推荐