RK3588的linux下实现HDMI输出分辨率及帧率的裁剪

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[] 屏蔽其他保留所需即可解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值