From 49f86563b3e34b7f877dfef8f6d400f268a0fe85 Mon Sep 17 00:00:00 2001 From: Firefly Date: Sat, 19 Dec 2015 17:29:12 +0800 Subject: [PATCH] [system/displayd] CVBS: rk3228: add read read screen info Fix CVBS can't display when HDMI accessed and pulled out in kernel stage. Signed-off-by: Firefly --- system/displayd/DisplayManager.cpp | 76 +++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/system/displayd/DisplayManager.cpp b/system/displayd/DisplayManager.cpp index e4070336bc..29c6a94c8b 100755 --- a/system/displayd/DisplayManager.cpp +++ b/system/displayd/DisplayManager.cpp @@ -32,6 +32,9 @@ #define CVBS_MODE_PAL "720x576i-50" #define CVBS_MODE_NTSC "720x480i-60" + +#define MAIN_SCREEN_INFO_FILE "/sys/class/graphics/fb0/screen_info" + enum { DISPLAY_INTERFACE_TV = 1, DISPLAY_INTERFACE_YPbPr, @@ -45,6 +48,22 @@ enum { DISPLAY_OPERATE_WRITE }; +enum { + SCREEN_NULL = 0, + SCREEN_RGB, + SCREEN_LVDS, + SCREEN_DUAL_LVDS, + SCREEN_MCU, + SCREEN_TVOUT, + SCREEN_HDMI, + SCREEN_MIPI, + SCREEN_DUAL_MIPI, + SCREEN_EDP, + SCREEN_TVOUT_TEST, + SCREEN_LVDS_10BIT, + SCREEN_DUAL_LVDS_10BIT +}; + #define HDMI_VIDEO_YUV420 (4 << 8) DisplayManager::DisplayManager() { @@ -112,6 +131,31 @@ void DisplayManager::init() { } } } + + #ifdef RK3228 + int fd, err, type = SCREEN_NULL, hdmiconnect = 0; + char *buf = NULL; + + fd = open(MAIN_SCREEN_INFO_FILE, O_RDONLY); + if (fd < 0) { + ALOGE("open screen info file error: %s", strerror(errno)); + return; + } else { + buf = (char*)malloc(BUFFER_LENGTH); + memset(buf, 0, BUFFER_LENGTH); + err = read(fd, buf, BUFFER_LENGTH); + if (err < 0) { + ALOGE("read screen info file error: %s", strerror(errno)); + free(buf); + close(fd); + return; + } + close(fd); + sscanf(buf, "%*[^:]:%*[^:]:%*[^:]:%*[^:]:%d", &type); + free(buf); + } + #endif + for(node = main_display_list; node != NULL; node = node->next) { operateIfaceMode(node, DISPLAY_OPERATE_WRITE, node->mode); if(node->enable == 1) { @@ -135,7 +179,20 @@ void DisplayManager::init() { operateIfaceMode(node, DISPLAY_OPERATE_WRITE, node->mode); node->enable = 1; #ifdef DISPLAY_POLICY_BOX - operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + #ifdef RK3228 + if (node->type == DISPLAY_INTERFACE_TV && + ((type != SCREEN_TVOUT) || + (type != SCREEN_TVOUT_TEST))) { + node->enable = 0; + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + node->enable = 1; + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + } else { + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + } + #else + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + #endif #endif updatesinkaudioinfo(node); break; @@ -155,7 +212,22 @@ void DisplayManager::init() { } else { for(node = main_display_list; node != NULL; node = node->next) { #ifdef DISPLAY_POLICY_BOX - operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + #ifdef RK3228 + if ((node->type == DISPLAY_INTERFACE_HDMI) && (node->connect == 1)) + hdmiconnect = 1; + if ((node->type == DISPLAY_INTERFACE_TV) && (node->enable == 1) && + ((type != SCREEN_TVOUT) || (type != SCREEN_TVOUT_TEST)) && + (hdmiconnect == 0)) { + node->enable = 0; + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + node->enable = 1; + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + } else { + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + } + #else + operateIfaceEnable(node, DISPLAY_OPERATE_WRITE); + #endif #endif } }