Linux 6.2 HDMI驱动机制详解

1. 版本背景

  • 发布时间:2023年1月1日
  • HDMI支持状态:HDMI 2.1完全支持,DSC压缩技术整合,VRR动态刷新率实现
  • 关键里程碑
    • HDMI 2.1 FRL最高12Gbps支持
    • Display Stream Compression (DSC)完全集成
    • 可变刷新率(VRR)和自动低延迟模式(ALLM)
    • HDCP 2.3开源实现
    • CEC框架生产就绪

2. 子系统架构

现代化架构

  +---------------------+
  |     用户空间        |
  |  DRM API (libdrm)   |
  |  + HDMI控制接口    |
  +----------+----------+
             |
  +----------v----------+
  |     内核空间        |
  |  DRM核心子系统     |
  |  + HDMI 2.1桥接器  |
  +----------+----------+
             |
  +----------v----------+
  |  统一HDMI控制器     |
  |  + DSC支持         |
  |  + VRR实现         |
  +----------+----------+
             |
  +----------v----------+
  |     HDMI物理层     |
  +---------------------+

架构创新

  • HDMI 2.1框架drivers/gpu/drm/bridge/ 下的完全实现
  • DSC集成drivers/gpu/drm/dsc.c 压缩引擎
  • VRR支持drm_mode_add_vrr_modes() 动态刷新率
  • HDCP 2.3drivers/gpu/drm/drm_hdcp.c 完整实现

3. 源码深度解析

HDMI 2.1桥接器实现

// drivers/gpu/drm/bridge/nxp-ptn3460.c
static const struct drm_bridge_funcs ptn3460_bridge_funcs = {
    .attach = ptn3460_attach,
    .mode_set = ptn3460_mode_set,
    .enable = ptn3460_enable,
    .disable = ptn3460_disable,
    .atomic_enable = ptn3460_atomic_enable,
    .atomic_disable = ptn3460_atomic_disable,
    .atomic_get_output_bus_fmts = ptn3460_atomic_get_output_bus_fmts,
};

static int ptn3460_atomic_check(struct drm_bridge *bridge,
                               struct drm_bridge_state *bridge_state,
                               struct drm_crtc_state *crtc_state,
                               struct drm_connector_state *conn_state)
{
    struct ptn3460 *ptn = bridge_to_ptn(bridge);
    struct drm_display_mode *mode = &crtc_state->mode;

    /* 检查是否需要DSC */
    if (mode->clock > HDMI_2_0_MAX_TMDS_CLK &&
        !drm_mode_has_dsc(conn_state->connector)) {
        DRM_ERROR("需要DSC压缩支持\n");
        return -EINVAL;
    }

    return 0;
}
  • 关键函数
    • atomic_get_output_bus_fmts:总线格式协商
    • atomic_check:模式验证与DSC检查
    • atomic_enable:HDMI 2.1链路训练

DSC压缩实现

// drivers/gpu/drm/dsc.c
int drm_dsc_compute_config(struct drm_dsc_config *dsc, int pic_height,
                          int slice_width, int slice_height)
{
    /* 计算DSC参数 */
    dsc->slice_width = slice_width;
    dsc->slice_height = slice_height;
    dsc->slice_chunk_size = drm_dsc_rc_model_size(dsc);

    /* 配置压缩比率 */
    dsc->pps.dsc_version = 1;
    dsc->pps.bits_per_pixel = 8 << 4; /* 8 bpc */
    dsc->pps.block_pred_enable = 1;

    return 0;
}

void drm_dsc_set_config(struct drm_encoder *encoder,
                       struct drm_dsc_config *dsc)
{
    /* 配置DSC寄存器 */
    drm_write(encoder, DSC_PPS0, dsc->pps.dsc_version);
    drm_write(encoder, DSC_PPS1, dsc->pps.bits_per_pixel);
    /* 其他寄存器配置... */
}
  • DSC参数
    • 压缩比率:3:1 (典型值)
    • 切片宽度/高度:根据分辨率计算
    • 颜色深度:8/10/12 bpc

