DRM KMS 子系统(3)CRTC

文章目录

  • [1. 简述](#1. 简述)
  • 2.硬件框图
  • [3. Display timings](#3. Display timings)
  • [4. Page flipping](#4. Page flipping)

1. 简述

CRTC代表CRT控制器(Cathode Ray Tube Controller),Linux内核显示架构的核心组件,负责管理显示时序、分辨率和刷新率等关键参数。它作为显示管道的中枢,将帧缓冲区(Framebuffer)的内容与硬件显示设备连接起来,确保图像正确输出。通过struct drm_crtc_funcs and struct和drm_crtc_helper_funcs两个接口实现

c 复制代码
struct drm_crtc_funcs {
	[...]
	int (*set_config)(struct drm_mode_set *set);
	int (*page_flip)(struct drm_crtc *crtc,
	struct drm_framebuffer *fb,
	struct drm_pending_vblank_event *event, uint32_t flags);
	[...]
};

set_config负责配置以下以下几个东西:

  • 更新被扫描的帧缓存
  • 配置显示模式如时序、分辨率等
  • 连接connectors/encoders到CRTC
c 复制代码
struct drm_crtc_helper_funcs {
	[...]
	int (*mode_set)(struct drm_crtc *crtc,
	struct drm_display_mode *mode,
	struct drm_display_mode *adjusted_mode,
	int x, int y,
	struct drm_framebuffer *old_fb);
	[...]
};

2.硬件框图

CRTC从DRM Framebuffer和Planes获取图像数据,经图像/视频时序控制,完成流的转化并输出到编码器。上图AXI Video Direct Memory Access 对应DRM Framebuffer,其余为CRTC控制部分,包括video timing controller(时序部分)。

3. Display timings

自阴极射线管(CRT)显示器诞生以来,显示内容的更新方式变化不大(尽管技术已不断演进)。显示需要至少3个信号:

  • 像素时钟(Pixel Clock):驱动像素流(每个时钟周期更新一个像素)
  • 垂直同步(VSYNC):垂直同步信号,在每帧图像的开始有效
  • 水平同步(HSYNC):水平同步信号,在每行像素的开始有效

4. Page flipping

page_flip 负责给帧更新排队

c 复制代码
struct drm_crtc_funcs {
	[...]
	int (*page_flip)(struct drm_crtc *crtc,
	struct drm_framebuffer *fb,
	struct drm_pending_vblank_event *event,
	uint32_t flags);
	[...]
};
  • 帧将会在下一个VBLANK信号(两帧间隔时间)更新
  • 一次只更新一帧
  • 如果"翻页"已经在排队,将返回EBUSY
  • "翻页"完成(2帧都实际划过了)将会有事件通过到用户
  • 完整的图像为1
  • 撕裂(Tearing effect)过程为2>3>4:指针指向了2,画了一半的3被更新到显示将是不完整的图,4才画完整
  • 翻页更新帧(page flipping)过程:翻页前指向5,在6时直接指向已经绘画完成的9,将不会出现半成品的撕裂效果
相关推荐
yashuk28 分钟前
C语言 vs. C++ ,哪个更适合初学者?
c语言·c++·面向对象编程·初学者·学习路径
TechMasterPlus43 分钟前
Linux U-Boot 与内核启动流程深度解析:从上电到 Shell 的完整之旅
linux·运维·服务器
大白菜和MySQL1 小时前
Linux下dhcp服务搭建
linux·运维·服务器
大白菜和MySQL1 小时前
linux系统环境常用命令
android·linux·adb
泛凡(Linyongui)1 小时前
PY32F002B实践之四--宠物腹背理疗仪项目踩坑及项目总结复盘
c语言·keil·32位单片机·腹背理疗仪项目实践·普苒py32
SPC的存折1 小时前
1、MySQL故障排查与运维案例
linux·运维·服务器·数据库·mysql
Hello小赵1 小时前
C语言如何自定义链接库——编译与调用
android·java·c语言
Run_Teenage1 小时前
Linux:认识信号,理解信号的产生和处理
linux·运维·算法
Deitymoon1 小时前
linux——TCP服务器获取客户端IP地址
linux·服务器·tcp/ip
小贾要学习1 小时前
【Linux】应用层自定义协议与序列化
linux·服务器·c++·json