DRM 显示控制与硬件参数配置链路总结(以 i.MX8MP 为例)

DRM 显示控制与硬件参数配置链路总结(以 i.MX8MP 为例)


支持作者新书,深入学习嵌入式开发知识:京东购买链接


一、核心理解

显示参数(如分辨率、时序、色深)最终来源于用户空间,由 DRM 驱动完成传递与配置,并由 LCD 控制器驱动实际硬件输出。设备树中通常不写死这些参数。


二、显示硬件参数:定义与归属

参数项 通常设置位置 说明
分辨率 用户空间(如 Weston) 通过 DRM API 设置,例如 1920x1080@60Hz
像素时钟 Panel 驱动中定义 通常在 panel-simple 中提供,如 .pixelclock
同步时序参数 Panel 驱动中定义 .hsync_len, .vback_porch 等,决定同步信号精确配置
色深 (bpc) Panel 描述中定义 bits per component,常见为 6 / 8 / 10
输出格式 Panel/Bridge 中定义 如 LVDS、RGB、MIPI DSI 等格式和信号极性

三、显示相关硬件参数一览表

参数名称 作用简述 定义位置 备注 / 是否用户可控
pixelclock 像素时钟频率,决定刷新周期 Panel 驱动(timings) 固定值或范围,通常用户不可调
hactive 每行有效像素数量(水平分辨率) Panel 驱动 用户空间模式可选
vactive 每帧有效行数(垂直分辨率) Panel 驱动 用户空间模式可选
hsync_len 水平同步脉冲宽度 Panel 驱动 影响控制器配置,不由用户设置
hback_porch 水平同步信号后肩(空闲像素) Panel 驱动
hfront_porch 水平同步信号前肩 Panel 驱动
vsync_len 垂直同步脉冲宽度 Panel 驱动
vback_porch 垂直同步信号后肩 Panel 驱动
vfront_porch 垂直同步信号前肩 Panel 驱动
bpc Bits Per Component,色深(每颜色通道位数) Panel 驱动 可影响 GPU 渲染或帧缓存格式
bus_format 像素数据总线格式(如 RGB888) Panel 驱动 / Bridge 确保传输与屏幕兼容
bus_flags 信号极性,如 DE、VSYNC 高/低电平 Panel 驱动
connector_type 接口类型(如 LVDS、HDMI、DSI) Panel 驱动 用于 DRM 框架识别连接器类型
mode list 支持的所有分辨率模式 Panel 驱动(timings) 用户空间读取并选择
preferred mode 首选模式(如仅定义一种即为默认) Panel 驱动 用户空间未设置时将默认采用

️ 四、设备树节点位置与职责(简化示例)

// 控制器节点:lcdif2 提供显示时序输出
lcdif2: lcd-controller@32e90000 {
    compatible = "fsl,imx8mp-lcdif2";
    ...
    port@0 {
        endpoint@0 {
            remote-endpoint = <&ldb_ch0>;
        };
    };
};

// LDB Bridge:将信号从 RGB 转换为 LVDS 输出
ldb: ldb@32ec005c {
    lvds-channel@0 {
        port@1 {
            lvds_out: endpoint {
                remote-endpoint = <&panel_lvds_in>;
            };
        };
    };
};

// Panel 显示面板:提供物理屏和显示参数
lvds0_panel {
    compatible = "auo,g156hat03";
    port {
        panel_lvds_in: endpoint {
            remote-endpoint = <&lvds_out>;
        };
    };
};

️ 五、显示子系统链路逻辑图(DRM 架构视角)

Framebuffer → Plane → CRTC → Encoder → Bridge → Panel

六、面板多模式定义举例与用户空间配置

DRM 显示控制与硬件参数配置链路总结(以 i.MX8MP 为例)_第1张图片

num_timings = 1,用户空间自动采用该唯一模式。

若提供多个 timings,例如:

static const struct display_timing panel_timings[] = {
    { .hactive = {1920}, .vactive = {1080}, .pixelclock = {141000000} },
    { .hactive = {1280}, .vactive = {720}, .pixelclock = {74250000} },
};

static const struct panel_desc my_panel = {
    .timings = panel_timings,
    .num_timings = ARRAY_SIZE(panel_timings),
    .bpc = 8,
    .connector_type = DRM_MODE_CONNECTOR_LVDS,
};

用户空间指定使用特定模式方法(以 Weston 为例):

[output]
name=LVDS-1
mode=1280x720

七、用户空间设置分辨率路径示意

modetest -s 32@33:1920x1080-60

内核调用链:

drmModeSetCrtc()lcdif_kms_crtc_atomic_enable()lcdifv3_crtc_mode_set_nofb()lcdifv3_configure()

八、小结:核心记忆法

Panel 提供支持范围,用户空间选择实际使用模式,LCD 控制器配置硬件输出。


深入学习更多嵌入式知识,欢迎支持作者新书:京东购买链接


你可能感兴趣的:(DRM 显示控制与硬件参数配置链路总结(以 i.MX8MP 为例))