📘 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
🔧 六、面板多模式定义举例与用户空间配置
若 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 控制器配置硬件输出。
📚 深入学习更多嵌入式知识,欢迎支持作者新书:京东购买链接