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输出到显示设备。

DRM显示管道:核心对象关系图 Plane 帧缓冲 / 图层 CRTC 显示控制器 Encoder 编码器 Connector 连接器 显示设备 数据流向: Plane → CRTC → Encoder → Connector → 显示设备

2.3 对象之间的绑定关系

在DRM驱动中,这些对象通过互连(interconnection)机制建立绑定。一个典型的绑定流程如下:

  1. CRTC绑定Encoder:通过drm_encoder.crtc字段或atomic state中的crtc_id建立关联。
  2. Encoder绑定Connector:通过drm_connector.encoder_ids[]数组和drm_connector_state.best_encoder实现。
  3. 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设备,暴露到用户空间
DRM驱动模型:对象初始化流程 drm_device drm_crtc drm_encoder drm_connector drm_plane 驱动模型关键点: • drm_device 是顶层容器,管理所有子对象生命周期 • 子对象通过 drmm_ 系列函数分配,自动随 drm_device 释放 • 每个子对象都有对应的 state 结构,用于 atomic 模式设置

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驱动的基础,后续章节将在此基础上展开具体的初始化流程。