介绍spacemit平台Display模块的功能和使用方法。
模块介绍
spacemit平台Display模块使用DRM框架,DRM全称是Direct Rendering Manager,是Linux系统目前主流的显示框架,适应当前显示硬件的特性。
功能介绍
用户空间(Libdrm):
DRM框架在用户空间提供的Lib,用户或应用程序在用户空间调用libdrm提供的库函数, 即可访问到显示的资源,并对显示资源进行管理和使用。
内核空间(DRM driver ):
DRM driver提供了一系列的 IOCTL 接口,可以分成两类:Graphics Execution Manager (GEM)、Kernel Mode-Setting (KMS)。
GEM
GEM 主要是对 FrameBuffer 的管理,如显存的申请释放 (Framebuffer managing) ,显存共享机制 (Memory sharing objects), 及显存同步机制 (Memory synchronization);
KMS
KMS 主要负责管理显示模式的设置和图像输出 。KMS模型由组件Framebuffer,CRTC,Planes,Encoder,Connector组成。
Framebuffer:
一块内存区域,驱动和应用层可访问,单个图层的显示内容。
CRTC:
显示控制器,负责把要显示的图像,转化为底层硬件层面上的具体时序要求,还负责着帧切换、电源控制、色彩调整等等。
Plane:
图层,每个图像拥有一个Planes,Planes的属性控制着图像的显示区域、图像翻转、色彩混合方式等, CRTC的显示图像实际上是Framebuffer和Planes的组合,得到多个图像的混合显示或单独显示。 图层有以下三种类型:
- 主图层(primary plane),用于显示背景或者图像内容;
- 叠加图层(overlay plane),通常用于叠加,比如视频图层;
- 光标图层(cursor),用于显示鼠标。
Encoder:
编码器,负责电源管理、视频输出格式封装,把时序转换为显示器所需要的信号,将画面显示到不同的显示设备,例如将视频输出到HDMI接口、MIPI DSI接口等。
Connector:
连接器,负责硬件显示设备的接入、屏参获取等,例如HDMI, MIPI DSI等。
Panel
显示面板,负责将接收的图像信号转换为显示图像。
源码结构介绍
spacemit平台DRM驱动源码结构:
linux-6.6/drivers/gpu/drm$ tree spacemit
spacemit
|-- dphy
| `-- spacemit_dphy_drv.c // mipi dsi dphy驱动
|-- dpu // dpu 驱动
| |-- dpu_debug.c
| |-- dpu_debug.h
| |-- dpu_saturn.c
| |-- dpu_saturn.h
| |-- dpu_trace.h
| |-- saturn_fbcmem.c
| |-- saturn_fbcmem.h
| `-- saturn_regs
| |-- cmdlist.h
| |-- cmps_x.h
| |-- dma_top.h
| |-- dpu_crg.h
| |-- dpu_ctl.h
| |-- dpu_intp.h
| |-- dpu_top.h
| |-- mmu.h
| |-- outctrl_proc_x.h
| |-- outctrl_top_x.h
| |-- prepipe_layer_proc_x.h
| |-- rdma_path_x.h
| |-- reg_map.h
| |-- scaler_x.h
| `-- wb_top.h
|-- dsi // mipi dsi 驱动
| |-- spacemit_dptc_drv.c
| |-- spacemit_dptc_drv.h
| |-- spacemit_dsi_drv.c
| `-- spacemit_dsi_hw.h
|-- Kconfig
|-- lt8911exb.c // lt8911exb mipi dsi转eDP panel驱动
|-- lt9711.c // lt9711 mipi dsi转DP panel驱动
|-- Makefile
|-- spacemit_bootloader.c
|-- spacemit_bootloader.h
|-- spacemit_cmdlist.c
|-- spacemit_cmdlist.h
|-- spacemit_dmmu.c
|-- spacemit_dmmu.h
|-- spacemit_dphy.c
|-- spacemit_dphy.h
|-- spacemit_dpu.c
|-- spacemit_dpu.h
|-- spacemit_dpu_reg.h
|-- spacemit_drm.c // DRM core 驱动
|-- spacemit_drm.h
|-- spacemit_dsi.c
|-- spacemit_dsi.h
|-- spacemit_gem.c // GEM 驱动
|-- spacemit_gem.h
|-- spacemit_hdmi.c // HDMI 驱动
|-- spacemit_hdmi.h
|-- spacemit_lib.c
|-- spacemit_lib.h
|-- spacemit_mipi_panel.c // panel 驱动
|-- spacemit_mipi_panel.h
|-- spacemit_planes.c
|-- spacemit_wb.c // write back 驱动
|-- spacemit_wb.h
`-- sysfs
|-- sysfs_class.c
|-- sysfs_display.h
|-- sysfs_dphy.c
|-- sysfs_dpu.c
|-- sysfs_dsi.c
`-- sysfs_mipi_panel.c
关键特性
特性
特性 | 特性说明 |
---|---|
支持MIPI DSI | 支持MIPI DPHY v1.1, 支持DPHY 4 lane,最高速率1.2Gbps/lane |
支持HDMI | 支持HDMI 1.4a |
性能参数
屏幕接口 | 性能规格 |
---|---|
MIPI DSI | 1920x1200@60FPS |
HDMI | 1920x1080@60FPS |
MIPI DSI屏幕帧率测试方法:
查看Connectors:
# modetest -M spacemit -D /dev/dri/card1 -c
Connectors:
id encoder status name size (mm) modes encoders
130 129 connected DSI-1 142x228 1 129
modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
#0 1200x1920 60.05 1200 1250 1260 1300 1920 1940 1944 1960 153000 flags: phsync, pvsync; type: preferred, driver
props:
1 EDID:
flags: immutable blob
blobs:
value:
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 0
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
4 TILE:
flags: immutable blob
blobs:
value:
查看Encoders:
# modetest -M spacemit -D /dev/dri/card1 -e
Encoders:
id crtc type possible crtcs possible clones
129 127 DSI 0x00000001 0x00000001
测试MIPI DSI屏幕帧率:
# modetest -M spacemit -D /dev/dri/card1 -s 130@127:1200x1920 -v
setting mode 1200x1920-60.05Hz on connectors 130, crtc 127
freq: 60.55Hz
freq: 60.28Hz
freq: 60.28Hz
HDMI屏幕帧率测试方法:
查看Connectors:
# modetest -M spacemit -D /dev/dri/card2 -c
Connectors:
id encoder status name size (mm) modes encoders
130 129 connected HDMI-A-1 300x260 12 129
modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
#0 1920x1080 60.00 1920 2008 2052 2200 1080 1082 1087 1125 148500 flags: phsync, pvsync; type: preferred, driver
#1 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver
#2 1920x1080 59.94 1920 2008 2052 2200 1080 1084 1089 1125 148352 flags: phsync, pvsync; type: driver
#3 1600x900 60.00 1600 1624 1704 1800 900 901 904 1000 108000 flags: phsync, pvsync; type: driver
#4 1280x1024 60.02 1280 1328 1440 1688 1024 1025 1028 1066 108000 flags: phsync, pvsync; type: driver
#5 1152x864 59.97 1152 1216 1336 1520 864 865 868 895 81579 flags: nhsync, pvsync; type:
#6 1280x720 60.00 1280 1390 1430 1650 720 725 730 750 74250 flags: phsync, pvsync; type: driver
#7 1280x720 59.94 1280 1390 1430 1650 720 725 730 750 74176 flags: phsync, pvsync; type: driver
#8 1024x768 60.00 1024 1048 1184 1344 768 771 777 806 65000 flags: nhsync, nvsync; type: driver
#9 800x600 60.32 800 840 968 1056 600 601 605 628 40000 flags: phsync, pvsync; type: driver
#10 640x480 60.00 640 656 752 800 480 490 492 525 25200 flags: nhsync, nvsync; type: driver
#11 640x480 59.94 640 656 752 800 480 490 492 525 25175 flags: nhsync, nvsync; type: driver
props:
1 EDID:
flags: immutable blob
blobs:
value:
00ffffffffffff005c73562501000000
321d0103801e1a783eee91a3544c9926
0f505421080071408180a9c0d1c00101
010101010101023a801871382d40582c
2500dd0c1100001e000000fc0048444d
490a2020202020202020000000ff000a
202020202020202020202020000000fd
003b3f1e5414000a20202020202001c5
02032ef1429004e200d5e305c0002309
7f078301000067030c0010001878e606
0501626200681a00000101304be6023a
801871382d40582c4500dd0c1100001e
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
000000000000000000000000000000f5
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 0
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
4 TILE:
flags: immutable blob
blobs:
value:
查看Encoders:
# modetest -M spacemit -D /dev/dri/card2 -e
Encoders:
id crtc type possible crtcs possible clones
129 127 TMDS 0x00000001 0x00000001
测试HDMI屏幕帧率:
# modetest -M spacemit -D /dev/dri/card2 -s 130@127:1920x1080 -v
setting mode 1920x1080-60.00Hz on connectors 130, crtc 127
freq: 60.13Hz
freq: 60.00Hz
freq: 60.00Hz
配置介绍
主要包括Display驱动使能配置和dts配置,K1芯片支持1个MIPI DSI硬件接口和1个HDMI硬件接口。
CONFIG配置
CONFIG_DRM_SPACEMIT:spacemit平台DRM驱动配置选项,默认情况,此选项为Y,MIPI DSI驱动或HDMI驱动配置依赖此配置选项,可单独配置或同时配置MIPI DSI驱动和HDMI驱动。
Device Drivers --->
Graphics support --->
<*> DRM Support for Spacemit
< > MIPI Panel Support For Spacemit
< > HDMI Support For Spacemit
MIPI DSI CONFIG配置
CONFIG_SPACEMIT_MIPI_PANEL:spacemit平台MIPI DSI驱动配置选项,具体方案根据需要进行配置。
Device Drivers --->
Graphics support --->
<*> DRM Support for Spacemit
<*> MIPI Panel Support For Spacemit
HDMI CONFIG配置
CONFIG_SPACEMIT_HDMI:spacemit平台HDMI驱动配置选项,具体方案根据需要进行配置。
Device Drivers --->
Graphics support --->
<*> DRM Support for Spacemit
<*> HDMI Support For Spacemit
dts配置
MIPI DSI
gpio
MIPI DSI panel gpio相关配置,包括panel复位gpio配置和panel电源控制gpio配置。
以k1-x_deb1方案为例: gpio81配置为panel复位pin,gpio82和gpio83配置为panel电源控制pin。
// linux-6.6\arch\riscv\boot\dts\spacemit\k1-x_deb1.dts
&dsi2 {
status = "okay";
panel2: panel2@0 {
status = "okay";
compatible = "spacemit,mipi-panel2";
reg = <0>;
gpios-reset = <81>; // 配置panel 复位 gpio
gpios-dc = <82 83>; // 配置panel 电源控制 gpio
};
};
电源配置
MIPI DSI电源配置,包括MIPI DSI 1.2v电源控制配置。
以k1-x_deb1方案为例: 配置pmic ldo_5为MIPI DSI 1.2v。
// linux-6.6\arch\riscv\boot\dts\spacemit\k1-x_deb1.dts
&dpu_online2_dsi {
status = "okay";
dsi_1v2-supply = <&ldo_5>; // 引用PMIC DLDO
vin-supply-names = "dsi_1v2"; // 配置MIPI DSI 1.2v电源
};