当前位置: 代码迷 >> 综合 >> 2021-03-17 RK3288 接PHILIPS 4K显示器HDMI开机概率性不显示的问题
  详细解决方案

2021-03-17 RK3288 接PHILIPS 4K显示器HDMI开机概率性不显示的问题

热度:95   发布时间:2023-11-27 12:38:13.0

 RK3288 接PHILIPS 4K显示器HDMI开机概率性不显示的问题

 

一、测试发现在philips显示器休眠的情况下,rk3288 开机后hmdi无法唤醒显示器。 

        cat /d/dw-hdmi/status
        PHY: disabled

       分析后发现是无法打开kernel\drivers\gpu\drm\bridge\synopsys\dw-hdmi.c dw_hdmi_bridge_enable

二、解决方案,检测到无法显示就:

          echo off      >/sys/devices/platform/display-subsystem/drm/card0/card0-HDMI-A-1/status 关闭

然后  echo detect >/sys/devices/platform/display-subsystem/drm/card0/card0-HDMI-A-1/status 打开

 

三、具体代码。

diff --git a/device/rockchip/rk3288/init.rk3288.rc b/device/rockchip/rk3288/init.rk3288.rc
index c624b15..a4ba933 100755
--- a/device/rockchip/rk3288/init.rk3288.rc
+++ b/device/rockchip/rk3288/init.rk3288.rc
@@ -47,6 +47,7 @@ on initchown root system /dev/cec0chmod 0664 /dev/cec0
+    chmod 0664 /d/dw-hdmi/statuson verity-loggingexec u:r:slideshow:s0 -- /sbin/slideshow warning/verity_red_1 warning/verity_red_2diff --git a/hardware/rockchip/hwcomposer/hwcomposer.cpp b/hardware/rockchip/hwcomposer/hwcomposer.cpp
index 5dc0ea2..5d0402a 100755
--- a/hardware/rockchip/hwcomposer/hwcomposer.cpp
+++ b/hardware/rockchip/hwcomposer/hwcomposer.cpp
@@ -4258,6 +4258,97 @@ void  *invalidate_refresh(void *arg)}#endif
+#define DW_HDMI_STATUS_PATH  "/d/dw-hdmi/status"
+
+static bool read_hdmi_status_from_node(const char *path, char *read_buf,unsigned char length)
+{
+	int ret, fd;
+	char statebuf[200];
+	//ALOGI("%s", __FUNCTION__);
+	memset(statebuf, 0, sizeof(statebuf));
+	fd = open(path, O_RDONLY);
+	if (fd < 0)
+		return -ENOENT;
+	ret = read(fd, statebuf, length);
+	close(fd);
+	if (ret < 0) {
+		ALOGE("read hdmi state err\n");
+		return -EINVAL;
+	}
+    memcpy(read_buf,statebuf,length);
+    return 0;
+}
+
+static bool set_hdmi_status(bool hdmi_enable)
+{
+  char acStatus[10];
+  int fd,ret = 0;
+
+  if(hdmi_enable == true)
+      strcpy(acStatus,"detect");
+  else
+      strcpy(acStatus,"off");
+
+  fd = open(HDMI_STATUS_PATH, O_RDWR, 0);
+  if(fd < 0)
+  {
+         ALOGE("Open hdmi_status_fd fail in %s",__FUNCTION__);
+         return 1;
+  }
+  ret = write(fd,acStatus,strlen(acStatus)+1);
+  if(ret < 0)
+  {
+      ALOGE("set hdmi status to %s falied, ret = %d", acStatus, ret);
+  }
+  close(fd);
+  return 0;
+}
+
+void  *giada_fix_rk3288_hdmi_display(void *arg)
+{
+    int  ret,boot_completed_number=0;
+	char hdmi_status[20],dw_hdmi_status[200];
+	char boot_completed_value[PROPERTY_VALUE_MAX];
+
+    while(true) 
+	{
+	  property_get( "sys.boot_completed", boot_completed_value, "0");
+	  if (!strcmp(boot_completed_value, "1")) 
+	  {
+		  ++boot_completed_number;
+		  memset(hdmi_status,0,sizeof(hdmi_status));
+		  ret=read_hdmi_status_from_node(HDMI_STATUS_PATH,hdmi_status,sizeof(hdmi_status));
+		  if (ret < 0) {
+			ALOGE("read hdmi status\n");
+		  }
+		  memset(dw_hdmi_status,0,sizeof(dw_hdmi_status));
+	      ret=read_hdmi_status_from_node(DW_HDMI_STATUS_PATH,dw_hdmi_status,sizeof(dw_hdmi_status));
+		  if (ret < 0) {
+			ALOGE("read dw_hdmi status\n");
+		  }
+		  ALOGI("**********[%s]**********boot_completed_number=%d boot_completed_value=%s \r\nhdmi status\r\n%s\r\ndw_hdmi_status\r\n%s",__FUNCTION__,boot_completed_number,boot_completed_value,hdmi_status,dw_hdmi_status); 
+          if ((!strcmp(hdmi_status, "connected\n"))&&(!strcmp(dw_hdmi_status, "PHY: disabled\n"))&&(boot_completed_number>=10))
+          {
+   			system("echo HDMIDISPALYERROR >>/data/hdmi_information_error.txt");
+   			ALOGE("########### ERROR:RK3288 HDMI DISPALY IS NOT NORMAL,TRY TO REOPEN IT!###########");  
+   			set_hdmi_status(false);
+   	        usleep(1000000);
+   			set_hdmi_status(true);
+          }else if ((!strcmp(hdmi_status, "connected\n"))&&(strcmp(dw_hdmi_status, "PHY: disabled\n")))
+          {
+            break;
+          }
+        
+	  } else
+	      ALOGE("********Android System Booting...........!********");
+		 
+      usleep(1000000);
+    }
+	ALOGI("RK3288 HDMI DISPLAY IS OK NOW!");
+    pthread_exit(NULL);
+    return NULL;
+}
+#if 0
void* hwc_control_3dmode_thread(void *arg){
@@ -4401,6 +4492,13 @@ static int hwc_device_open(const struct hw_module_t *module, const char *name,signal(SIGALRM, hwc_static_screen_opt_handler);#endif+    pthread_t detect_rk3288_dispaly;
+    if (pthread_create(&detect_rk3288_dispaly, NULL, giada_fix_rk3288_hdmi_display, ctx.get()))
+    {
+        ALOGE("Create detect_rk3288_dispaly thread error .");
+    }
+	else
+		ALOGI("Created detect_rk3288_dispaly pthread  ");#if 0init_thread_pamaters(&ctx->mControlStereo);ctx->fd_3d = open("/sys/class/display/HDMI/3dmode", O_RDWR, 0);

 

  相关解决方案