diff --git a/meson/libdrm_meson_connector.c b/meson/libdrm_meson_connector.c
index d4e66ef..0ebb26c 100644
--- a/meson/libdrm_meson_connector.c
+++ b/meson/libdrm_meson_connector.c
@@ -60,12 +60,12 @@
 	res= drmModeGetResources( drmFd );
 	ret = (struct mesonConnector*)calloc( 1,sizeof(struct mesonConnector) );
 	if ( !ret ) {
-		DEBUG("mesonConnectorCreate:mesonConnector create fail");
+		ERROR("%s %d mesonConnector create fail",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if ( !res )
 	{
-		ERROR("mesonConnectorCreate: failed to get resources from drmFd (%d)", drmFd);
+		ERROR("%s %d failed to get resources from drmFd (%d)", __FUNCTION__,__LINE__,drmFd);
 		ret = NULL;
 		goto exit;
 	}
@@ -96,7 +96,7 @@
 		if (cur_encoder)
 			ret->crtc_id = cur_encoder->crtc_id;
 		else {
-			DEBUG("cur encoder not exit, get crtcs[0]:%d ",res->crtcs[0]);
+			DEBUG("%s %d cur encoder not exit, get crtcs[0]:%d ",__FUNCTION__,__LINE__,res->crtcs[0]);
 			ret->crtc_id = res->crtcs[0];
 		}
 		drmModeFreeEncoder(cur_encoder);
@@ -104,7 +104,7 @@
 		if (ret->count_modes > 0) {
 			modes_info =  (drmModeModeInfo*)calloc( ret->count_modes, sizeof(drmModeModeInfo) );
 			if (!modes_info) {
-				ERROR("mesonConnectorCreate:calloc fail");
+				ERROR("%s %d calloc fail",__FUNCTION__,__LINE__);
 				goto exit;
 			}
 			memcpy(modes_info, conn->modes, ret->count_modes *sizeof(drmModeModeInfo));
@@ -150,15 +150,15 @@
 	conn= drmModeGetConnector( drmFd, connector->id );
 	//ret = (struct mesonConnector*)calloc( 1,sizeof(struct mesonConnector) );
 	if ( !connector ) {
-		ERROR("mesonConnectorUpdate:invalid parameters ");
+		ERROR("%s %d invalid parameters ",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if ( !ret ) {
-		DEBUG("mesonConnectorUpdate:mesonConnector create fail");
+		ERROR("%s %d mesonConnector create fail",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if ( !conn ) {
-		INFO("mesonConnectorCreate: unable to get connector for drmfd (%d) conn_id(%d)\n", drmFd,connector->id);
+		ERROR("%s %d mesonConnectorCreate: unable to get connector for drmfd (%d) conn_id(%d)\n",__FUNCTION__,__LINE__, drmFd,connector->id);
 	goto exit;
 	}
 	if ( conn ) {
@@ -229,7 +229,7 @@
 	if ( connector ) {
 		return connector->id;
 	} else {
-		ERROR("mesonConnectorGetId:invalid parameters");
+		ERROR("%s %d invalid parameters",__FUNCTION__,__LINE__);
 		return 0;
 	}
 }
@@ -238,7 +238,7 @@
 {
 	int ret = -1;
 	if ( !connector || !count_modes ) {
-		ERROR("mesonConnectorGetModes:invalid parameters ");
+		ERROR("%s %d invalid parameters ",__FUNCTION__,__LINE__);
 	} else {
 		*count_modes = connector->count_modes;
 		*modes = connector->modes;
@@ -251,7 +251,7 @@
 {
 	int ret = -1;
 	if ( !connector || !data_Len ) {
-		ERROR("mesonConnectorGetEdidBlob:invalid parameters ");
+		ERROR("%s %d invalid parameters ",__FUNCTION__,__LINE__);
 	} else {
 		*data_Len = connector->edid_data_Len;
 		*data = connector->edid_data;
@@ -264,7 +264,7 @@
 {
 	int ret = -1;
 	if ( !connector ) {
-			ERROR("mesonConnectorGetConnectState:invalid parameters ");
+			ERROR("%s %d invalid parameters ",__FUNCTION__,__LINE__);
 	} else {
 		ret = connector->connection;
 	}
@@ -274,7 +274,7 @@
 {
 	int ret = -1;
 	if ( !connector ) {
-		ERROR("mesonConnectorGetCRTCId:invalid parameters ");
+		ERROR("%s %d invalid parameters ",__FUNCTION__,__LINE__);
 	} else {
 		ret = connector->crtc_id;
 	}
@@ -299,17 +299,17 @@
 	int j = 0;
 	drmModeModeInfo* mode = NULL;
 	if (connector) {
-		DEBUG("\n connector:\n");
-		DEBUG("id:%d\n",connector->id);
-		DEBUG("type:%d\n",connector->type);
-		DEBUG("connection:%d\n",connector->connection);
-		DEBUG("count_modes:%d\n",connector->count_modes);
-		DEBUG("modes:\n");
-		DEBUG("\tname refresh (Hz) hdisp hss hse htot vdisp "
-				   "vss vse vtot)\n");
+		DEBUG("%s %d connector",__FUNCTION__,__LINE__);
+		DEBUG("%s %d id: %d",__FUNCTION__,__LINE__,connector->id);
+		DEBUG("%s %d type: %d",__FUNCTION__,__LINE__,connector->type);
+		DEBUG("%s %d connection: %d",__FUNCTION__,__LINE__,connector->connection);
+		DEBUG("%s %d count_modes: %d",__FUNCTION__,__LINE__,connector->count_modes);
+		DEBUG("%s %d modes: ",__FUNCTION__,__LINE__);
+		DEBUG("%s %d \tname refresh (Hz) hdisp hss hse htot vdisp "
+				   "vss vse vtot)",__FUNCTION__,__LINE__);
 		for (j = 0; j < connector->count_modes; j++) {
 			mode = &connector->modes[j];
-			printf("  %s %d %d %d %d %d %d %d %d %d %d",
+			INFO("  %s %d %d %d %d %d %d %d %d %d %d",
 			mode->name,
 			mode->vrefresh,
 			mode->hdisplay,
@@ -322,13 +322,13 @@
 			mode->vtotal,
 			mode->clock);
 		}
-		INFO("edid_data_Len:%d\n",connector->edid_data_Len);
-		DEBUG("edid\n");
+		DEBUG("%s %d edid_data_Len: %d",__FUNCTION__,__LINE__,connector->edid_data_Len);
+		DEBUG("%s %d edid",__FUNCTION__,__LINE__);
 		for (i = 0; i < connector->edid_data_Len; i++) {
 			if (i % 16 == 0)
-				printf("\n\t\t\t");
-			INFO("%.2hhx", connector->edid_data[i]);
+				DEBUG("\n\t\t\t");
+			INFO("%s %d %.2hhx",__FUNCTION__,__LINE__, connector->edid_data[i]);
 		}
-		printf("\n");
+		DEBUG("\n");
 	}
 }
diff --git a/meson/libdrm_meson_property.c b/meson/libdrm_meson_property.c
index 25acbc3..210f29b 100644
--- a/meson/libdrm_meson_property.c
+++ b/meson/libdrm_meson_property.c
@@ -31,17 +31,17 @@
 	uint64_t* values_temp = NULL;
 	uint32_t* blob_ids_temp = NULL;
 	if ( !props ) {
-		DEBUG("\t No properties:mesonPropertyCreate \n");
+		ERROR("%s %d No properties ",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	prop = (drmModePropertyPtr)calloc( 1, sizeof(drmModePropertyRes));
 	if ( !prop ) {
-		ERROR("mesonPropertyCreate alloc fail");
+		ERROR("%s %d alloc fail",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	ret = (struct mesonProperty*)calloc( 1,sizeof(struct mesonProperty) );
 	if ( !ret ) {
-		DEBUG("mesonPropertyCreate alloc mesonProperty fail");
+		ERROR("%s %d alloc mesonProperty fail",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	for (i = 0; i < props->count_props; i++) {
@@ -114,13 +114,13 @@
 	uint64_t* values_temp = NULL;
 	uint32_t* blob_ids_temp = NULL;
 	if ( !mesonProp ) {
-		ERROR("mesonPropertyUpdateValue invalid parameter" );
+		ERROR("%s %d invalid parameter ",__FUNCTION__,__LINE__);
 		ret = -1;
 		goto exit;
 	}
 	props = drmModeObjectGetProperties(drmFd, mesonProp->mComponentId, mesonProp->drmObjectType);
 	if ( !props ) {
-		INFO("No properties:mesonPropertyUpdateValue ");
+		ERROR("%s %d No properties",__FUNCTION__,__LINE__);
 		ret = -1;
 		goto exit;
 	}
@@ -186,7 +186,7 @@
 	if ( mesonProp ) {
 		ret = mesonProp->prop_ptr->prop_id;
 	} else {
-		ERROR("mesonPropertyGetId invalid parameter ");
+		ERROR("%s %d invalid parameter ",__FUNCTION__,__LINE__);
 	}
 	return ret;
 }
@@ -197,7 +197,7 @@
 	if ( mesonProp ) {
 		ret = mesonProp->mValue;
 	} else {
-		ERROR("mesonPropertyGetValue invalid parameter ");
+		ERROR("%s %d invalid parameter ",__FUNCTION__,__LINE__);
 	}
 	return ret;
 }
@@ -208,7 +208,7 @@
 	if ( mesonProp ) {
 		ret = mesonProp->mType;
 	} else {
-		ERROR("mesonPropertyGetType invalid parameter ");
+		ERROR("%s %d invalid parameter ",__FUNCTION__,__LINE__);
 	}
 	return ret;
 }
@@ -228,7 +228,7 @@
 		mesonProperty = NULL;
 		ret  = 0;
 	} else {
-		DEBUG("No properties:mesonPropertyUpdateValue ");
+		DEBUG("%s %d No properties:mesonProperty ",__FUNCTION__,__LINE__);
 	}
 	return ret;
 }
@@ -239,11 +239,11 @@
 	drmModePropertyBlobPtr blobProp =  NULL;
 	char *blob_data = NULL;
 	if (!mseonProp || !len ) {
-		ERROR(" mesonPropertyGetBlobData invalid parameter");
+		ERROR("%s %d invalid parameter",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if (!drm_property_type_is(mseonProp->prop_ptr, DRM_MODE_PROP_BLOB)) {
-		DEBUG(" mesonPropertyGetBlobData invalid parameter is not a blob property!!!");
+		ERROR("%s %d invalid parameter is not a blob property!!!",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if ( mseonProp && len ) {
@@ -259,7 +259,7 @@
 			*data = blob_data;
 		}
 		else
-			ERROR("mesonPropertyCreate alloc mesonProperty fail");
+			ERROR("%s %d mesonPropertyCreate alloc mesonProperty fail",__FUNCTION__,__LINE__);
 		drmModeFreePropertyBlob(blobProp);
 		ret = 0;
 	}
@@ -270,7 +270,7 @@
 {
 	int ret = -1;
 	if ( !mesonProp || !min || !max ) {
-		ERROR("mesonPropertyGetRange invalid parameter ");
+		ERROR("%s %d mesonPropertyGetRange invalid parameter ",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_SIGNED_RANGE) || drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_RANGE)) {
@@ -278,7 +278,7 @@
 		*max = mesonProp->prop_ptr->values[1];
 		ret = 0;
 	} else {
-		DEBUG("mesonPropertyGetRange invalid parameter，not a range property ");
+		ERROR("%s %d invalid parameter，not a range property ",__FUNCTION__,__LINE__);
 	}
 exit:
 	return ret;
@@ -289,11 +289,11 @@
 {
 	int ret = -1;
 	if ( !mesonProp || !len || !enumTypes ) {
-		ERROR("\t mesonPropertyGetEnumTypes invalid parameter\n");
+		ERROR("%s %d mesonPropertyGetEnumTypes invalid parameter",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if ( !mesonProp->prop_ptr ) {
-		DEBUG("\t mesonPropertyGetEnumTypes invalid parameter\n");
+		DEBUG("%s %d  mesonPropertyGetEnumTypes invalid parameter",__FUNCTION__,__LINE__);
 		goto exit;
 	}
 	if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_ENUM)) {
@@ -301,7 +301,7 @@
 		*enumTypes = mesonProp->prop_ptr->enums;
 		ret = 0;
 	} else {
-		DEBUG("mesonPropertyGetRange invalid parameter，not a enum property ");
+		DEBUG("%s %d mesonPropertyGetRange invalid parameter，not a enum property ",__FUNCTION__,__LINE__);
 	}
 exit:
 	return ret;
@@ -309,52 +309,52 @@
 
 void dump_property(struct mesonProperty* mesonProp,int drmFd)
 {
-	DEBUG("dump_property ");
+	DEBUG("%s %d dump_property ",__FUNCTION__,__LINE__);
 	int i = 0;
 	if (mesonProp) {
-		DEBUG("name:%s\n",mesonProp->prop_ptr->name );
-		DEBUG("mComponentId:%d\n",mesonProp->mComponentId);
-		DEBUG("drmObjectType:%d\n",mesonProp->drmObjectType );
-		DEBUG("prop id:%d\n",mesonPropertyGetId(mesonProp) );
-		DEBUG("\t\tflags:" );
+		DEBUG("%s %d name:%s",__FUNCTION__,__LINE__,mesonProp->prop_ptr->name );
+		DEBUG("%s %d mComponentId:%d",__FUNCTION__,__LINE__,mesonProp->mComponentId);
+		DEBUG("%s %d drmObjectType:%d\n",__FUNCTION__,__LINE__,mesonProp->drmObjectType );
+		DEBUG("%s %d prop id:%d\n",__FUNCTION__,__LINE__,mesonPropertyGetId(mesonProp) );
+		DEBUG("%s %d \t\tflags:",__FUNCTION__,__LINE__);
 		if (mesonProp->drmObjectType & DRM_MODE_PROP_PENDING)
-			INFO(" pending");
+			INFO("%s %d pending",__FUNCTION__,__LINE__);
 		if (mesonProp->drmObjectType & DRM_MODE_PROP_IMMUTABLE)
-			INFO(" immutable");
+			INFO("%s %d immutable",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_SIGNED_RANGE))
-			INFO(" signed range");
+			INFO("%s %d signed range",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_RANGE))
-			INFO(" range");
+			INFO("%s %d range",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_ENUM))
-			INFO(" enum");
+			INFO("%s %d enum",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_BITMASK))
-			INFO(" bitmask");
+			INFO("%s %d bitmask",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_BLOB))
-			INFO(" blob");
+			INFO("%s %d blob",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_OBJECT))
-			INFO(" object");
-		printf("\n");
-		INFO("mValue:%d\n",(int)mesonProp->mValue);
+			INFO("%s %d object",__FUNCTION__,__LINE__);
+		DEBUG("\n");
+		INFO("%s %d mValue: %d",__FUNCTION__,__LINE__,(int)mesonProp->mValue);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_SIGNED_RANGE) ||
 			drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_RANGE) ) {
-			DEBUG("\t\t range:");
+			DEBUG("%s %d range:",__FUNCTION__,__LINE__);
 			uint64_t min = 0;
 			uint64_t max = 0;
 			mesonPropertyGetRange(mesonProp, &min, &max);
-			DEBUG("min:%d max:%d\n", (int)min, (int)max );
-			printf("\n");
+			DEBUG("%s %d min:%d max:%d\n",__FUNCTION__,__LINE__, (int)min, (int)max );
+			DEBUG("\n");
 		}
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_ENUM)) {
-			DEBUG("\t\tflags:" );
+			DEBUG("%s %d \t\tflags:",__FUNCTION__,__LINE__);
 			int enumTypeLen = 0;
 			struct drm_mode_property_enum** enumTypes = NULL;
 			mesonPropertyGetEnumTypes(mesonProp, &enumTypeLen, enumTypes );
-			INFO("enumTypeLen:%d\n",enumTypeLen);
+			DEBUG("%s %d enumTypeLen:%d\n",__FUNCTION__,__LINE__,enumTypeLen);
 			for ( i=0; i<enumTypeLen; i++ ) {
-				INFO("%s=%llu",(*enumTypes)[i].name,(*enumTypes)[i].value);
+				INFO("%s %d %s=%llu",__FUNCTION__,__LINE__,(*enumTypes)[i].name,(*enumTypes)[i].value);
 			}
 		}
-		DEBUG("\t\blob:");
+		DEBUG("%s %d \t\blob:",__FUNCTION__,__LINE__);
 		if (drm_property_type_is(mesonProp->prop_ptr, DRM_MODE_PROP_BLOB)) {
 			int blob_len = 0;
 			char** blob_data = NULL;
@@ -363,9 +363,9 @@
 			for (i = 0; i < blob_len; i++) {
 				if (i % 16 == 0)
 					printf("\n\t\t\t");
-				INFO("%x", (*blob_data)[i]);
+				INFO("%s %d %x", __FUNCTION__,__LINE__,(*blob_data)[i]);
 			}
-			printf("\n");
+			DEBUG("\n");
 			free(blob_data);
 		}
 	}
diff --git a/meson/meson_drm_display.c b/meson/meson_drm_display.c
index eb1bf8f..5d53c44 100644
--- a/meson/meson_drm_display.c
+++ b/meson/meson_drm_display.c
@@ -34,7 +34,7 @@
 static int meson_drm_setprop(int obj_id, char* prop_name, int prop_value )
 {
     int ret = -1;
-    DEBUG("meson_drm_setprop: obj_id %d, prop_name: %s, prop_value:%d",obj_id, prop_name,prop_value);
+    DEBUG("%s %d obj_id %d, prop_name: %s, prop_value:%d",__FUNCTION__,__LINE__,obj_id, prop_name,prop_value);
     char* xdgRunDir = getenv("XDG_RUNTIME_DIR");
     if (!xdgRunDir)
         xdgRunDir = XDG_RUNTIME_DIR;
@@ -43,19 +43,19 @@
             char cmdBuf[512] = {'\0'};
             snprintf(cmdBuf, sizeof(cmdBuf)-1, "export XDG_RUNTIME_DIR=%s;westeros-gl-console set property -s %d:%s:%d | grep \"Response\"",
                     xdgRunDir, obj_id, prop_name, prop_value);
-            DEBUG("Executing '%s'\n", cmdBuf);
+            DEBUG("%s %d Executing '%s'\n", __FUNCTION__,__LINE__,cmdBuf);
             FILE* fp = popen(cmdBuf, "r");
             if (NULL != fp) {
                 char output[64] = {'\0'};
                 while (fgets(output, sizeof(output)-1, fp)) {
                     if (strlen(output) && strstr(output, "[0:")) {
                         ret = 0;
-                        DEBUG("\n meson_drm_setprop:%s\n",output);
+                        DEBUG("%s %d output:%s",__FUNCTION__,__LINE__,output);
                     }
                 }
                 pclose(fp);
             } else {
-                ERROR("meson_drm_setprop: popen failed");
+            ERROR("%s %d open failed",__FUNCTION__,__LINE__);
             }
             if (ret != 0 ) {
                 if (strcmp(xdgRunDir, XDG_RUNTIME_DIR) == 0) {
@@ -71,7 +71,7 @@
 static uint32_t _getHDRSupportedList(uint64_t hdrlist, uint64_t dvlist)
 {
     uint32_t ret = 0;
-    DEBUG("\n _getHDRSupportedList hdrlist:%llu, dvlist:%llu\n", hdrlist, dvlist);
+    DEBUG("%s %d hdrlist:%llu, dvlist:%llu",__FUNCTION__,__LINE__, hdrlist, dvlist);
     if (!!(hdrlist & 0x1))
         ret = ret | (0x1 << (int)MESON_DRM_HDR10PLUS);
 
@@ -112,7 +112,7 @@
         do {
             snprintf(cmdBuf, sizeof(cmdBuf)-1, "export XDG_RUNTIME_DIR=%s;westeros-gl-console set mode %s | grep \"Response\"",
                     xdgRunDir, modeSet);
-            DEBUG("Executing '%s'\n", cmdBuf);
+            DEBUG("%s %d Executing '%s'",__FUNCTION__,__LINE__, cmdBuf);
             /* FIXME: popen in use */
             FILE* fp = popen(cmdBuf, "r");
             if (NULL != fp) {
@@ -125,12 +125,12 @@
                 }
                 pclose(fp);
             } else {
-                ERROR(" popen failed\n");
+                ERROR("%s %d popen failed",__FUNCTION__,__LINE__);
                 ret = -1;
             }
             if (ret != 0 ) {
                 if (strcmp(xdgRunDir, XDG_RUNTIME_DIR) == 0) {
-                    ERROR("meson_drm_setMode: failed !!");
+                    ERROR("%s %d failed !!",__FUNCTION__,__LINE__);
                     break;
                 }
                 xdgRunDir = XDG_RUNTIME_DIR;
@@ -307,7 +307,7 @@
             ret = MESON_DRM_UNKNOWNCONNECTION;
         }
     } else {
-        ERROR(" drm open fail");
+        ERROR("%s %d drm open fail",__FUNCTION__,__LINE__);
     }
     if (conn)
         mesonConnectorDestroy(drmFd,conn);
@@ -323,7 +323,7 @@
     char propName[50] = {'\0'};
     bool force1_4 = false;
     if (enProp >= ENUM_DRM_PROP_MAX) {
-        INFO("%s %d invalid para",__FUNCTION__,__LINE__);
+        ERROR("%s %d invalid para",__FUNCTION__,__LINE__);
         goto out;
     }
     int drmFd = -1;
@@ -415,7 +415,7 @@
     int objtype = -1;
     char propName[50] = {'\0'};
     if (!prop_value || enProp >= ENUM_DRM_PROP_MAX) {
-        DEBUG("%s %d invalid para",__FUNCTION__,__LINE__);
+        ERROR("%s %d invalid para",__FUNCTION__,__LINE__);
         goto out;
     }
     int drmFd = -1;
@@ -424,7 +424,7 @@
     conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
     if (conn == NULL || drmFd < 0)
     {
-        ERROR("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
+        ERROR("%s %d connector create fail",__FUNCTION__,__LINE__);
         goto out;
     }
     switch (enProp)
@@ -512,11 +512,11 @@
     struct mesonProperty* meson_prop = NULL;
     meson_prop = mesonPropertyCreate(drmFd, objID, objtype, propName);
     if (!meson_prop) {
-        ERROR("meson_prop create fail");
+        ERROR("%s %d meson_prop create fail",__FUNCTION__,__LINE__);
         goto out;
     }
     uint64_t value = mesonPropertyGetValue(meson_prop);
-    DEBUG("\n prop value:%llu objID:%d,name:%s\n",value, objID,propName);
+    DEBUG("%s %d prop value:%llu objID:%d,name:%s",__FUNCTION__,__LINE__,value, objID,propName);
     if (enProp == ENUM_DRM_PROP_HDMI_ENABLE)
         value = value ? 0:1;
     *prop_value = (uint32_t)value;
@@ -553,7 +553,7 @@
             meson_prop_HDCP = mesonPropertyCreate(drmFd, objID, objtype, propName);
             uint64_t value_3 = mesonPropertyGetValue(meson_prop_HDCP);
             mesonPropertyDestroy(meson_prop_HDCP);
-            DEBUG("\n prop value:%llu objID:%d,name:%s\n",value_3, objID,propName);
+            DEBUG("%s %d prop value:%llu objID:%d,name:%s",__FUNCTION__,__LINE__,value_3, objID,propName);
             if (value_3 == 1)
                 *prop_value = 2;
         }
@@ -578,7 +578,7 @@
     }
     ret_fd = open(card, O_RDONLY|O_CLOEXEC);
     if ( ret_fd < 0 )
-        ERROR(" drm card:%s open fail",card);
+        ERROR("%s %d drm card:%s open fail",__FUNCTION__,__LINE__,card);
     else
         drmDropMaster(ret_fd);
     return ret_fd;
@@ -648,7 +648,7 @@
     struct mesonConnector* connector = NULL;
     drmModeModeInfo* mode = NULL;
     if (drmFd < 0) {
-        ERROR(" drmFd error");
+        ERROR("%s %d drmFd < 0",__FUNCTION__,__LINE__);
         goto out;
     }
     if (nextVsync < 0)
@@ -672,7 +672,7 @@
     vbl.request.signal= 0;
     rc = drmWaitVBlank(drmFd, &vbl );
     if (rc != 0 ) {
-        ERROR("drmWaitVBlank failed: rc %d errno %d",rc, errno);
+        ERROR("%s %d drmWaitVBlank failed: rc %d errno %d",__FUNCTION__,__LINE__,rc, errno);
         ret = -1;
         goto out;
     }
diff --git a/meson/meson_drm_event.c b/meson/meson_drm_event.c
index 05c3092..b11f49a 100644
--- a/meson/meson_drm_event.c
+++ b/meson/meson_drm_event.c
@@ -36,10 +36,10 @@
     pthread_attr_t attr;
     pthread_attr_init(&attr);
     pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
-    DEBUG("[%s:%d]\n", __FUNCTION__, __LINE__);
+    DEBUG("[%s:%d]", __FUNCTION__, __LINE__);
     err = pthread_create (&event_monitor_threadId, &attr,uevent_monitor_thread,NULL);
     if (err) {
-        ERROR("DSHAL : Failed to Ceate HDMI Hot Plug Thread ....\r\n");
+        ERROR("%s %d DSHAL : Failed to Ceate HDMI Hot Plug Thread ....\r",__FUNCTION__, __LINE__);
         event_monitor_threadId = -1;
     }
 }
@@ -51,7 +51,7 @@
 {
     bool ret = true;
     if (cb == NULL) {
-        ERROR("ERROR[%s:%d] argument NULL\n", __FUNCTION__, __LINE__);
+        ERROR("ERROR[%s:%d] argument NULL",__FUNCTION__, __LINE__);
         ret = false;
     } else {
         _DisplayEventCb = cb;
@@ -74,7 +74,7 @@
 
 static void* uevent_monitor_thread(void *arg)
 {
-    DEBUG("[%s:%d]start\n", __FUNCTION__, __LINE__);
+    DEBUG("[%s:%d]start", __FUNCTION__, __LINE__);
     bool wasConnected = false;
     struct udev *udev = NULL;
     struct udev_device *dev = NULL;
@@ -96,13 +96,13 @@
             struct timeval tv;
             int ret;
             if ((fd = udev_monitor_get_fd(mon)) < 0) {
-                ERROR("ERROR[%s:%d] udev_monitor_get_fd failed,\n", __FUNCTION__, __LINE__);
+                ERROR("ERROR[%s:%d] udev_monitor_get_fd failed", __FUNCTION__, __LINE__);
             } else {
                 if (udev_monitor_filter_add_match_subsystem_devtype(mon, LIBUDEV_SUBSYSTEM_DRM, NULL) < 0) {
-                    ERROR("ERROR[%s:%d] udev_monitor_filter_add_match_subsystem_devtype failed,\n", __FUNCTION__, __LINE__);
+                    ERROR("ERROR[%s:%d] udev_monitor_filter_add_match_subsystem_devtype failed", __FUNCTION__, __LINE__);
                 } else {
                     if (udev_monitor_enable_receiving(mon) < 0) {
-                        DEBUG("ERROR[%s:%d] udev_monitor_enable_receiving\n", __FUNCTION__, __LINE__);
+                        ERROR("ERROR[%s:%d] udev_monitor_enable_receiving", __FUNCTION__, __LINE__);
                     } else {
                         while (isMonitoringAlive) {
                             FD_ZERO(&fds);
@@ -114,13 +114,13 @@
                                 dev = udev_monitor_receive_device(mon);
                                 if (dev) {
                                     if (!strcmp(udev_device_get_action(dev), "change")) {
-                                        DEBUG("I: ACTION=%s\n", udev_device_get_action(dev));
-                                        DEBUG("I: DEVNAME=%s\n", udev_device_get_sysname(dev));
-                                        DEBUG("I: DEVPATH=%s\n", udev_device_get_devpath(dev));
+                                        DEBUG("%s %d I: ACTION=%s",__FUNCTION__, __LINE__, udev_device_get_action(dev));
+                                        DEBUG("%s %d I: DEVNAME=%s",__FUNCTION__, __LINE__, udev_device_get_sysname(dev));
+                                        DEBUG("%s %d I: DEVPATH=%s",__FUNCTION__, __LINE__, udev_device_get_devpath(dev));
                                         enConnection = meson_drm_getConnection();
                                         if ( enPreConnection != enConnection) {
                                             enPreConnection = enConnection;
-                                            DEBUG("Send %s HDMI Hot Plug Event !!!\n",
+                                            DEBUG("%s %d Send %s HDMI Hot Plug Event !!!",__FUNCTION__, __LINE__,
                                                     (enConnection ? "Connect":"DisConnect"));
                                             enDisplayEvent = enConnection ? DISPLAY_EVENT_CONNECTED:DISPLAY_EVENT_DISCONNECTED;
                                             if (_DisplayEventCb) {
@@ -132,7 +132,7 @@
                                         if ( enCurStatus != enPreStatus ) {
                                             enPreStatus = enCurStatus;
                                             enDisplayEvent = enCurStatus ? DISPLAY_HDCP_AUTHENTICATIONFAILURE:DISPLAY_HDCP_AUTHENTICATED;
-                                            DEBUG("Send %s !!!\n", (enCurStatus ? "DISPLAY_HDCP_AUTHENTICATIONFAILURE":"DISPLAY_HDCP_AUTHENTICATED"));
+                                            DEBUG("%s %d Send %s !!!\n",__FUNCTION__, __LINE__, (enCurStatus ? "DISPLAY_HDCP_AUTHENTICATIONFAILURE":"DISPLAY_HDCP_AUTHENTICATED"));
                                             if (_DisplayEventCb) {
                                                 _DisplayEventCb( enDisplayEvent, NULL);
                                             }
@@ -142,7 +142,7 @@
                                     udev_device_unref(dev);
                                 }
                                 else {
-                                    DEBUG("I:[%s:%d] udev_monitor_receive_device failed", __FUNCTION__, __LINE__);
+                                    ERROR("I:[%s:%d] udev_monitor_receive_device failed", __FUNCTION__, __LINE__);
                                     enConnection = MESON_DRM_UNKNOWNCONNECTION;
                                     enPreConnection = MESON_DRM_UNKNOWNCONNECTION;
                                 }
diff --git a/meson/meson_drm_log.c b/meson/meson_drm_log.c
index cc3e60a..173400a 100644
--- a/meson/meson_drm_log.c
+++ b/meson/meson_drm_log.c
@@ -52,3 +52,21 @@
       va_end( argptr );
    }
 }
+
+void mesonDrmEdidLog( int level, const char *fmt, ...)
+{
+   const char *env= getenv( "LIBMESON_GL_DEBUG" );
+   if ( env )
+   {
+      int level= atoi( env );
+      g_activeLevel= level;
+   }
+   if ( level <= g_activeLevel )
+   {
+      va_list argptr;
+      va_start( argptr, fmt );
+      vfprintf( stderr, fmt, argptr );
+      va_end( argptr );
+   }
+}
+
diff --git a/meson/meson_drm_log.h b/meson/meson_drm_log.h
index 4c7d4c7..cf21eb6 100644
--- a/meson/meson_drm_log.h
+++ b/meson/meson_drm_log.h
@@ -10,15 +10,18 @@
 #include <unistd.h>
 
 void mesonDrmLog( int level, const char *fmt, ... );
+void mesonDrmEdidLog( int level, const char *fmt, ... );
 long long getMonotonicTimeMicros( void );
 
-#define INT_ERROR(FORMAT, ...)      mesonDrmLog(0, "ERROR: %s:%d " FORMAT "\n", __FILE__, __LINE__, __VA_ARGS__)
-#define INT_INFO(FORMAT, ...)       mesonDrmLog(1, "INFO: %s:%d " FORMAT "\n", __FILE__, __LINE__, __VA_ARGS__)
-#define INT_DEBUG(FORMAT, ...)      mesonDrmLog(2, "DEBUG: %s:%d " FORMAT "\n", __FILE__, __LINE__, __VA_ARGS__)
+#define INT_ERROR(FORMAT, ...)      mesonDrmLog(0, "ERROR: " FORMAT "\n", __VA_ARGS__)
+#define INT_INFO(FORMAT, ...)       mesonDrmLog(1, "INFO: " FORMAT "\n", __VA_ARGS__)
+#define INT_DEBUG(FORMAT, ...)      mesonDrmLog(2, "DEBUG: " FORMAT "\n", __VA_ARGS__)
+#define INT_DEBUG_DEID(FORMAT, ...)     mesonDrmEdidLog(2, FORMAT , __VA_ARGS__)
 
 #define ERROR(...)                  INT_ERROR(__VA_ARGS__, "")
 #define INFO(...)                   INT_INFO(__VA_ARGS__, "")
 #define DEBUG(...)                  INT_DEBUG(__VA_ARGS__, "")
+#define DEBUG_EDID(...)             INT_DEBUG_DEID(__VA_ARGS__, "")
 
 #if defined(__cplusplus)
 }
diff --git a/meson/meson_drm_settings.c b/meson/meson_drm_settings.c
index 59505c1..f8c01d7 100644
--- a/meson/meson_drm_settings.c
+++ b/meson/meson_drm_settings.c
@@ -54,12 +54,12 @@
     struct mesonProperty* meson_prop = NULL;
     meson_prop = mesonPropertyCreate(drmFd, objID, objType, name);
     if (!meson_prop) {
-        ERROR("meson_prop create fail");
+        ERROR("%s %d meson_prop create fail",__FUNCTION__,__LINE__);
         goto out;
     }
     uint64_t value = mesonPropertyGetValue(meson_prop);
     *propValue = (uint32_t)value;
-    DEBUG("prop value:%llu objID:%d,name:%s",value, objID,name);
+    DEBUG("%s %d prop value:%llu objID:%d,name:%s",__FUNCTION__,__LINE__,value, objID,name);
     mesonPropertyDestroy(meson_prop);
     ret = 0;
 out:
@@ -83,7 +83,7 @@
     struct mesonConnector* connector = NULL;
     int drmConnType = DRM_MODE_CONNECTOR_HDMIA;
     if (drmFd < 0) {
-        ERROR(" %s %d invalid drmFd return",__FUNCTION__,__LINE__);
+        ERROR("%s %d drmFd < 0",__FUNCTION__,__LINE__);
         return NULL;
     }
     switch (connType)
@@ -121,16 +121,16 @@
     }
     ret_fd = open(card, O_RDONLY|O_CLOEXEC);
     if ( ret_fd < 0 )
-        ERROR(" meson_open_drm  drm card:%s open fail",card);
+        ERROR("%s %d drm card:%s open fail",__FUNCTION__,__LINE__,card);
     else
         drmDropMaster(ret_fd);
     ret = drmSetClientCap(ret_fd, DRM_CLIENT_CAP_ATOMIC, 1);
     if (ret < 0)
-        DEBUG("Unable to set DRM atomic capability");
+        DEBUG("%s %d Unable to set DRM atomic capability",__FUNCTION__,__LINE__);
 
     ret = drmSetClientCap(ret_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
     if (ret < 0)
-        DEBUG("Unable to set UNIVERSAL_PLANES");
+        DEBUG("%s %d Unable to set UNIVERSAL_PLANES",__FUNCTION__,__LINE__);
     return ret_fd;
 }
 void meson_close_drm(int drmFd)
@@ -152,10 +152,10 @@
     prop = mesonPropertyCreate(drmFd, objId, objType, name);
     propId = mesonPropertyGetId(prop);
     mesonPropertyDestroy(prop);
-    DEBUG("meson_drm_set_property name:%s objId:%d propId:%d value:%llu", name, objId, propId, value);
+    DEBUG("%s %d name:%s objId:%d propId:%d value:%llu", __FUNCTION__,__LINE__,name, objId, propId, value);
     rc = drmModeAtomicAddProperty( req, objId, propId, value );
     if (rc < 0)
-        ERROR("%s %d meson_drm_set_property fail",__FUNCTION__,__LINE__);
+        ERROR("%s %d drmModeAtomicAddProperty fail",__FUNCTION__,__LINE__);
     return rc;
 }
 
@@ -170,7 +170,7 @@
     conn = get_current_connector(drmFd, connType);
     if (conn == NULL || drmFd < 0)
     {
-        ERROR("%s %d connector create fail",__FUNCTION__,__LINE__);
+        ERROR("%s %d invalid parameter return",__FUNCTION__,__LINE__);
     }
     if (0 != mesonConnectorGetModes(conn, drmFd, &modes, &count))
         goto out;
@@ -191,6 +191,7 @@
         mesonConnectorDestroy(drmFd,conn);
     if (drmFd >= 0 )
         close(drmFd);
+    DEBUG("%s %d get preferred mode%s %dx%d%s%dhz",__FUNCTION__,__LINE__, mode->name, mode->w, mode->h, (mode->interlace == 0? "p":"i"),mode->vrefresh);
     return ret;
 }
 
@@ -199,7 +200,7 @@
     int ret = -1;
     struct mesonConnector* conn = NULL;
     if ( drmFd < 0) {
-        ERROR("%s %d invalid parameter return",__FUNCTION__,__LINE__);
+        ERROR("%s %d drmFd < 0",__FUNCTION__,__LINE__);
         return ret;
     }
     conn = get_current_connector(drmFd, connType);
@@ -227,6 +228,10 @@
 out:
     if (conn)
         mesonConnectorDestroy(drmFd,conn);
+     DEBUG("%s %d mode count: %d",__FUNCTION__,__LINE__,(*modeCount));
+     for (int i=0; i < (*modeCount); i++) {
+        DEBUG_EDID(" %s %dx%d%s%dhz\n", (*modeInfo)[i].name, (*modeInfo)[i].w, (*modeInfo)[i].h, ((*modeInfo)[i].interlace == 0? "p":"i"), (*modeInfo)[i].vrefresh);
+    }
     return ret;
 }
 
@@ -259,6 +264,7 @@
     }
     if (conn)
         mesonConnectorDestroy(drmFd,conn);
+    DEBUG("%s %d modeInfo %dx%d%s%dhz",__FUNCTION__,__LINE__, modeInfo->w, modeInfo->h, (modeInfo->interlace == 0 ?"p":"i"), modeInfo->vrefresh);
     return ret;
 }
 int meson_drm_changeMode(int drmFd, drmModeAtomicReq *req, DisplayMode* modeInfo, MESON_CONNECTOR_TYPE connType)
@@ -279,7 +285,7 @@
     uint32_t blobId = 0;
     drmModeModeInfo* modes = NULL;
     int modesNumber = 0;
-
+    DEBUG("%s %d set modeInfo %dx%d%s%dhz connType %d",__FUNCTION__,__LINE__, modeInfo->w, modeInfo->h, (modeInfo->interlace == 0? "p":"i") , modeInfo->vrefresh,connType);
     if (modeInfo == NULL || drmFd < 0 || req == NULL) {
         ERROR(" %s %d invalid parameter return",__FUNCTION__,__LINE__);
         return ret;
@@ -299,6 +305,7 @@
     connId = mesonConnectorGetId(conn);
     crtcId = mesonConnectorGetCRTCId(conn);
     if ( conn ) {
+        DEBUG("%s %d conn create success",__FUNCTION__,__LINE__);
         mesonConnectorGetModes(conn, drmFd, &modes, &modesNumber);
         for ( i = 0; i < modesNumber; i++ ) {
             interlace = (modes[i].flags & DRM_MODE_FLAG_INTERLACE);
@@ -317,6 +324,7 @@
     }
 
     if (found) {
+        DEBUG("%s %d find the corresponding modeinfo",__FUNCTION__,__LINE__);
         rc1 = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", crtcId);
         rc = drmModeCreatePropertyBlob( drmFd, &drm_mode, sizeof(drm_mode), &blobId );
         if (rc == 0) {
@@ -342,6 +350,7 @@
     }
     conn = get_current_connector(drmFd, connType);
     if (conn) {
+        DEBUG("%s %d conn create success",__FUNCTION__,__LINE__);
         int ConnectState = -1;
         ConnectState = mesonConnectorGetConnectState(conn);
         if (ConnectState == 1) {
@@ -352,10 +361,11 @@
             ret = MESON_UNKNOWNCONNECTION;
         }
     } else {
-        ERROR(" drm open fail");
+        ERROR(" %s %d conn create fail ",__FUNCTION__,__LINE__);
     }
     if (conn)
         mesonConnectorDestroy(drmFd,conn);
+    DEBUG("%s %d get Connection Status %d",__FUNCTION__,__LINE__,ret);
     return ret;
 }
 
@@ -389,8 +399,9 @@
                 break;
         }
     } else {
-        ERROR("\n%s %d fail\n",__FUNCTION__,__LINE__);
+        ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get ColorSpace %d",__FUNCTION__,__LINE__,colorSpace);
     return colorSpace;
 }
 int meson_drm_setColorSpace(int drmFd, drmModeAtomicReq *req,
@@ -406,6 +417,7 @@
     }
     conn = get_current_connector(drmFd, connType);
     if (conn) {
+        DEBUG("%s %d conn create success",__FUNCTION__,__LINE__);
         connId = mesonConnectorGetId(conn);
         rc = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR,
             DRM_CONNECTOR_PROP_COLOR_SPACE, (uint64_t)colorSpace);
@@ -413,6 +425,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG(" %s %d set colorSpace: %d",__FUNCTION__,__LINE__,colorSpace);
     return ret;
 
 }
@@ -427,8 +440,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("\n%s %d fail\n",__FUNCTION__,__LINE__);
+         ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get ColorDepth %d",__FUNCTION__,__LINE__,value);
     return value;
 }
 int meson_drm_setColorDepth(int drmFd, drmModeAtomicReq *req,
@@ -444,6 +458,7 @@
         return ret;
     }
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         connId = mesonConnectorGetId(conn);
         rc = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR,
                        DRM_CONNECTOR_PROP_COLOR_DEPTH, (uint64_t)colorDepth);
@@ -451,6 +466,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG(" %s %d set colorDepth: %d",__FUNCTION__,__LINE__,colorDepth);
     return ret;
 }
 ENUM_MESON_HDR_POLICY meson_drm_getHDRPolicy( int drmFd, MESON_CONNECTOR_TYPE connType )
@@ -469,6 +485,7 @@
         if (value == 1)
             hdrPolicy = MESON_HDR_POLICY_FOLLOW_SOURCE;
     }
+    DEBUG("%s %d get HDR Policy: %d",__FUNCTION__,__LINE__,hdrPolicy);
     return hdrPolicy;
 }
 
@@ -485,6 +502,7 @@
         return ret;
     }
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         crtcId = mesonConnectorGetCRTCId(conn);
         rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
                        DRM_CONNECTOR_PROP_TX_HDR_POLICY, (uint64_t)hdrPolicy);
@@ -492,6 +510,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG("%s %d set hdrPolicy %d",__FUNCTION__,__LINE__,hdrPolicy);
     return ret;
 }
 
@@ -511,6 +530,7 @@
         if (value & 0x2)
             hdcpVersion = MESON_HDCP_22;
     }
+    DEBUG("%s %d get Hdcp Version %d",__FUNCTION__,__LINE__,hdcpVersion);
     return hdcpVersion;
 }
 
@@ -525,6 +545,7 @@
         return hdrMode;
     }
     if ( 0 == meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
+        DEBUG("%s %d get conn prop value success",__FUNCTION__,__LINE__);
         switch (value)
         {
             case 0:
@@ -553,8 +574,9 @@
                 break;
         }
     } else {
-        ERROR("%s %d fail",__FUNCTION__,__LINE__);
+        ERROR("%s %d get connnetor property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get HdrStatus %d",__FUNCTION__,__LINE__,hdrMode);
     return hdrMode;
 }
 void meson_drm_getEDIDData(int drmFd, MESON_CONNECTOR_TYPE connType, int * data_Len, char **data )
@@ -569,7 +591,7 @@
     }
     conn = get_current_connector(drmFd, connType);
     if (conn == NULL) {
-        ERROR("%s %d connector create fail.return ",__FUNCTION__,__LINE__);
+        ERROR("%s %d connector create fail.return",__FUNCTION__,__LINE__);
         return;
     }
     if (0 != mesonConnectorGetEdidBlob(conn, &count, &edid_data))
