2. DRM框架简介
在深入MIPI DSI接口初始化之前,必须理解DRM/KMS(Direct Rendering Manager / Kernel Mode Setting)框架的核心设计。DRM是Linux图形子系统的基础,它为显示输出提供了统一的抽象层。本章将剖析DRM的四大核心对象及其协作关系,并介绍驱动模型的基本结构。
2.1 DRM核心概念
DRM框架将显示流水线抽象为四个核心对象:CRTC、Encoder、Connector和Plane。每个对象对应硬件显示路径中的一个功能模块。
| 核心对象 | 功能描述 | 硬件对应 |
|---|---|---|
| CRTC | 显示控制器,负责扫描输出、时序生成、帧缓冲切换 | LCD控制器、VOP(Video Output Processor) |
| Encoder | 编码器,将CRTC输出的并行数据转换为特定接口信号 | DSI D-PHY发送器、HDMI编码器、LVDS发送器 |
| Connector | 连接器,代表物理显示接口,负责检测设备连接状态 | DSI接口、HDMI端口、eDP接口 |
| Plane | 图层/叠加层,管理帧缓冲与CRTC之间的数据流 | 硬件图层、GPU渲染目标 |
关键理解:在MIPI DSI场景中,Connector代表DSI接口本身,Encoder负责将CRTC的并行RGB数据打包为DSI协议包,而CRTC控制显示时序。三者必须正确连接才能点亮屏幕。
2.2 CRTC/Encoder/Connector/Plane关系
这四个对象通过管道(Pipeline)方式串联,形成完整的显示输出路径。Plane将图像数据送入CRTC,CRTC生成时序并读取帧缓冲,Encoder将数据编码为接口协议,最终通过Connector输出到显示设备。
2.3 对象之间的绑定关系
在DRM驱动中,这些对象通过互连(interconnection)机制建立绑定。一个典型的绑定流程如下:
- CRTC绑定Encoder:通过
drm_encoder.crtc字段或atomic state中的crtc_id建立关联。 - Encoder绑定Connector:通过
drm_connector.encoder_ids[]数组和drm_connector_state.best_encoder实现。 - Plane绑定CRTC:通过
drm_plane.crtc字段或atomic state中的crtc_id建立关联。
DSI场景特殊点:在MIPI DSI中,Encoder和Connector通常是一对一关系,且Connector的type为
DRM_MODE_CONNECTOR_DSI。Encoder负责将CRTC的并行数据打包为DSI长包/短包,并通过D-PHY发送。
2.4 DRM驱动模型
DRM驱动模型采用面向对象的设计思想,通过struct drm_driver作为顶层入口,管理所有子对象。驱动加载流程如下:
| 步骤 | 函数/操作 | 说明 |
|---|---|---|
| 1 | drm_dev_alloc() |
分配并初始化struct drm_device |
| 2 | drm_mode_config_init() |
初始化模式配置,设置min_width/height等参数 |
| 3 | drmm_crtc_alloc_with_planes() |
创建CRTC对象,绑定主Plane和光标Plane |
| 4 | drm_encoder_init() |
初始化Encoder,指定可能的CRTC掩码 |
| 5 | drm_connector_init() |
初始化Connector,指定类型和可能的Encoder |
| 6 | drm_dev_register() |
注册DRM设备,暴露到用户空间 |
2.5 关键数据结构
在DRM驱动中,每个核心对象都有对应的struct定义。以下是DSI场景中最常用的几个结构体:
// CRTC结构体(简化)
struct drm_crtc {
struct drm_device *dev;
struct drm_plane *primary; // 主图层
struct drm_plane *cursor; // 光标图层
int index; // 索引编号
// ... 其他字段
};
// Encoder结构体(简化)
struct drm_encoder {
struct drm_device *dev;
unsigned int possible_crtcs; // 位掩码,表示可绑定的CRTC
unsigned int encoder_type; // 编码器类型(DSI/HDMI等)
// ... 其他字段
};
// Connector结构体(简化)
struct drm_connector {
struct drm_device *dev;
struct drm_encoder *encoder; // 当前绑定的Encoder
int connector_type; // 连接器类型(DSI = 18)
struct drm_display_info display_info; // 显示参数
// ... 其他字段
};
常见错误:在初始化DSI Connector时,必须正确设置
connector_type为DRM_MODE_CONNECTOR_DSI(值为18),否则用户空间的显示管理器(如weston、Xorg)无法正确识别接口类型,导致屏幕无法点亮。
2.6 本章小结
- DRM框架通过CRTC → Encoder → Connector管道模型抽象显示输出路径。
- Plane负责图层管理,与CRTC配合实现合成和叠加。
- 驱动模型以
drm_device为根,通过drmm_系列函数管理子对象生命周期。 - 在MIPI DSI场景中,Encoder负责协议打包,Connector代表物理DSI接口。
- 理解这些核心对象的关系是编写DSI驱动的基础,后续章节将在此基础上展开具体的初始化流程。