bug反馈:客户现场反馈hdmi接显示屏出现概率性闪黑屏,排除线材,显示屏及GND等外部因素后,提出尝试降低hdmi的输出分辨率和帧率对比测试看看。
Step1:先直接在linux的sdk中找到板卡编译生成后的dts找到hdmi节点
然后找到HDMI的节点
根据compatible找到HDMI解析的驱动:
那么hmid的驱动就能找到找到了。
/sys/kernel/debug/dri/0/status 是 Linux 系统中与 Direct Rendering Infrastructure (DRI) 相关的调试信息文件
路径分解:
/sys/kernel/debug/:Linux 内核的调试文件系统(debugfs)挂载点,用于提供内核和驱动的调试信息。
dri/0/:DRI(Direct Rendering Infrastructure,直接渲染基础设施)的子目录,0 通常代表第一个 GPU 设备(如 Intel、AMD 或 NVIDIA 显卡)。
status:该文件通常包含当前 GPU 的状态信息,比如驱动版本、显存使用情况、当前运行的 GPU 任务等。
这段代码定义了一个 drm_display_mode 结构体数组,用于描述 HDMI 支持的默认显示模式(分辨率、刷新率、同步方式等)。
代码解析:
drm_display_mode 结构体:
用于定义显示模式,包括分辨率、刷新率、时序参数等。
每个模式由 DRM_MODE 宏定义,包含:
分辨率(如 1920x1080)
像素时钟频率(如 148500 kHz)
水平时序参数(hdisplay, hsync_start, hsync_end, htotal)
垂直时序参数(vdisplay, vsync_start, vsync_end, vtotal)
同步标志(DRM_MODE_FLAG_PHSYNC 表示水平同步极性为正,NHSYNC 表示负同步)
画面比例(picture_aspect_ratio,如 HDMI_PICTURE_ASPECT_16_9)
关键参数说明
参数 含义
DRM_MODE("1920x1080", ...) 分辨率名称
DRM_MODE_TYPE_DRIVER 模式类型(驱动定义的标准模式)
148500 像素时钟频率(kHz)
1920, 2008, 2052, 2200 水平时序(有效像素、同步开始、同步结束、总宽度)
1080, 1084, 1089, 1125 垂直时序(有效行数、同步开始、同步结束、总高度)
DRM_MODE_FLAG_PHSYNC 水平同步极性(正同步)
DRM_MODE_FLAG_NVSYNC 垂直同步极性(负同步)
HDMI_PICTURE_ASPECT_16_9 画面比例(16:9)
要将 720x480@60Hz 模式改为 720x480@30Hz,需要调整 像素时钟频率(pixel clock) 和 垂直时序参数(vtotal),以降低刷新率。
修改方法
1. 降低像素时钟频率(pixel clock)
原模式(60Hz)的像素时钟是 27 MHz(27000 kHz),30Hz 的时钟频率可以减半(但实际可能需要微调):
/* 原 60Hz 模式 */
DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, ...)
/* 改为 30Hz,时钟频率减半(13.5 MHz) */
DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, ...)
2. 调整垂直总行数(vtotal)
看代码找到关键的结构体:
static const struct drm_display_mode dw_hdmi_default_modes[] = {
/* 16 - 1920x1080@60Hz 16:9 */
{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
/* 2 - 720x480@60Hz 4:3 */
{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
798, 858, 0, 480, 489, 495, 525, 0,
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
/* 4 - 1280x720@60Hz 16:9 */
{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
1430, 1650, 0, 720, 725, 730, 750, 0,
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
/* 31 - 1920x1080@50Hz 16:9 */
{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
/* 19 - 1280x720@50Hz 16:9 */
{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
1760, 1980, 0, 720, 725, 730, 750, 0,
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
/* 17 - 720x576@50Hz 4:3 */
{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
796, 864, 0, 576, 581, 586, 625, 0,
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
/* 2 - 720x480@60Hz 4:3 */
{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
798, 858, 0, 480, 489, 495, 525, 0,
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
};
通过执行:
cat /sys/kernel/debug/dri/0/state
获取到
解决方案是,你如果需要组,就在static const struct drm_display_mode dw_hdmi_default_modes[] 屏蔽其他保留所需即可解决。