@@ -585,6 +607,13 @@
     }
     *data_Len = count;
     *data = edid;
+    DEBUG("%s %d data_Len: %d",__FUNCTION__,__LINE__, (*data_Len));
+    for (int i = 0; i < (*data_Len); i++) {
+        if (i % 16 == 0)
+            DEBUG_EDID("\n\t\t\t");
+            if (*data)
+            DEBUG_EDID("%.2hhx", (*data)[i]);
+    }
 out:
     if (conn)
         mesonConnectorDestroy(drmFd,conn);
@@ -592,7 +621,6 @@
 
 int meson_drm_setAVMute(int drmFd, drmModeAtomicReq *req,
                        bool mute, MESON_CONNECTOR_TYPE connType)
-
 {
     int ret = -1;
     int rc = -1;
@@ -604,6 +632,7 @@
     }
     conn = get_current_connector(drmFd, connType);
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         connId = mesonConnectorGetId(conn);
         rc = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR,
                        MESON_DRM_HDMITX_PROP_AVMUTE, (uint64_t)mute);
@@ -611,6 +640,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG(" %s %d set mute %d",__FUNCTION__,__LINE__,mute);
     return ret;
 }
 
@@ -624,9 +654,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("%s %d fail",__FUNCTION__,__LINE__);
+         ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
-    DEBUG("AVMute control, 1 means set avmute, 0 means not avmute");
+    DEBUG("%s %d get AVMute: %d (AVMute control, 1 means set avmute, 0 means not set avmute)",value,__FUNCTION__,__LINE__);
     return value;
 }
 
