介绍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电源
};
clock配置
MIPI DSI相关clock配置,包括MIPI DSI DPU相关clock配置,reset配置,及MIPI DSI DPHY相关clock配置。其中pixel clock和 bit clock通过timing参数 计算获取,具体计算方法请参见display timing配置章节。display-timings中的clock-frequency为pixel clock值,mipi dsi dpu中的spacemit-dpu-bitclk和mipi dsi dphy中的phy-bit-clock为bit clock值。mipi dsi dpu escclk及mipi dsi dphy escclk配置51200000或76800000(分辨率1920x1080以上推荐使用76800000),其它clock参数使用系统默认值,不需在dts文件中配置。
配置平台MIPI DSI DPU相关clock和reset。
// linux-6.6\arch\riscv\boot\dts\spacemit\k1-x-lcd.dtsi
&soc {
display-subsystem-dsi {
compatible = "spacemit,saturn-le";
reg = <0 0xC0340000 0 0x2A000>;
ports = <&dpu_online2_dsi>;
interconnects = <&dram_range1>;
interconnect-names = "dma-mem";
};
dpu_online2_dsi: port@c0340000 {
compatible = "spacemit,dpu-online2";
interrupt-parent = <&intc>;
interrupts = <90>, <89>;
interrupt-names = "ONLINE_IRQ", "OFFLINE_IRQ";
clocks = <&ccu CLK_DPU_PXCLK>, // mipi dsi dpu pxclk 配置
<&ccu CLK_DPU_MCLK>, // mipi dsi dpu mclk 配置
<&ccu CLK_DPU_HCLK>, // mipi dsi dpu hclk 配置
<&ccu CLK_DPU_ESC>, // mipi dsi dpu escclk 配置
<&ccu CLK_DPU_BIT>; // mipi dsi dpu bitclk 配置
clock-names = "pxclk", "mclk", "hclk", "escclk", "bitclk";
resets = <&reset RESET_MIPI>, // mipi dsi dpu dsi reset 配置
<&reset RESET_LCD_MCLK>, // mipi dsi dpu mclk reset 配置
<&reset RESET_LCD>, // mipi dsi dpu lcd reset 配置
<&reset RESET_DSI_ESC>; // mipi dsi dpu esc reset 配置
reset-names= "dsi_reset", "mclk_reset", "lcd_reset","esc_reset";
power-domains = <&power K1X_PMU_LCD_PWR_DOMAIN>;
pipeline-id = <ONLINE2>;
ip = "spacemit-saturn";
spacemit-dpu-min-mclk = <40960000>;
type = <DSI>;
clk,pm-runtime,no-sleep;
status = "disabled";
dpu_online2_dsi_out: endpoint@0 {
remote-endpoint = <&dsi2_in>;
};
dpu_offline0_dsi_out: endpoint@1 {
remote-endpoint = <&wb0_in>;
};
};
}
配置方案MIPI DSI DPU bitclk 及 escclk。 以k1-x_deb1方案为例:
// linux-6.6\arch\riscv\boot\dts\spacemit\k1-x_deb1.dts
&dpu_online2_dsi {
status = "okay";
spacemit-dpu-bitclk = <1000000000>; // mipi dsi dpu bitclk 配置
spacemit-dpu-escclk = <76800000>; // mipi dsi dpu escclk 配置
};
配置Panel型号MIPI DSI DPHY bitclk 及 escclk。 以MIPI DSI panel型号lcd_gx09inx101_mipi为例:
// linux-6.6\arch\riscv\boot\dts\spacemit\lcd\lcd_gx09inx101_mipi.dtsi
/ { lcds: lcds {
lcd_gx09inx101_mipi: lcd_gx09inx101_mipi {
phy-bit-clock = <1000000000>; // mipi dsi dphy bitclk 配置
phy-esc-clock = <76800000>; // mipi dsi dphy escclk 配置
};
};};
display timing配置
根据MIPI DSI panel提供规格书的timing信息填写dpu timing 配置,及mipi dsi timing 配置。其中pixel clock和 bit clock通过timing参数计算获取。
display timing参数说明
HFP: hfront porch(horizon front porch): 水平前肩是指水平同步信号之前的空白时间,用于显示设备进行准备。
HBP: hback porch(horizon back porch): 水平后肩是指水平同步信号之后的空白时间,用于显示设备进行复位和恢复。
HSYNC: hsync pulse: 水平同步信号用于同步显示设备的行扫描,水平同步脉冲宽度表示水平同步信号的持续时间。
VFP: vfront porch(vertical front porch): 垂直前肩是指垂直同步信号之前的空白时间,用于显示设备进行准备。
VBP: vback porch(vertical back porch): 垂直后肩是指垂直同步信号之后的空白时间,用于显示设备进行复位和恢复。
VSYNC: vsync pulse: 垂直同步信号用于同步显示设备的刷新率,垂直同步脉冲宽度表示垂直同步信号的持续时间。
HACTIVE: hactive(Horizon display period): 水平行中有效显示的行像素。
VAVTIVE: vactive(vertical display period): 垂直帧中有效显示的行数。