4. 设备树配置详解

HDMI 2.1设备树配置

&dwc_hdmi_21 {
    status = "okay";
    ddc-i2c-bus = <&i2c5>;
    cec-i2c-bus = <&i2c6>;
    hdmi-frl-rates = <3000 6000 8000 10000 12000>; /* Gbps */
    hdmi-dsc-enable;
    hdmi-vrr-enable;

    port {
        hdmi_in: endpoint {
            remote-endpoint = <&vop_out_hdmi>;
            dsc = <1>;
            vrr = <1>;
        };
    };
};

&vop {
    port {
        vop_out_hdmi: endpoint {
            remote-endpoint = <&hdmi_in>;
        };
    };
};
  • 关键属性
    • hdmi-frl-rates:支持的FRL速率列表
    • hdmi-dsc-enable:启用DSC压缩
    • hdmi-vrr-enable:启用可变刷新率

5. EDID处理机制

HDMI 2.1 EDID扩展

// drivers/gpu/drm/drm_edid.c
static void drm_parse_hdmi_21_infoframe(struct edid *edid,
                                       struct drm_connector *connector)
{
    struct cta_sad *sad;
    int i;

    /* 解析FRL支持 */
    if (edid->cea.misc[0] & CEA_MISC_HDMI_2_1_FRL)
        connector->display_info.hdmi.frl_rate =
            edid->cea.misc[1] & CEA_MISC_FRL_RATE_MASK;

    /* 解析DSC支持 */
    if (edid->cea.misc[0] & CEA_MISC_DSC)
        drm_parse_dsc_infoframe(edid, connector);

    /* 解析VRR支持 */
    if (edid->cea.misc[0] & CEA_MISC_VRR)
        connector->display_info.hdmi.vrr = true;
}
  • HDMI 2.1特性标识
    • CEA_MISC_HDMI_2_1_FRL:FRL支持
    • CEA_MISC_DSC:DSC支持
    • CEA_MISC_VRR:VRR支持

DSC能力解析

  • 支持8K@60Hz:通过DSC压缩实现
  • 10/12-bit色深:HDR内容支持
  • YCbCr 4:2:2/4:2:0:高效视频传输

6. CEC/HDCP实现

CEC框架生产就绪

// drivers/media/cec/core/cec-adaptor.c
int cec_register_adaptor(struct cec_adapter *adap, struct device *parent)
{
    /* 设置CEC物理地址 */
    if (adap->devnode && adap->devnode->is_registered) {
        ret = cec_claim_logical_addresses(adap, true);
        if (ret)
            return ret;
    }

    /* 注册CEC消息处理程序 */
    for (i = 0; i < adap->num_handlers; i++) {
        ret = cec_register_handler(adap, adap->handlers[i]);
        if (ret)
            goto err_unregister_handlers;
    }

    return 0;
}
  • 生产特性
    • 逻辑地址自动分配
    • 消息过滤框架
    • 系统音频控制

HDCP 2.3实现

// drivers/gpu/drm/drm_hdcp.c
int drm_hdcp2_authentication_process(struct hdcp_device_data *data)
{
    /* HDCP 2.3认证流程 */
    switch (data->hdcp_version) {
    case HDCP_VERSION_2_3:
        ret = hdcp2_authenticate_2_3(data);
        break;
    case HDCP_VERSION_2_2:
        ret = hdcp2_authenticate_2_2(data);
        break;
    default:
        ret = -EINVAL;
    }

    return ret;
}

static int hdcp2_authenticate_2_3(struct hdcp_device_data *data)
{
    /* 2.3特有认证步骤 */
    ret = hdcp2_2_3_prepare_ake(data);
    if (ret)
        return ret;

    ret = hdcp2_2_3_prepare_lc(data);
    if (ret)
        return ret;

    return hdcp2_2_3_prepare_ske(data);
}
  • 2.3增强
    • 更强的加密算法
    • 改进的密钥管理
    • 内容保护级别协商

7. 性能调优指南