@@ -637,19 +667,19 @@
     uint32_t value = 0;
     ENUM_MESON_HDCPAUTH_STATUS hdcpAuthStatus = MESON_AUTH_STATUS_FAIL;
     if ( drmFd < 0 ) {
-        ERROR("%s %d invalid parameter return",__FUNCTION__,__LINE__);
+        ERROR("%s %d drmFd < 0",__FUNCTION__,__LINE__);
         return hdcpAuthStatus;
     }
     if ( 0 == meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
         if (value == 2)
             hdcpAuthStatus = MESON_AUTH_STATUS_SUCCESS;
     }
+    DEBUG(" %s %d get hdcp auth status %d",__FUNCTION__,__LINE__,hdcpAuthStatus);
     return hdcpAuthStatus;
 }
 
 int meson_drm_setHDCPEnable(int drmFd, drmModeAtomicReq *req,
                        bool enable, MESON_CONNECTOR_TYPE connType)
-
 {
     int ret = -1;
     int rc = -1;
@@ -661,6 +691,7 @@
     }
     conn = get_current_connector(drmFd, connType);
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         connId = mesonConnectorGetId(conn);
         rc = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR,
                        DRM_CONNECTOR_PROP_CONTENT_PROTECTION, (uint64_t)enable);
@@ -668,6 +699,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG("%s %d set hdcp enable %d",__FUNCTION__,__LINE__,enable);
     return ret;
 }
 
