libdrm-meson: add porp enum / modify connector create flow [1/1]
PD#SWPL-87351
Problem:
enum function HDCP_AUTHMODE missing/connector double free
SWPL-87351/SWPL-87213
Solution:
add enum hdcp mode / modify connector create flow
Verify:
ap222
Change-Id: I8bcbf8035ff026bf753b5688dc77d7dd87bfe384
Signed-off-by: limin.tian <limin.tian@amlogic.com>
diff --git a/meson/meson_drm_display.c b/meson/meson_drm_display.c
index c6ba620..8ac5f8a 100644
--- a/meson/meson_drm_display.c
+++ b/meson/meson_drm_display.c
@@ -23,12 +23,8 @@
#ifndef XDG_RUNTIME_DIR
#define XDG_RUNTIME_DIR "/run"
#endif
-static int s_drm_fd = -1;
-struct mesonConnector* s_conn_HDMI = NULL;
static int meson_drm_setprop(int obj_id, char* prop_name, int prop_value );
-static bool meson_drm_init();
-static void meson_drm_deinit();
static uint32_t _getHDRSupportedList(uint64_t hdrlist, uint64_t dvlist);
struct mesonConnector* get_current_connector(int drmFd);
@@ -60,7 +56,6 @@
}
if (ret != 0 ) {
if (strcmp(xdgRunDir, XDG_RUNTIME_DIR) == 0) {
- printf("meson_drm_setprop: failed !!\n");
break;
}
xdgRunDir = XDG_RUNTIME_DIR;
@@ -70,38 +65,6 @@
return ret;
}
-static bool meson_drm_init()
-{
- bool ret = false;
- const char *card;
- card= getenv("WESTEROS_DRM_CARD");
- if ( !card ) {
- card = DEFAULT_CARD;
- }
- s_drm_fd = open(card, O_RDONLY|O_CLOEXEC);
- if ( s_drm_fd < 0 ) {
- printf("\n drm card:%s open fail\n",card);
- ret = false;
- goto exit;
- }
- s_conn_HDMI = mesonConnectorCreate(s_drm_fd, DRM_MODE_CONNECTOR_HDMIA);
- if ( !s_conn_HDMI ) {
- printf("\n create HDMI connector fail\n");
- ret = false;
- goto exit;
- }
- ret = true;
-exit:
- return ret;
-}
-
-static void meson_drm_deinit()
-{
- if (s_conn_HDMI)
- mesonConnectorDestroy(s_drm_fd,s_conn_HDMI);
- if (s_drm_fd >= 0 )
- close(s_drm_fd);
-}
static uint32_t _getHDRSupportedList(uint64_t hdrlist, uint64_t dvlist)
{
uint32_t ret = 0;
@@ -142,7 +105,7 @@
if (!mode) {
ret = -1;
} else {
- sprintf(modeSet, "%dx%d%cx%d", mode->w, mode->h, mode->interlace ? 'i':'p',mode->vrefresh);
+ sprintf(modeSet, "%dx%d%c%d", mode->w, mode->h, mode->interlace ? 'i':'p',mode->vrefresh);
do {
snprintf(cmdBuf, sizeof(cmdBuf)-1, "export XDG_RUNTIME_DIR=%s;westeros-gl-console set mode %s | grep \"Response\"",
xdgRunDir, modeSet);
@@ -164,7 +127,7 @@
}
if (ret != 0 ) {
if (strcmp(xdgRunDir, XDG_RUNTIME_DIR) == 0) {
- printf("meson_drm_setprop: failed !!\n");
+ printf("meson_drm_setMode: failed !!\n");
break;
}
xdgRunDir = XDG_RUNTIME_DIR;
@@ -176,67 +139,54 @@
int meson_drm_getMode(DisplayMode* modeInfo)
{
int ret = -1;
- char cmdBuf[512] = {'\0'};
- char output[64] = {'\0'};
- char* mode = NULL;
- int temp = -1;
- int w = 0, h = 0,refresh = 0;
- char interlace = '\0';
- char* xdgRunDir = getenv("XDG_RUNTIME_DIR");
- if (modeInfo == NULL)
+ struct mesonConnector* conn = NULL;
+ drmModeModeInfo* mode = NULL;
+ int drmFd = -1;
+ if (modeInfo == NULL) {
+ printf("\n %s %d modeInfo == NULL return\n",__FUNCTION__,__LINE__);
return ret;
-
- if (!xdgRunDir)
- xdgRunDir = XDG_RUNTIME_DIR;
- do {
- snprintf(cmdBuf, sizeof(cmdBuf)-1, "export XDG_RUNTIME_DIR=%s;westeros-gl-console get mode | grep \"Response\"",
- xdgRunDir);
- printf("Executing '%s'\n", cmdBuf);
- /* FIXME: popen in use */
- FILE* fp = popen(cmdBuf, "r");
- if (NULL != fp) {
- while (fgets(output, sizeof(output)-1, fp)) {
- if (strlen(output) && strstr(output, "[0:")) {
- mode = strstr(output, "[0:");
- sscanf(mode, "[0: mode %dx%d%cx%d]",&w, &h, &interlace, &refresh);
- printf("\n mode: %dx%d%cx%d\n", w, h, interlace, refresh);
- temp = 0;
- modeInfo->w = w;
- modeInfo->h = h;
- modeInfo->vrefresh = refresh;
- if (interlace == 'i')
- modeInfo->interlace = true;
- else
- modeInfo->interlace = false;
- ret = 0;
- }
- }
- pclose(fp);
+ }
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if ( conn ) {
+ mode = mesonConnectorGetCurMode(drmFd, conn);
+ if (mode) {
+ modeInfo->w = mode->hdisplay;
+ modeInfo->h = mode->vdisplay;
+ modeInfo->vrefresh = mode->vrefresh;
+ modeInfo->interlace = mode->flags & DRM_MODE_FLAG_INTERLACE;
+ strcpy(modeInfo->name, mode->name);
+ free(mode);
+ mode = NULL;
+ ret = 0;
} else {
- printf(" popen failed\n");
+ printf("\n %s %d mode get fail \n",__FUNCTION__,__LINE__);
}
- if (temp != 0 ) {
- if (strcmp(xdgRunDir, XDG_RUNTIME_DIR) == 0) {
- printf("meson_drm_setprop: failed !!\n");
- break;
- }
- xdgRunDir = XDG_RUNTIME_DIR;
- }
- } while ( temp != 0 );
+ } else {
+ printf("\n %s %d conn create fail \n",__FUNCTION__,__LINE__);
+ }
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
int meson_drm_getRxSurportedModes( DisplayMode** modes, int* modeCount )
{
int ret = -1;
- if (!meson_drm_init()) {
- printf("\n drm card open fail\n");
- goto out;
+ int drmFd = -1;
+ struct mesonConnector* conn = NULL;
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if (conn == NULL || drmFd < 0)
+ {
+ printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
}
drmModeModeInfo* modeall = NULL;
int count = 0;
int i = 0;
- if (0 != mesonConnectorGetModes(s_conn_HDMI, s_drm_fd, &modeall, &count))
+ if (0 != mesonConnectorGetModes(conn, drmFd, &modeall, &count))
goto out;
DisplayMode* modestemp = (DisplayMode*)calloc(count, sizeof(DisplayMode));
for (i = 0; i < count; i++)
@@ -251,7 +201,10 @@
*modes = modestemp;
ret = 0;
out:
- meson_drm_deinit();
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
int meson_drm_getRxPreferredMode( DisplayMode* mode)
@@ -260,11 +213,16 @@
int i = 0;
int count = 0;
drmModeModeInfo* modes = NULL;
- if (!meson_drm_init()) {
- printf("\n drm card open fail\n");
- goto out;
+ int drmFd = -1;
+ struct mesonConnector* conn = NULL;
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if (conn == NULL || drmFd < 0)
+ {
+ printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
}
- if (0 != mesonConnectorGetModes(s_conn_HDMI, s_drm_fd, &modes, &count))
+
+ if (0 != mesonConnectorGetModes(conn, drmFd, &modes, &count))
goto out;
for (i = 0; i < count; i++)
{
@@ -279,7 +237,10 @@
}
ret = 0;
out:
- meson_drm_deinit();
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
@@ -289,11 +250,15 @@
int i = 0;
int count = 0;
char* edid_data = NULL;
- if (!meson_drm_init()) {
- printf("\n drm card open fail\n");
- goto out;
+ int drmFd = -1;
+ struct mesonConnector* conn = NULL;
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if (conn == NULL || drmFd < 0)
+ {
+ printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
}
- if (0 != mesonConnectorGetEdidBlob(s_conn_HDMI, &count, &edid_data))
+ if (0 != mesonConnectorGetEdidBlob(conn, &count, &edid_data))
goto out;
char* edid = (char*)calloc(count, sizeof(char));
for (i = 0; i < count; i++)
@@ -304,7 +269,10 @@
*data = edid;
ret = 0;
out:
- meson_drm_deinit();
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
@@ -317,20 +285,31 @@
ENUM_MESON_DRM_CONNECTION meson_drm_getConnection()
{
ENUM_MESON_DRM_CONNECTION ret = MESON_DRM_UNKNOWNCONNECTION;
- if (meson_drm_init()) {
+ int drmFd = -1;
+ struct mesonConnector* conn = NULL;
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if (conn == NULL || drmFd < 0)
+ {
+ printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
+ }
+ if (conn) {
int ConnectState = -1;
- ConnectState = mesonConnectorGetConnectState(s_conn_HDMI);
+ ConnectState = mesonConnectorGetConnectState(conn);
if (ConnectState == 1) {
ret = MESON_DRM_CONNECTED;
} else if (ConnectState == 2) {
ret = MESON_DRM_DISCONNECTED;
} else {
ret = MESON_DRM_UNKNOWNCONNECTION;
- meson_drm_deinit();
}
} else {
printf("\n drm open fail\n");
}
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
@@ -344,34 +323,39 @@
printf("\n%s %d invalid para\n",__FUNCTION__,__LINE__);
goto out;
}
- if (!meson_drm_init()) {
- printf("\n drm card open fail\n");
+ int drmFd = -1;
+ struct mesonConnector* conn = NULL;
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if (conn == NULL || drmFd < 0)
+ {
+ printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
goto out;
}
switch (enProp)
{
case ENUM_DRM_PROP_HDMI_ENABLE:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
sprintf( propName, "%s", MESON_DRM_HDMITX_PROP_AVMUTE);
prop_value = prop_value ? 0:1;
break;
}
case ENUM_DRM_PROP_HDMITX_EOTF:
{
- objID = mesonConnectorGetCRTCId(s_conn_HDMI);
+ objID = mesonConnectorGetCRTCId(conn);
sprintf( propName, "%s", MESON_DRM_HDMITX_PROP_EOTF);
break;
}
case ENUM_DRM_PROP_CONTENT_PROTECTION:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_CONTENT_PROTECTION);
break;
}
case ENUM_DRM_PROP_HDCP_VERSION:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_CONTENT_TYPE);
if (ENUM_HDCP_VERSION_FORCE_1_4 == prop_value)
{
@@ -382,19 +366,19 @@
}
case ENUM_DRM_PROP_HDR_POLICY:
{
- objID = mesonConnectorGetCRTCId(s_conn_HDMI);
+ objID = mesonConnectorGetCRTCId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_TX_HDR_POLICY);
break;
}
case ENUM_DRM_PROP_HDMI_ASPECT_RATIO:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_TX_ASPECT_RATIO);
break;
}
case ENUM_DRM_PROP_HDMI_DV_ENABLE:
{
- objID = mesonConnectorGetCRTCId(s_conn_HDMI);
+ objID = mesonConnectorGetCRTCId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_DV_ENABLE);
}
default:
@@ -403,7 +387,7 @@
meson_drm_setprop(objID, propName, prop_value);
if (enProp == ENUM_DRM_PROP_HDCP_VERSION)
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_HDCP_PRIORITY);
int priority = 0;
if (force1_4)
@@ -412,9 +396,12 @@
}
meson_drm_setprop(objID, propName, priority);
}
- meson_drm_deinit();
ret = 0;
out:
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
@@ -428,86 +415,99 @@
printf("\n%s %d invalid para\n",__FUNCTION__,__LINE__);
goto out;
}
- if (!meson_drm_init()) {
- printf("\n drm card open fail\n");
+ int drmFd = -1;
+ struct mesonConnector* conn = NULL;
+ drmFd = meson_drm_open();
+ conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+ if (conn == NULL || drmFd < 0)
+ {
+ printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
goto out;
}
switch (enProp)
{
case ENUM_DRM_PROP_HDMI_ENABLE:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", MESON_DRM_HDMITX_PROP_AVMUTE);
break;
}
case ENUM_DRM_PROP_HDMITX_EOTF:
{
- objID = mesonConnectorGetCRTCId(s_conn_HDMI);
+ objID = mesonConnectorGetCRTCId(conn);
objtype = DRM_MODE_OBJECT_CRTC;
sprintf( propName, "%s", MESON_DRM_HDMITX_PROP_EOTF);
break;
}
case ENUM_DRM_PROP_CONTENT_PROTECTION:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_CONTENT_PROTECTION);
break;
}
case ENUM_DRM_PROP_HDCP_VERSION:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_CONTENT_TYPE);
break;
}
case ENUM_DRM_PROP_HDR_POLICY:
{
- objID = mesonConnectorGetCRTCId(s_conn_HDMI);
+ objID = mesonConnectorGetCRTCId(conn);
sprintf( propName, "%s", DRM_CONNECTOR_PROP_TX_HDR_POLICY);
objtype = DRM_MODE_OBJECT_CRTC;
break;
}
case ENUM_DRM_PROP_GETRX_HDCP_SUPPORTED_VERS:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_RX_HDCP_SUPPORTED_VER);
break;
}
case ENUM_DRM_PROP_GETRX_HDR_CAP:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_RX_HDR_CAP);
break;
}
case ENUM_DRM_PROP_GETTX_HDR_MODE:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_TX_HDR_MODE);
break;
}
case ENUM_DRM_PROP_HDMI_ASPECT_RATIO:
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_TX_ASPECT_RATIO);
break;
}
case ENUM_DRM_PROP_HDMI_DV_ENABLE:
{
- objID = mesonConnectorGetCRTCId(s_conn_HDMI);
+ objID = mesonConnectorGetCRTCId(conn);
objtype = DRM_MODE_OBJECT_CRTC;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_DV_ENABLE);
+ break;
+ }
+ case ENUM_DRM_PROP_GETRX_HDCP_AUTHMODE:
+ {
+ objID = mesonConnectorGetId(conn);
+ objtype = DRM_MODE_OBJECT_CONNECTOR;
+ sprintf( propName, "%s", DRM_CONNECTOR_PROP_TX_HDCP_AUTH_MODE);
+ break;
}
default:
break;
}
struct mesonProperty* meson_prop = NULL;
- meson_prop = mesonPropertyCreate(s_drm_fd, objID, objtype, propName);
+ meson_prop = mesonPropertyCreate(drmFd, objID, objtype, propName);
if (!meson_prop) {
printf("\n meson_prop create fail\n");
goto out;
@@ -520,11 +520,11 @@
if (enProp == ENUM_DRM_PROP_GETRX_HDR_CAP)
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_RX_DV_CAP);
struct mesonProperty* meson_prop_dv = NULL;
- meson_prop_dv = mesonPropertyCreate(s_drm_fd, objID, objtype, propName);
+ meson_prop_dv = mesonPropertyCreate(drmFd, objID, objtype, propName);
uint64_t value_2 = mesonPropertyGetValue(meson_prop_dv);
mesonPropertyDestroy(meson_prop_dv);
*prop_value = _getHDRSupportedList(value, value_2);
@@ -543,11 +543,11 @@
{
if (*prop_value == 0)
{
- objID = mesonConnectorGetId(s_conn_HDMI);
+ objID = mesonConnectorGetId(conn);
objtype = DRM_MODE_OBJECT_CONNECTOR;
sprintf( propName, "%s", DRM_CONNECTOR_PROP_HDCP_PRIORITY);
struct mesonProperty* meson_prop_HDCP = NULL;
- meson_prop_HDCP = mesonPropertyCreate(s_drm_fd, objID, objtype, propName);
+ meson_prop_HDCP = mesonPropertyCreate(drmFd, objID, objtype, propName);
uint64_t value_3 = mesonPropertyGetValue(meson_prop_HDCP);
mesonPropertyDestroy(meson_prop_HDCP);
printf("\n prop value:%llu objID:%d,name:%s\n",value_3, objID,propName);
@@ -556,9 +556,12 @@
}
}
mesonPropertyDestroy(meson_prop);
- meson_drm_deinit();
ret = 0;
out:
+ if (conn)
+ mesonConnectorDestroy(drmFd,conn);
+ if (drmFd >= 0 )
+ close(drmFd);
return ret;
}
@@ -593,7 +596,7 @@
void meson_drm_close_fd(int drmFd)
{
if (drmFd >= 0)
- close(s_drm_fd);
+ close(drmFd);
}
int meson_drm_get_vblank_time(int drmFd, int nextVsync,uint64_t *vblankTime, uint64_t *refreshInterval)
diff --git a/meson/meson_drm_display.h b/meson/meson_drm_display.h
index 8daa6b0..85e4b79 100644
--- a/meson/meson_drm_display.h
+++ b/meson/meson_drm_display.h
@@ -50,6 +50,7 @@
ENUM_DRM_PROP_GETRX_HDCP_SUPPORTED_VERS,
ENUM_DRM_PROP_GETRX_HDR_CAP,
ENUM_DRM_PROP_GETTX_HDR_MODE,
+ ENUM_DRM_PROP_GETRX_HDCP_AUTHMODE,
ENUM_DRM_PROP_HDMI_ASPECT_RATIO,
ENUM_DRM_PROP_HDMI_DV_ENABLE,
ENUM_DRM_PROP_MAX
diff --git a/meson/meson_drm_display_test.c b/meson/meson_drm_display_test.c
index 41c71a7..31d877d 100644
--- a/meson/meson_drm_display_test.c
+++ b/meson/meson_drm_display_test.c
@@ -43,8 +43,7 @@
DisplayMode mode;
if (meson_drm_getMode(&mode) == 0) {
printf("\n mode (%d %d %d %d)\n",mode.w, mode.h, mode.vrefresh, mode.interlace);
- }
-
+ }
} else if (get == 3) {
meson_drm_get_prop(ENUM_DRM_PROP_HDMITX_EOTF, &value);
printf("\n EOTF:%d\n",value);
@@ -67,7 +66,7 @@
printf("\n mode count:%d\n",count);
int i = 0;
for (int i=0; i<count; i++) {
- printf(" (%s %d %d %d)\n", modes[i].name, modes[i].w, modes[i].h, modes[i].interlace);
+ printf(" (%s %d %d %d %d)\n", modes[i].name, modes[i].w, modes[i].h, modes[i].interlace,modes[i].vrefresh);
}
if (modes)
free(modes);
@@ -133,9 +132,18 @@
}
}
else if (get == 14) {
- // need to do:get HDCP status from property:
- // Content Protection,HDCP Content Type, HDCP_CONTENT_TYPE0_PRIORITY
- printf("\n need to do\n");
+ if (0 == meson_drm_get_prop( ENUM_DRM_PROP_GETRX_HDCP_AUTHMODE, &value)) {
+ if (value & 0x1)
+ printf("\n HDCP 14\n");
+ if (value & 0x2)
+ printf("\n HDCP 22\n");
+ if (value & 0x8)
+ printf("\n success\n");
+ else
+ printf("\n fail\n");
+ } else {
+ printf("\n meson_drm_get_prop fail\n");
+ }
}
else if (get == 15) {
if (0 == meson_drm_get_prop( ENUM_DRM_PROP_HDMI_ASPECT_RATIO, &value)) {
diff --git a/meson/meson_drm_event.c b/meson/meson_drm_event.c
index b7f4381..773141b 100644
--- a/meson/meson_drm_event.c
+++ b/meson/meson_drm_event.c
@@ -23,7 +23,6 @@
#define LIBUDEV_EVT_TYPE_KERNEL "kernel"
#define LIBUDEV_SUBSYSTEM_DRM "drm"
-//static pthread_t event_monitor_threadId;
static bool isMonitoringAlive = false;
displayEventCallback _DisplayEventCb = NULL;
static void* uevent_monitor_thread(void *arg);
@@ -61,10 +60,16 @@
}
bool get_hdcp_status(ENUM_HDCP_STATUS *status)
{
- // need to do:get HDCP status from property:
- // Content Protection,HDCP Content Type, HDCP_CONTENT_TYPE0_PRIORITY
- *status = HDCP_STATUS_AUTHENTICATED;
- return true;
+ uint32_t prop_value = 0;
+ if (meson_drm_get_prop( ENUM_DRM_PROP_GETRX_HDCP_AUTHMODE, &prop_value ) == 0) {
+ if (!!(prop_value & 0x8))
+ *status = HDCP_STATUS_AUTHENTICATED;
+ else
+ *status = HDCP_STATUS_AUTHENTICATIONFAILURE;
+ return true;
+ } else {
+ return false;
+ }
}
static void* uevent_monitor_thread(void *arg)