rk3588强制修改分辨率4k@60fps

uboot:
u-boot/drivers/video/drm$ vim dw_hdmi.c
static int _rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn,
里边让开头的edid_status 进入 < 0条件即可,走不识别edid流程。然后
const u8 def_modes_vic6 = {4, 16, 2, 17, 31, 19};的第一个参数4改成你希望的vic号,
vic号对应在:/u-boot$ vim common/edid.c
static const struct drm_display_mode edid_cea_modes_1
特殊分辨率的话按着添加最后然后把对应号码填下即可。比如默认如果4K就是对应107vic号。
kernel:
kernel-5.10/drivers/gpu/drm/bridge/synopsys$ vim dw-hdmi.c
static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
edid = drm_get_edid(connector, hdmi->ddc); //这里edid改为赋值空,让它走else流程,
else流程里的dw_hdmi_default_modes 中,只留下你需要的分辨率时序即可,其它屏蔽可达到强制目的。

diff --git a/drivers/video/drm/dw_hdmi.c b/drivers/video/drm/dw_hdmi.c
index a30e4d526c..9fce5cca78 100644
--- a/drivers/video/drm/dw_hdmi.c
+++ b/drivers/video/drm/dw_hdmi.c
@@ -2529,14 +2529,15 @@ int rockchip_dw_hdmi_get_timing(struct rockchip_connector *conn, struct display_
        unsigned int bus_format;
        unsigned long enc_out_encoding;
        struct overscan *overscan = &conn_state->overscan;
-       const u8 def_modes_vic[6] = {4, 16, 2, 17, 31, 19};
+       const u8 def_modes_vic[6] = {107, 16, 2, 17, 31, 19};
 
        if (!hdmi)
                return -EFAULT;
 
        ret = drm_do_get_edid(&hdmi->adap, conn_state->edid);
 
-       if (!ret) {
+       //if (!ret) {
+       if (0) {
                hdmi->sink_is_hdmi =
                        drm_detect_hdmi_monitor(edid);
                hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
rk3588_android/u-boot$ 

rk3588_android/kernel-5.10$ git diff
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
old mode 100644
new mode 100755
index e7917aef01cd..ab09a7e3add8
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -164,6 +164,11 @@ static const u16 csc_coeff_rgb_full_to_rgb_limited[3][4] = {
 };
 
 static const struct drm_display_mode dw_hdmi_default_modes[] = {
+       /* 107 - 3840x2160p@60Hz 64:27 */
+       { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
+               4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
+               DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+       .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 4 - 1280x720@60Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
@@ -3094,7 +3099,8 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
 
        memset(metedata, 0, sizeof(*metedata));
        edid = dw_hdmi_get_edid(hdmi, connector);
-       if (edid) {
+       //if (edid) {
+       if (0) {
                int vic = 0;
 
                dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n"

实验证明上面的方法并不可行,下面的方法通过命令方式是可以的:

setprop persist.vendor.resolution.main 3840x2160@30-3840-4016-4104-4400-2160-2168-2178-2250-5
setprop vendor.display.timeline 1

当然可以通过改驱动的方式,就是把想要的分辨率在数组移动到更前面:

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
index 5743f3c52edd..55fe1f362a30 100755
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
@@ -142,20 +142,35 @@ static const struct dw_hdmi_audio_tmds_n common_tmds_n_table[] = {
 
 static const struct drm_display_mode dw_hdmi_default_modes[] = {
        /* 107 - 3840x2160p@60Hz 64:27 */
-    { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
-               4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
-               DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+       { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
+                          4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
+                          DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
                .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
        /* 105 - 3840x2160p@30Hz 64:27 */
-    { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
-           4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
-           DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-       .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },   
+       { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
+                  4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+               .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },   
        /* 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, },
+       /* 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, },
+       /* 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, },
+       /* 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, },
 };
 
 enum frl_mask {
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 98e3330ae9ee..a8b0aad98d8b 100755
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -179,9 +179,23 @@ static const struct drm_display_mode dw_hdmi_default_modes[] = {
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 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, },
+       /* 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, },
+       /* 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, },
 };
 
-
 struct hdmi_vmode {
        bool mdataenablepolarity;








u-boot:
git diff     
diff --git a/drivers/video/drm/dw_hdmi.c b/drivers/video/drm/dw_hdmi.c
old mode 100644
new mode 100755
index 9fce5cca78..78deb5bf83
--- a/drivers/video/drm/dw_hdmi.c
+++ b/drivers/video/drm/dw_hdmi.c
@@ -2529,15 +2529,14 @@ int rockchip_dw_hdmi_get_timing(struct rockchip_connector *conn, struct display_
        unsigned int bus_format;
        unsigned long enc_out_encoding;
        struct overscan *overscan = &conn_state->overscan;
-       const u8 def_modes_vic[6] = {107, 16, 2, 17, 31, 19};
+       const u8 def_modes_vic[6] = {107, 105, 2, 17, 31, 19};
 
        if (!hdmi)
                return -EFAULT;
 
        ret = drm_do_get_edid(&hdmi->adap, conn_state->edid);
-
-       //if (!ret) {
-       if (0) {
+       ret = -1;
+       if (!ret) {
                hdmi->sink_is_hdmi =
                        drm_detect_hdmi_monitor(edid);



device/rockchip/common$ git diff
diff --git a/rootdir/init.insmod.sh b/rootdir/init.insmod.sh
index ba39523..6655115 100755
--- a/rootdir/init.insmod.sh
+++ b/rootdir/init.insmod.sh
@@ -50,5 +50,15 @@ chmod 777 /dev/lkir
 chmod 777 /dev/lkir_send
 setprop persist.vendor.resolution.main 3840x2160@60-3840-4016-4104-4400-2160-2168-2178-2250-5
 setprop vendor.display.timeline 1
+first_mode=$(cat /sys/class/drm/card0-HDMI-A-1/modes | head -n 1)
+first_mode=$(cat /sys/class/drm/card0-HDMI-A-1/modes | head -n 1)
+first_mode=$(cat /sys/class/drm/card0-HDMI-A-1/modes | head -n 1)
+if [ "$first_mode" = "1280x720" ]; then
+    setprop persist.vendor.resolution.main 3840x2160@30-3840-4016-4104-4400-2160-2168-2178-2250-5
+    setprop vendor.display.timeline 1
+elif [ "$first_mode" != "3840x2160" ]; then
+    setprop persist.vendor.resolution.main 3840x2160@30-3840-4016-4104-4400-2160-2168-2178-2250-5
+    setprop vendor.display.timeline 1
+fi

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值