DRM
DRM是Linux下的一个驱动架构,全称直接渲染架构。引入之初是为了display显示数据的传输,现在广泛应用于嵌入式领域,并且为显卡GPU提供一部分服务。显卡上具有一些接口如HDMI、VGA等,所以相应的就包含了他们的驱动。
DRM可分为三部分:
- libdrm 将控制底层硬件的ioctl做成API给用户空间用。位于中间层。
- KMS(Kernel Mode Setting)内核模式设置(KMS)是在内核空间(而不是用户空间)设置显示分辨率和深度的方法,还可显示画面,显示buffer的切换,多图层的合成方式,以及每个图层的显示位置。
- GEM (Graphic Execution Manager)主要负责显存的申请释放 (Framebuffer managing) ,显存共享机制 (Memory sharing objects), 及显存同步机制 (Memory synchronization)。
KMS还包括了很多结构体元素
-
crtc (struct drm_crtc)对显示buffer进行扫描,并产生时序信号的硬件模块,framebuffer切换,通常指Display Controller
-
encoder (struct drm_encoder)负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块,如HDMI转换器或DSI Controller
-
connecter (struct drm_connecter)连接物理显示设备的连接器,如HDMI、DisplayPort、DSI总线,通常和Encoder驱动绑定在一起
-
plane (struct drm_plane)硬件图层,有的Display硬件支持多层合成显示,但所有的Display Controller至少要有1个plane
-
FB (struct drm_framebuffer)Framebuffer,单个图层的显示内容,唯一一个和硬件无关的基本元素
-
property (struct drm_property)任何你想设置的参数,都可以做成property,是DRM驱动中最灵活、最方便的Mode setting机制
-
vblank 软件和硬件的同步机制,RGB时序中的垂直消影区,软件通常使用硬件VSYNC来实现