Skip to main content

Display DSI

功能描述

DSI(Display Serial Interface)是由 MIPI(Mobile Industry Processor Interface)联盟制定的高速串行显示接口标准,专为移动设备、嵌入式系统及高性能显示设备设计。DSI 提供了一种高效、低功耗的图像数据传输方式,广泛应用于以下领域:

  • 智能手机
  • 平板电脑
  • 车载显示屏
  • AR/VR 设备

主要特性

  • 可配置的 Data Lane:支持 1~4 条 Data Lane。
  • 双向传输支持:仅 Lane 1 支持双向传输。
  • 高速 D-PHY:支持高速 D-PHY,速率可达 4.5+ Gbit/s。
  • 数据类型与格式支持:支持 DSI-2 所有数据类型和格式。
  • Virtual Channel 支持:支持多虚拟通道的数据传输。
  • 视频模式支持:支持全部三种 Video 模式:
    • Non-Burst Mode with Sync Pulses
    • Non-Burst Mode with Sync Events
    • Burst Mode
  • DCS 命令集支持:支持 Display Command Set(DCS)命令集。
  • 多端口支持:支持两个 DSI Port。

DSI 涉及到的内核文件包含以下几个:

文件路径用处
drivers/gpu/drm/mtdisplay/dw_mipi_dsi.c drivers/gpu/drm/panel/panel-*.cDSI controller 和 PHY,用户需要增加的 DSI 屏驱动

用户通过 panel-*.c 来注册 mipi_dsi_driver 驱动,作为 MIPI DSI slave 与 dw_mipi_dsi.c 注册的 MIPI DSI host 进行通信。


API 说明

Linux kernel 已经实现 MIPI DSI 协议的标准接口,用户可参考文件 drivers/gpu/drm/drm_mipi_dsi.c


配置流程

  1. menuconfig: Scp 需要打开 DSI 选项,以支持读写 DSI 相关寄存器

    Menuconfig -> General Setup -> Scp-firmware modules enable

    选中 DISP sub mod DSI enable on SoC,保存退出

    E300 028 图示

  2. DTS: 在 arch/arm64/boot/dts/m1000 目录,找到板子对应的 .dtsi 文件,在 dsi_output(对应 DSI0)或者 dsi_output1(对应 DSI1)节点下面,增加 panel@0 节点

    E300 029 图示

    参考上图,compatible 名字修改为 panel-*.cmipi_dsi_driver 驱动的名字,其他 GPIO 可根据需求配置。panel 节点下的 ports 为固定格式,表示需要连接到的对端是 dsi_output_panel,即 DSI host 下的端口。

    根据 panel 需要配置的 pixel clock 和硬件 data/clock lane 连接情况,分别修改 dsi-panel-phy-timingsdsi-panel-lane-swap。如不确定,请联系 vendor。

    E300 030 图示

    目前默认配置 4 条 data lane。

  3. Panel 驱动: 参考 panel-dummy.c,在 drivers/gpu/drm/panel/ 目录下添加 panel-*.c 文件,注册 mipi_dsi_driver 驱动。根据 panel 情况,配置 drm_display_mode 的分辨率、porch、polarity 等。

    E300 031 图示

    这里的 clock 指 pixel clock,计算公式:clock = htotal * vtotal * fps / 1000。如果此 clock 改动,需同步修改上述设备树(DTS)里的 dsi-panel-phy-timings,请联系 vendor 支持。

    probe 函数中,修改 panel 用到的 GPIO,包括 backlight、reset 等。

    prepare 里修改 panel 时序。如有初始化命令,可添加在背光点亮前。


开发参考

用户 panel 驱动参考如下:

请至钉钉文档查看附件《panel-dummy.c》

如使用 panel-dummy.c 作为单独的 module,需要增加 module_init(dummy_panel_init)module_exit(dummy_panel_exit) 的申明。

如果不作为单独 module,确保 dummy_panel_initdummy_panel_exit 能调用到。


调试方法说明

加载驱动

  1. 加载 mtdisp.ko

    display 驱动编译出来的模块名为 mtdisp.ko,如果依赖关系已经准备好,可以用 modprobe mtdisp 来加载(modprobe 会自动加载依赖)。否则,需要手动加载 mtdisp 依赖的 ko 后再加载 mtdisp,具体如下:

    • insmod kernel/drivers/video/backlight/backlight.ko
    • insmod kernel/drivers/gpu/drm/drm.ko
    • insmod kernel/drivers/gpu/drm/drm_kms_helper.ko
    • insmod kernel/drivers/gpu/drm/display/drm_display_helper.ko
    • insmod kernel/drivers/gpu/drm/mtdisplay/mtdisp.ko

    以上路径是 modprobe 自动加载时 ko 所在的路径,手动加载时路径随意,但是顺序需与上述一致。

  2. 加载 mtgpu.ko

    因为 mtgpu 也参与显示,所以加载完 mtdisp 之后需要加载 mtgpu。而 mtgpu 依赖 mt_ion,所以自动加载用 modprobe mtgpu,手动加载时需先 insmod mt_ion.ko,再 insmod mtgpu.ko

    输入 lsmod 确认上述模块都已加载成功。

tip

注意:需保证 mtdisp 先加载,mtgpu 后加载,否则无法显示。

显示测试

  1. Ubuntu 系统:可以直接起 gdm3 或者 lightdm 来查看是否能点亮:

    • systemctl start gdm3
    • systemctl start lightdm
  2. 纯 Linux 系统:可以用测试命令 modetest,或者 drmtest

    • modetest 是通用命令,具体使用方式可以搜索网页介绍。这里主要介绍 drmtest

请至钉钉文档查看附件《test_dsi0.json》《drmtest

使用方法:把 drmtest 和测试脚本 test_dsi0.json 放在同一目录,执行 ./drmtest -case ./test_dsi0.json

E300 032 图示

tip

注 1:如果改动 display 驱动,json 里的 connector 对应数字(从 0 开始数,数字几就表示第几个 connector,其他 plane、crtc 的数字也是同样意义)可能需要修改;一般情况下默认值可直接使用。

tip

注 2:默认用 defaultPattern 显示,如果需要指定其他图片,先在 drmtest 同目录下创建 resource 目录,把 bmp 文件放在 resource 目录,然后把 json 文件里的 "resource" 修改为 bmp 文件的名字即可,如 "resource": "640x480.bmp"