@@ -679,11 +711,12 @@
     struct mesonConnector* conn = NULL;
     uint32_t connId = 0;
     if ( drmFd < 0 || req == NULL) {
-        ERROR( " %s %d invalid parameter return",__FUNCTION__,__LINE__);
+        ERROR("%s %d invalid parameter return",__FUNCTION__,__LINE__);
         return ret;
     }
     conn = get_current_connector(drmFd, connType);
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         connId = mesonConnectorGetId(conn);
         rc = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR,
                        DRM_CONNECTOR_PROP_CONTENT_TYPE, (uint64_t)HDCPType);
@@ -691,6 +724,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG("%s %d set hdcp content %d",__FUNCTION__,__LINE__,HDCPType);
     return ret;
 }
 
@@ -718,8 +752,9 @@
                 break;
         }
     } else {
-        ERROR("%s %d fail",__FUNCTION__,__LINE__);
+        ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get HDCP Content Type: %d",__FUNCTION__,__LINE__,ContentType);
     return ContentType;
 }
 
@@ -756,8 +791,9 @@
                 break;
         }
     } else {
-        ERROR("%s %d fail",__FUNCTION__,__LINE__);
+        ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get Content Type: %d",__FUNCTION__,__LINE__,ContentType);
     return ContentType;
 }
 
