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-*.c | DSI 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。
配置流程
-
menuconfig: Scp 需要打开 DSI 选项,以支持读写 DSI 相关寄存器
Menuconfig -> General Setup -> Scp-firmware modules enable选中
DISP sub mod DSI enable on SoC,保存退出
-
DTS: 在
arch/arm64/boot/dts/m1000目录,找到板子对应的.dtsi文件,在dsi_output(对应 DSI0)或者dsi_output1(对应 DSI1)节点下面,增加panel@0节点
参考上图,
compatible名字修改为panel-*.c里mipi_dsi_driver驱动的名字,其他 GPIO 可根据需求配置。panel节点下的ports为固定格式,表示需要连接到的对端是dsi_output_panel,即 DSI host 下的端口。根据 panel 需要配置的 pixel clock 和硬件 data/clock lane 连接情况,分别修改
dsi-panel-phy-timings和dsi-panel-lane-swap。如不确定,请联系 vendor。
目前默认配置 4 条 data lane。
-
Panel 驱动: 参考
panel-dummy.c,在drivers/gpu/drm/panel/目录下添加panel-*.c文件,注册mipi_dsi_driver驱动。根据 panel 情况,配置drm_display_mode的分辨率、porch、polarity 等。
这里的 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_init 和 dummy_panel_exit 能调用到。
调试方法说明
加载驱动
-
加载
mtdisp.kodisplay 驱动编译出来的模块名为
mtdisp.ko,如果依赖关系已经准备好,可以用modprobe mtdisp来加载(modprobe会自动加载依赖)。否则,需要手动加载mtdisp依赖的 ko 后再加载mtdisp,具体如下:insmod kernel/drivers/video/backlight/backlight.koinsmod kernel/drivers/gpu/drm/drm.koinsmod kernel/drivers/gpu/drm/drm_kms_helper.koinsmod kernel/drivers/gpu/drm/display/drm_display_helper.koinsmod kernel/drivers/gpu/drm/mtdisplay/mtdisp.ko
以上路径是
modprobe自动加载时 ko 所在的路径,手动加载时路径随意,但是顺序需与上述一致。 -
加载
mtgpu.ko因为
mtgpu也参与显示,所以加载完mtdisp之后需要加载mtgpu。而mtgpu依赖mt_ion,所以自动加载用modprobe mtgpu,手动加载时需先insmod mt_ion.ko,再insmod mtgpu.ko。输入
lsmod确认上述模块都已加载成功。
注意:需保证 mtdisp 先加载,mtgpu 后加载,否则无法显示。
显示测试
-
Ubuntu 系统:可以直接起
gdm3或者lightdm来查看是否能点亮:systemctl start gdm3systemctl start lightdm
-
纯 Linux 系统:可以用测试命令
modetest,或者drmtest。modetest是通用命令,具体使用方式可以搜索网页介绍。这里主要介绍drmtest。
请至钉钉文档查看附件《test_dsi0.json》《drmtest》
使用方法:把 drmtest 和测试脚本 test_dsi0.json 放在同一目录,执行 ./drmtest -case ./test_dsi0.json。

注 1:如果改动 display 驱动,json 里的 connector 对应数字(从 0 开始数,数字几就表示第几个 connector,其他 plane、crtc 的数字也是同样意义)可能需要修改;一般情况下默认值可直接使用。
注 2:默认用 defaultPattern 显示,如果需要指定其他图片,先在 drmtest 同目录下创建 resource 目录,把 bmp 文件放在 resource 目录,然后把 json 文件里的 "resource" 修改为 bmp 文件的名字即可,如 "resource": "640x480.bmp"

