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