@@ -774,6 +810,7 @@
         return ret;
     }
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         crtcId = mesonConnectorGetCRTCId(conn);
         rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
                        DRM_CONNECTOR_PROP_DV_ENABLE, (uint64_t)dvEnable);
@@ -781,6 +818,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG("%s %d set dvEnable value %d",__FUNCTION__,__LINE__,dvEnable);
     return ret;
 }
 
@@ -794,8 +832,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_crtc_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("%s %d fail",__FUNCTION__,__LINE__);
+         ERROR("%s %d get crtc property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get DvEnable %d",__FUNCTION__,__LINE__,value);
     return value;
 }
 
@@ -812,6 +851,7 @@
         return ret;
     }
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         crtcId = mesonConnectorGetCRTCId(conn);
         rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
                        DRM_CONNECTOR_PROP_ACTIVE, (uint64_t)active);
@@ -819,6 +859,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG("%s %d set active %d",__FUNCTION__,__LINE__,active);
     return ret;
 }
 
@@ -832,8 +873,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_crtc_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("\n%s %d fail\n",__FUNCTION__,__LINE__);
+         ERROR("%s %d get crtc property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get Active: %d",__FUNCTION__,__LINE__,value);
     return value;
 }
 
@@ -846,10 +888,11 @@
     uint32_t crtcId = 0;
     conn = get_current_connector(drmFd, connType);
     if ( drmFd < 0 || req == NULL) {
-        ERROR("\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        ERROR("%s %d invalid parameter return",__FUNCTION__,__LINE__);
         return ret;
     }
     if (conn) {
+        DEBUG("%s %d get current connector success",__FUNCTION__,__LINE__);
         crtcId = mesonConnectorGetCRTCId(conn);
         rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
                        DRM_CONNECTOR_VRR_ENABLED, (uint64_t)VrrEnable);
@@ -857,6 +900,7 @@
     }
     if (rc >= 0)
         ret = 0;
