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.3:
drivers/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. 参考资料
- 内核源码:
drivers/gpu/drm/bridge/,drivers/gpu/drm/dsc.c - HDMI 2.1规范:CTA-861-H
- DSC规范:VESA Display Stream Compression Standard
- DRM HDMI文档:https://www.kernel.org/doc/html/latest/gpu/drm-hdmi.html
- CEC框架:https://www.kernel.org/doc/html/latest/media/cec/index.html
- HDCP 2.3:https://www.kernel.org/doc/html/latest/gpu/drm-hdcp.html

浙公网安备 33010602011771号