Project

General

Profile

新建 #223 » rk3588hdmi新增特殊分辨率.md

余 顺, 10/18/2023 07:05 AM

 

kernel/drivers/gpu/drm/drm_edid.c

diff --git a/kernel/drivers/gpu/drm/drm_edid.c b/kernel/drivers/gpu/drm/drm_edid.c
index 258b01e2f..9eb962056 100644
--- a/kernel/drivers/gpu/drm/drm_edid.c
+++ b/kernel/drivers/gpu/drm/drm_edid.c
@@ -221,6 +221,7 @@ static const struct edid_quirk {
  * Autogenerated from the DMT spec.
  * This table is copied from xfree86/modes/xf86EdidModes.c.
  */
+// rpdzkj
 static const struct drm_display_mode drm_dmt_modes[] = {
        /* 0x01 - 640x350@85Hz */
        { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
@@ -238,6 +239,14 @@ static const struct drm_display_mode drm_dmt_modes[] = {
        { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
                   752, 800, 0, 480, 490, 492, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
+
+        /* 0x04 - 640x480@60Hz */
+       { DRM_MODE("480x640", DRM_MODE_TYPE_DRIVER, 25175, 480, 526,
+              530, 570, 0, 640, 656, 658, 692, 0,
+              DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+
        /* 0x05 - 640x480@72Hz */
        { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
                   704, 832, 0, 480, 489, 492, 520, 0,

kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c

diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
index 0d5da7b95..313ef2077 100644
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
@@ -4,6 +4,7 @@
  * Author:
  *      Algea Cao <algea.cao@rock-chips.com>
  */
+#define DEBUG
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/dma-mapping.h>
@@ -125,6 +126,7 @@ static const struct dw_hdmi_audio_tmds_n common_tmds_n_table[] = {
 };

 static const struct drm_display_mode dw_hdmi_default_modes[] = {
+#if 0
        /* 16 - 1920x1080@60Hz 16:9 */
        { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
                   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
@@ -135,6 +137,15 @@ static const struct drm_display_mode dw_hdmi_default_modes[] = {
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+
+#endif
+       /* 127 - 480x640@60Hz 4:3 */
+       { DRM_MODE("480x640", DRM_MODE_TYPE_DRIVER, 25175, 480, 526,
+              530, 570, 0, 640, 656, 658, 692, 0,
+              DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+        .picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE, },
+
+#if 0
        /* 4 - 1280x720@60Hz 16:9 */
        { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
                   1430, 1650, 0, 720, 725, 730, 750, 0,
@@ -160,6 +171,7 @@ static const struct drm_display_mode dw_hdmi_default_modes[] = {
                   798, 858, 0, 480, 489, 495, 525, 0,
                   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
          .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
+#endif
 };

 enum frl_mask {
@@ -2114,7 +2126,8 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
                return 0;

        memset(metedata, 0, sizeof(*metedata));
-       edid = drm_get_edid(connector, hdmi->ddc);
+       edid = NULL;
+       //edid = drm_get_edid(connector, hdmi->ddc);
        if (edid) {
                dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
                        edid->width_cm, edid->height_cm);
@@ -2288,7 +2301,8 @@ static void dw_hdmi_attach_properties(struct dw_hdmi_qp *hdmi)
                if (hdmi->plat_data->get_grf_color_fmt)
                        color = hdmi->plat_data->get_grf_color_fmt(data);

-               val = (hdmi_readl(hdmi, PKT_VSI_CONTENTS1) >> 8) & 0xffffff;
+               val = HDMI_FORUM_OUI;
+               //val = (hdmi_readl(hdmi, PKT_VSI_CONTENTS1) >> 8) & 0xffffff;
                if (val == HDMI_FORUM_OUI)
                        hdmi->allm_enable = true;
                else

kernel/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts,这里以rd-rk3588版型为例,其他版型添加到对应的主dts文件中。

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts
index 41b3aab3b..dadb47e56 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3588/rd-rk3588.dts
@@ -60,14 +60,14 @@
 //#include "rp-camera-dphy0-imx415.dtsi"
 /******************************************/

-//#include "rp-lcd-hdmi0.dtsi"        //batch ignore
+#include "rp-lcd-hdmi0.dtsi"        //batch ignore
 //#include "rp-lcd-hdmi1.dtsi"        //batch ignore
 //#include "rp-lcd-typec-dp0.dtsi"    //usb edp0,must be enable rp-usb-typec.dtsi, batch ignore
 //#include "rp-lcd-multi-hdmi0-hdmi1-dp0.dtsi" 

 /* lcd */
 //#include "rp-lcd-mipi0-5-720-1280-v2-boxTP.dtsi"
-#include "rp-lcd-mipi0-7-720-1280.dtsi"
+//#include "rp-lcd-mipi0-7-720-1280.dtsi"
 //#include "rp-lcd-mipi0-8-800-1280-v3.dtsi"
 //#include "rp-lcd-mipi0-8-1200-1920.dtsi"
 //#include "rp-lcd-mipi0-10-800-1280-v3.dtsi"
@@ -257,6 +257,21 @@
     //vmmc-supply = <&vccio_sd_s0>;
 };
+
+&display_subsystem {
+clocks = <&hdptxphy_hdmi_clk0>, <&hdptxphy_hdmi_clk1>;
+clock-names = "hdmi0_phy_pll", "hdmi1_phy_pll";
+};
+
+&hdptxphy_hdmi_clk0 {
+            status = "okay";
+};
+
+&hdptxphy_hdmi_clk1 {
+            status = "okay";
+};
+
 &fiq_debugger {
     rockchip,baudrate = <115200>;
 };
(1-1/2)