+    DEBUG("%s %d set VrrEnable %d",__FUNCTION__,__LINE__,VrrEnable);
     return ret;
 }
 
@@ -870,8 +914,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_crtc_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("%s %d fail",__FUNCTION__,__LINE__);
+         ERROR("%s %d get crtc property value fail",__FUNCTION__,__LINE__);
     }
+    DEBUG("%s %d get VrrEnabled： %d",__FUNCTION__,__LINE__,value);
     return value;
 }
 
@@ -885,9 +930,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("%s %d fail",__FUNCTION__,__LINE__);
+         ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
-    DEBUG("hdr_cap：presents the RX HDR capability [r]");
+    DEBUG("%s %d get hdrcap: %d (presents the RX HDR capability [r])",__FUNCTION__,__LINE__,value);
     return value;
 }
 
@@ -901,9 +946,9 @@
         return value;
     }
     if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
-         ERROR("%s %d fail",__FUNCTION__,__LINE__);
+         ERROR("%s %d get connector property value fail",__FUNCTION__,__LINE__);
     }
-    DEBUG("dv_cap：presents the RX dolbyvision capability, [r] such as std or ll mode ");
+    DEBUG("%s %d get dvcap：%d(presents the RX dolbyvision capability, [r] such as std or ll mode)",__FUNCTION__,__LINE__,value);
     return value;
 }
 