HDMI 2.1性能优化

  • 启用DSC

    # 强制启用DSC
    echo 1 > /sys/class/drm/card0-HDMI-A-1/dsc_enable
    
    # 设置DSC参数
    echo "8:1" > /sys/class/drm/card0-HDMI-A-1/dsc_slice_bpp
    
  • VRR配置

    # 设置VRR范围
    echo "48 120" > /sys/class/drm/card0-HDMI-A-1/vrr_range
    
    # 启用自动低延迟模式
    echo 1 > /sys/class/drm/card0-HDMI-A-1/allm_enable
    

HDR调优

# 设置HDR元数据
echo "static:0:0:1:1:1:1:1:1" > /sys/class/drm/card0-HDMI-A-1/hdr_metadata

# 启用动态HDR
echo 1 > /sys/class/drm/card0-HDMI-A-1/dynamic_hdr_enable

8. 版本差异对比

特性 Linux 5.10 Linux 6.2
HDMI版本 2.0 2.1
最大分辨率 4K@60Hz 8K@60Hz (DSC)
FRL速率 6Gbps 12Gbps
DSC支持 完整支持
VRR/ALLM 完整支持
HDCP版本 2.2 2.3

9. 实际硬件适配案例

NVIDIA Jetson AGX Orin HDMI 2.1适配

硬件平台:NVIDIA Jetson AGX Orin Developer Kit

关键代码

// drivers/gpu/drm/tegra/hdmi21.c
static int tegra_hdmi21_mode_valid(struct drm_connector *connector,
                                  const struct drm_display_mode *mode)
{
    /* 验证HDMI 2.1模式 */
    if (mode->clock > HDMI_2_1_MAX_TMDS_CLK) {
        if (!drm_mode_has_dsc(connector))
            return MODE_CLOCK_HIGH;
        if (!drm_mode_supports_vrr(mode))
            return MODE_VRefresh_Range;
    }

    return MODE_OK;
}

static void tegra_hdmi21_dsc_enable(struct tegra_hdmi *hdmi)
{
    struct drm_dsc_config *dsc = &hdmi->dsc_cfg;

    /* 配置DSC引擎 */
    drm_dsc_compute_config(dsc, hdmi->height,
                          hdmi->width / hdmi->dsc_slices,
                          hdmi->height / 2);
    drm_dsc_set_config(&hdmi->encoder, dsc);

    /* 启用DSC */
    hdmi_writel(hdmi, HDMI_DSC_CTRL, DSC_ENABLE);
}

设备树配置

&hdmi21 {
    status = "okay";
    hdmi-frl-rates = <3000 6000 8000 10000 12000>;
    hdmi-dsc-enable;
    hdmi-vrr-enable;
    hdmi-allm-enable;

    ddc-i2c-bus = <&i2c7>;
    cec-i2c-bus = <&i2c8>;

    port {
        hdmi_in: endpoint {
            remote-endpoint = <&display_out>;
            dsc = <1>;
            vrr = <1>;
            allm = <1>;
        };
    };
};

10. 常见问题与解决方案

1. DSC配置失败

  • 现象:8K输出失败或图像异常

  • 原因

    • DSC参数计算错误
    • 硬件DSC引擎未启用
  • 解决方案

    # 检查DSC状态
    cat /sys/kernel/debug/dri/0/encoder/0/dsc_status
    
    # 验证EDID DSC能力
    cat /sys/class/drm/card0-HDMI-A-1/edid | grep DSC
    

2. VRR不生效

  • 现象:刷新率无法动态调整

  • 原因

    • 显示器不支持VRR
    • 内容源未启用VRR
  • 解决方案

    # 检查VRR支持状态
    cat /sys/class/drm/card0-HDMI-A-1/vrr_capable
    
    # 强制启用VRR
    echo 1 > /sys/class/drm/card0-HDMI-A-1/vrr_enable
    

11. 参考资料

posted @ 2026-07-09 15:53  Jaosn_chen  阅读(9)  评论(0)    收藏  举报