RK3588 Android12强制HDMI输出特殊分辨率timing

修改LinuxKernelHDMI驱动以支持3840x1436分辨率

1.把白名单去掉,device/rockchip/common/device.mk中如下位置注释掉
  PRODUCT_COPY_FILES += \
      $(TARGET_DEVICE_DIR)/resolution_white.xml:/system/usr/share/resolution_white.xml
2.安照下面补丁修改,在kernel-5.10/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c的默认数组中dw_hdmi_default_modes[] 加入分辨率3840x1436
将数组kernel-5.10/drivers/gpu/drm/drm_edid.c的edid_cea_modes_1[]第127个替换成需要修改的分辨率timming

3.在屏参中打开hdmi0,将hdmi0_mode改为127,这里主要是实现将kernel-5.10/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c里面的dw_hdmi_connector_get_modes函数选用强制修改的HDMI屏参数timing。

diff --git a/kernel-5.10/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/kernel-5.10/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
index badaee53fe..fca19a43dd 100644
--- a/kernel-5.10/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
+++ b/kernel-5.10/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
@@ -170,6 +170,11 @@ static const struct drm_display_mode dw_hdmi_default_modes[] = {
                   4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
           .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+               /* 127 - 3840x1436@30Hz 16:9 */
+       { DRM_MODE("3840x1436", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
+                  4104, 4400, 0, 1436, 2168, 2178, 2250, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+          .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
 };

 enum frl_mask {
@@ -2117,6 +2122,9 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
                                case 97:
                                                def_index=7;
                                                break;
+                               case 127:
+                                               def_index=9;
+                                               break;
                                default:
                                                def_index=1;
                                                break;
diff --git a/kernel-5.10/drivers/gpu/drm/drm_edid.c b/kernel-5.10/drivers/gpu/drm/drm_edid.c
index 4fdfb41b91..640f6ffd7e 100644
--- a/kernel-5.10/drivers/gpu/drm/drm_edid.c
+++ b/kernel-5.10/drivers/gpu/drm/drm_edid.c
@@ -1372,10 +1372,15 @@ static const struct drm_display_mode edid_cea_modes_1[] = {
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
          .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 127 - 5120x2160@100Hz 64:27 */
-       { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216,
-                  6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
+       // { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216,
+       //         6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
+       //         DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+       //   .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+                       /* 128 - 3840x1436@30Hz 16:9 */
+       { DRM_MODE("3840x1436", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
+                  4104, 4400, 0, 1436, 2168, 2178, 2250, 0,
                   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-         .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+          .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
 };


 

### RK3588 Android HDMI 输出分辨率支持列表 RK3588 是一款高性能处理器,其 HDMI 接口能够支持多种分辨率输出。以下是基于现有资料整理的支持分辨率列表: #### 默认支持的分辨率Android 系统中,默认情况下 RK3588HDMI 接口支持的标准分辨率为常见的高清和超高清选项[^2]: - **1080p (1920×1080)** @ 60Hz - **2K (2560×1440)** @ 60Hz - **4K (3840×2160)** @ 60Hz 这些分辨率通常通过 EDID(Extended Display Identification Data)自动协商完成。 #### 特殊分辨率支持 如果需要强制设置特定分辨率,则可以通过修改内核代码来实现自定义分辨率。例如,在某些场景下可能需要支持非标准分辨率或更高分辨率,如以下情况[^4]: - 自定义分辨率可通过调整 `dw_hdmi_connector_get_modes` 函数中的屏参 timing 实现。 - 修改 `/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c` 文件以添加新的模式。 #### 最高支持的分辨率 RK3588 芯片硬件层面最高可支持 **8K (7680×4320)** 分辨率[@ref=2]。为了启用此功能,需确保 VOP(Video Output Processor)时钟配置正确并满足带宽需求。具体操作方法如下: 1. 编辑设备树文件 (`dts`) 中的相关节点,指定 HDMI 输出接口的工作频率和支持的最大分辨率。 2. 更新屏幕参数以匹配目标分辨率的需求。 #### 强制输出分辨率的方法 当显示器不提供有效的 EDID 或者需要绕过 EDID 协商机制时,可以采用强制输出的方式设定固定的分辨率。这通常涉及以下几个步骤[^1][^3]: - 添加所需的固定分辨率至内核驱动程序中,例如编辑 `drm_edid.c` 文件。 - 使用命令行工具验证可用的分辨率列表以及当前连接的显示设备支持的模式: ```bash cat /sys/class/drm/card0-HDMI-A-1/modes ``` --- ### 示例代码:强制输出特定分辨率 假设需要强制输出一个非标准分辨率(如 1920x1200),可以在内核源码中进行相应改动。以下是一个简单的例子: ```c // 在 kernel/drivers/gpu/drm/drm_edid.c 中新增模式定义 static const struct drm_display_mode forced_mode = { .hdisplay = 1920, .hsync_start = 1968, .hsync_end = 2000, .htotal = 2080, .vdisplay = 1200, .vsync_start = 1203, .vsync_end = 1209, .vtotal = 1235, .clock = 154, // 像素时钟频率 MHz }; ``` 随后重新编译内核并将新固件烧录到开发板即可生效。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值