meson_display: Provide settings for hdr_ Interface of policy [1/1]
PD#OTT-37900
Problem:
Through Mason_ drm_ set_ Prop does not work.
Solution:
At mesan_ Display layer encapsulation API setting hdr_ policy.
Verify:
AH212
Change-Id: Ie2b7ab17732da357c6b9f615e594d1fec04afbfc
Signed-off-by: chen.wang1 <chen.wang1@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 87270e6..daa3a57 100644
--- a/display_framework/src/extension/display_settings/display_settings.c
+++ b/display_framework/src/extension/display_settings/display_settings.c
@@ -17,8 +17,8 @@
#include <linux/string.h>
#include "display_settings.h"
#include "libdrm_meson/meson_drm_settings.h"
-#define DEFAULT_CARD "/dev/dri/card0"
#include "libdrm_meson/meson_drm_event.h"
+#define DEFAULT_CARD "/dev/dri/card0"
bool registerMesonDisplayEventCallback(mesonDisplayEventCallback cb) { //register callback
return RegisterDisplayEventCallback(cb);
@@ -75,3 +75,43 @@
close(fd);
return ret;
}
+
+int setDisplayHDRPolicy(ENUM_MESON_HDR_POLICY hdrPolicy, MESON_CONNECTOR_TYPE connType) {
+ int res = -1;
+ int ret = -1;
+ int fd = 0;
+ drmModeAtomicReq *req = NULL;
+ fd = open(DEFAULT_CARD, O_RDWR|O_CLOEXEC);
+ if (fd < 0) {
+ printf("\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+ return ret;
+ }
+ ret = drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);
+ if (ret) {
+ printf("no atomic setting support: %d\n",ret);
+ goto out;
+ }
+ req = drmModeAtomicAlloc();
+ if (req == NULL) {
+ printf("\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+ goto out;
+ }
+ res = meson_drm_setHDRPolicy(fd, req, hdrPolicy, connType);
+ if (res == -1) {
+ fprintf(stderr,"setHDRPolicyFail\n");
+ goto out;
+ }
+ ret = drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+ if (ret) {
+ fprintf(stderr, "failed to set HDR Policy: %d-%s\n", ret, strerror(errno));
+ goto out;
+ }
+out:
+ if (req) {
+ drmModeAtomicFree(req);
+ req = NULL;
+ }
+ 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 1d96879..082ce7d 100644
--- a/display_framework/src/extension/display_settings/display_settings.h
+++ b/display_framework/src/extension/display_settings/display_settings.h
@@ -30,6 +30,12 @@
MESONDISPLAY_EVENT_DISCONNECTED , //!< Display disconnected event.\n"
}ENUM_MESONDISPLAY_EVENT;
+typedef enum _ENUM_MESON_HDR_POLICY {
+ MESON_HDR_POLICY_FOLLOW_SINK = 0, //<---Always HDR--->//
+ MESON_HDR_POLICY_FOLLOW_SOURCE //<---Adaptive HDR--->//
+} ENUM_MESON_HDR_POLICY;
+
+int setDisplayHDRPolicy(ENUM_MESON_HDR_POLICY hdrPolicy, MESON_CONNECTOR_TYPE connType);
int setDisplayMode(DisplayMode* modeInfo,MESON_CONNECTOR_TYPE connType);
typedef void (*mesonDisplayEventCallback)(ENUM_MESONDISPLAY_EVENT enEvent, void *eventData/*Optional*/);
bool registerMesonDisplayEventCallback(mesonDisplayEventCallback cb);
@@ -39,4 +45,4 @@
}
#endif
-#endif
\ No newline at end of file
+#endif
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 f79ccda..83dc8d4 100644
--- a/display_framework/src/extension/display_settings/display_settings_Test.c
+++ b/display_framework/src/extension/display_settings/display_settings_Test.c
@@ -16,6 +16,7 @@
#include <errno.h>
#include <linux/string.h>
#include "display_settings.h"
+
void display_event( ENUM_MESONDISPLAY_EVENT enEvent, void *eventData/*Optional*/)
{
@@ -24,13 +25,12 @@
"Eevent:%d\n",enEvent);
}
-int main(void)
+int main()
{
- printf("\n 0->set hdmi mode 1->set cvbs mode 2-> event test\n");
+ printf("\n 0->set hdmi mode 1->set cvbs mode 2-> event test 3->setdisplay --hdrPolicy\n");
int select_s_g = 0;
DisplayMode* modeInfo = NULL;
modeInfo = (DisplayMode*)malloc(sizeof(DisplayMode));
-
scanf("%d",&select_s_g);
if (select_s_g == 0) {
printf("please input modeInfo:interlace, w, h, vrefresh\n");
@@ -48,12 +48,27 @@
}else{
printf("setDisplayModeFail\n");
}
- } else {
+ } else if(select_s_g == 2) {
registerMesonDisplayEventCallback(display_event);
startMesonDisplayUeventMonitor();
+ } else if (select_s_g == 3) {
+ printf("0->set Always Hdr 1->set Adaptive Hdr\n");
+ int Policy = 0;
+ scanf("%d",&Policy);
+ if (Policy == 0) {
+ if (setDisplayHDRPolicy(MESON_HDR_POLICY_FOLLOW_SINK,MESON_CONNECTOR_HDMIA) == 0) {
+ printf("set always hdr success\n");
+ }else{
+ printf("set always hdr fail\n");
+ }
+ } else if (Policy == 1){
+ if (setDisplayHDRPolicy(MESON_HDR_POLICY_FOLLOW_SOURCE,MESON_CONNECTOR_HDMIA) == 0) {
+ printf("set adaptive hdr success\n");
+ }else{
+ printf("set adaptive hdr fail\n");
+ }
+ }
}
return 0;
}
-
-