meson-display: add mode check function [1/2]
PD#SWPL-139465
Problem:
S1A need support color space setting UI
Solution:
add mode check function
Verify:
ah212
Change-Id: I440e976906ea86e6d2726bd0a492e6ac70ad3eb7
Signed-off-by: limin.tian <limin.tian@amlogic.com>
diff --git a/display_framework/src/extension/display_settings/display_settings.c b/display_framework/src/extension/display_settings/display_settings.c
index 16798eb..730b604 100644
--- a/display_framework/src/extension/display_settings/display_settings.c
+++ b/display_framework/src/extension/display_settings/display_settings.c
@@ -20,6 +20,7 @@
#include "libdrm_meson/meson_drm_event.h"
#define DEFAULT_CARD "/dev/dri/card0"
#include "libdrm_meson/meson_drm_log.h"
+#include "linux/amlogic/drm/meson_drm.h"
int display_meson_get_open() {
int fd = -1;
@@ -785,5 +786,51 @@
display_meson_close(fd);
return ret;
}
+bool modeAttrSupportedCheck(char* modeName, ENUM_MESON_COLOR_SPACE colorSpace,
+ uint32_t colorDepth, MESON_CONNECTOR_TYPE connType )
+{
+ bool ret = false;
+ char attr[32] = {'\0'};
+ char color[5] = {'\0'};
+ int fd = -1;
+ if (modeName == NULL || colorSpace > MESON_COLOR_SPACE_YCBCR420 ||
+ ( connType != MESON_CONNECTOR_HDMIA && connType != MESON_CONNECTOR_HDMIB) ) {
+ ERROR("%s %d invalid parameters ", __FUNCTION__,__LINE__);
+ return ret;
+ }
+ switch ( colorSpace ) {
+ case MESON_COLOR_SPACE_RGB:
+ sprintf(color, "rgb");
+ break;
+ case MESON_COLOR_SPACE_YCBCR420:
+ sprintf(color, "420");
+ break;
+ case MESON_COLOR_SPACE_YCBCR422:
+ sprintf(color, "422");
+ break;
+ case MESON_COLOR_SPACE_YCBCR444:
+ sprintf(color, "444");
+ break;
+ default:
+ sprintf(color, "fail");
+ break;
+ }
+ snprintf(attr, sizeof(attr)-1, "%s,%dbit", color, colorDepth);
+ DEBUG("%s %d mode:%s attr:%s", __FUNCTION__,__LINE__,modeName, attr);
+ struct drm_mode_test_attr args;
+ memset(&args, 0, sizeof(struct drm_mode_test_attr));
+ strcpy(args.modename, modeName);
+ strcpy(args.attr, attr);
+ fd = display_meson_get_open();
+ DEBUG("%s %d drm fd:%d, args (%s %s)",__FUNCTION__,__LINE__, fd, args.modename, args.attr);
+ if (ioctl(fd, DRM_IOCTL_MESON_TESTATTR, &args) == 0) {
+ if (args.valid == 1)
+ ret = true;
+ } else {
+ ERROR("%s %d ioctl fail ", __FUNCTION__,__LINE__);
+ }
+ display_meson_close(fd);
+ return ret;
+}
diff --git a/display_framework/src/extension/display_settings/display_settings.h b/display_framework/src/extension/display_settings/display_settings.h
index 4752a47..337d3f6 100644
--- a/display_framework/src/extension/display_settings/display_settings.h
+++ b/display_framework/src/extension/display_settings/display_settings.h
@@ -124,6 +124,8 @@
int display_meson_set_open();
void display_meson_close(int fd);
+bool modeAttrSupportedCheck(char* modeName, ENUM_MESON_COLOR_SPACE colorSpace,
+ uint32_t colorDepth, MESON_CONNECTOR_TYPE connType );
#if defined(__cplusplus)
}
diff --git a/display_framework/src/extension/display_settings/display_settings_Test.c b/display_framework/src/extension/display_settings/display_settings_Test.c
index d28f150..4d2444a 100644
--- a/display_framework/src/extension/display_settings/display_settings_Test.c
+++ b/display_framework/src/extension/display_settings/display_settings_Test.c
@@ -165,7 +165,7 @@
else if(select_s == 1 && select_len == 1) {
printf("get:0->hdrPolicy 1->modeinfo 2->HDCP version 3->HDMI connected 4->color depth 5->color space"
" 6->EDID 7->hdcp auth status 8->supportedModesList 9->prefer mode 10->HDCP Content Type 11->Content Type"
- " 12->Dv Enable 13->active 14->vrr Enable 15->av mute 16->hdr mode 17->CvbsModesList\n");
+ " 12->Dv Enable 13->active 14->vrr Enable 15->av mute 16->hdr mode 17->CvbsModesList 18-> mode support check \n");
len = scanf("%d",&get);
if (get == 0 && len == 1) {
ENUM_MESON_HDR_POLICY value = getDisplayHDRPolicy( MESON_CONNECTOR_HDMIA);
@@ -289,6 +289,22 @@
printf("\n %s get Display cvbs ModesList fail\n",__FUNCTION__);
}
}
+ else if (get == 18 && len == 1) {
+ char mode[32] = {'\0'};
+ int color_space = 255;
+ int color_depth = 255;
+ bool ret = false;
+ printf("\n please input mode name:\n");
+ scanf("%s", mode);
+ printf("\n please input color space:\n");
+ scanf("%d", &color_space);
+ printf("\n please input color depth:\n");
+ scanf("%d", &color_depth);
+ ret = modeAttrSupportedCheck(mode, (ENUM_MESON_COLOR_SPACE)color_space,
+ color_depth, MESON_CONNECTOR_HDMIA );
+ printf("\n mode:%s color attr %d, depth %dbit, SupportedCheck:%d\n",
+ mode, color_space, color_depth, ret);
+ }
}
else {
printf("\n Incorrect input method\n");