云实验室-DRM基本介绍和modetest测试
本文档涉及案例包括:
• Linux DRM显示架构的基本介绍
• 使用modetest命令查看显示设备
Linux DRM(Direct Rendering Manager)是Linux内核中的一个子系统,主要负责与显卡交互,提供一组API,允许用户空间程序通过这些API发送命令和数据到GPU,执行诸如3D渲染、视频解码和GPU计算等操作。
历史背景和功能
DRM最初是为X server的Direct Rendering Infrastructure(DRI)开发的,但随着技术的发展,它被广泛应用于其他图形堆栈中,如Wayland。DRM允许多个程序同时使用视频硬件资源,通过初始化和管理命令队列、内存和其他资源,避免了多个程序同时访问GPU时的冲突问题。
DRM的关键功能
1.显示输出管理:DRM负责与显示设备进行交互,管理分辨率、刷新率和显示模式等参数。这使得用户可以根据需要,灵活地调整显示设置,以获得最佳的显示效果。
2.显卡资源管理:DRM统一管理GPU的内存、命令缓冲区、渲染管线等资源。它确保这些资源能够被高效地分配和释放,从而提高了显卡的利用率和性能。
3.命令缓冲区和渲染:DRM提供支持GPU执行渲染命令的机制。通过缓冲区提交渲染任务,应用程序可以充分利用GPU的并行处理能力,实现高效的图形渲染。
4.同步和调度:DRM负责图形命令的同步,确保多个GPU命令或渲染任务不会产生竞态条件。这保证了图形渲染的稳定性和一致性。
5.硬件加速支持:DRM通过硬件加速图形渲染和视频解码等操作,显著提高了系统的性能。这使得Linux系统能够更好地支持高性能计算和图形密集型应用。
DRM架构的组成部分
DRM的架构主要包括libdrm, KMS和GEM三部分:
1.libdrm:这是DRM框架提供的位于用户空间的库,主要用于封装底层接口,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装。
2.KMS(Kernel Mode Setting):KMS是DRM框架的一个核心模块,主要负责显示参数的设置和画面的更新。它包括了CRTC(阴极射线管控制器)、ENCODER、CONNECTOR、PLANE等关键组件。CRTC负责扫描Framebuffer并产生时序信号;ENCODER将CRTC输出的画面转换成不同外部设备所需要的信号;CONNECTOR则负责连接物理显示设备,如HDMI、DisplayPort等。PLANE则是用于图层管理的组件,它支持多图层合成,使得显示内容更加丰富和灵活。
3.GEM(Graphic Execution Manager):GEM负责DRM下的内存管理和释放。GEM常用的Buffer包括Dumb Buffer和Prime Buffer,分别用于小分辨率简单场景和大内存复杂场景
DUMB 只支持连续物理内存,基于kernel中通用CMA API实现,多用于小分辨率简单场景
PRIME 连续、非连续物理内存都支持,基于DMA-BUF机制,可以实现buffer共享,多用于大内存复杂场景
这里需要注意的是,上文Plane,CRTC,Encoder和Connector的描述,是DRM架构层面上的设计,而在实际使用中则更为灵活,比如i.MX MPU开发板中,他们的对应关系可以简单概括为:
实际数据的大致流动方向为:
Modetest基本介绍
modetest是libdrm库的一部分。modetest命令是一个用于测试和验证Linux显示硬件的命令行工具,主要用于测试Direct Rendering Manager(DRM)驱动程序的功能。它涉及显示器的CRTC、encoder、connector等概念,允许用户查询和设置输出,如显示模式、分辨率等。
执行步骤:
1 预定板子
2 案例执行 – modetest的用法
2.1 查询输出
常用查询输出包含三类,分别为
1. 列出所有的connectors:
modetest -c
上述log表明当前DRM下挂载有一个connector显示屏,大小为261x163mm,仅支持一种显示模式,且与34号encoder相连接。
该显示模式的相关参数也被列在了下方,即分辨率1280x800,帧率为60fps,后面的时序参即为显示行、场同步信号的长度。
type:preferred则意味着如无特殊指定情况下,当前mode为默认输出模式。
2. 列出所有的encoders:
modetest -e
当前encoder的id号34,当前与他连接的是33号crtc,编码类型为LVDS。
Possible crtcs则记录了他可能连接的crtc有哪些。
3. 列出所有的CRTCs和planes(pipes)
modetest -p
可以看到当前DRM下只挂载有一个CRTC设备,id号为33。与之相连结的framebuffer id号为36。该CRTC输出的分辨率大小为1280x800,其对应的时序参数就是上面LVDS显示屏可以支持的模式。
在CRTC的下面是plane,可以看到当前DRM下同样只挂载有一个plane设备,id号为31,他所能够支持的像素格式包括XR24, AR24, RG16, XB24, AB24, AR15, XR15。
注意,i.MX93的DRM设备名称为imx-drm,已加入modetest搜索序列中,因此用户不需要特殊指定,也会去顺序搜索名为imx-drm的设备。(i.MX95为imx95-dpu,这个是必须要加-M imx95-dpu的)
用户也可以在后面加上 -M imx-drm 的方式去使用modetest命令,比如:
2.2 显示测试
常见的显示测试命令为:
1. 静态测试
modetest -s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>]
mode: 需要测试的显示模式,一般写为分辨率形式,如1920x1080
connector_id:要显示的屏幕对应connector的id
crtc_id:connector所对应的crtc id
mode index:因为1280x800可能对应有多种时序参数,因此只指定分辨率可能不够,还需要制定mode的序列数
mode:显示分辨率
vrefresh:需要测试的屏幕刷新帧率
format:显示的像素格式
如上文中可知当前板子LVDS屏幕的connector号为35,分辨率为1280x800,因此可以使用如下命令:
modetest -s 35:1280x800
可以看到屏幕输出color bar的图案。
完整的命令为:
modetest -s <connector_id>@<crtc_id>:#<mode index><mode>-<vrefresh>@<format>
因此上面的测试命令可以扩充为:
modetest -s 35@33:#0-1280x720-60@XR24
connector_id:35
crtc_id:33
mode index:#0
mode:1280x800
vrefresh:60(fps)
format:XR24
2. 动态测试
一般加入-v 参数来表明测试页面的同步翻转, 只需要在原命令后面加上-v即可,如:
modetest -s 35@33:#0-1280x720-60@XR24 -v
可以看到LVDS屏上的color bar剧烈闪烁: