libdrm-meson: modify hdcp event [1/1]
PD#OTT-57537
Problem:
need hdmi event after HPD
Solution:
modify hdcp event
Verify:
ah212
Change-Id: I5203008cb24bcd96d290c96abb2c7da48b32e99f
Signed-off-by: limin.tian <limin.tian@amlogic.com>
diff --git a/meson/meson_drm_event.c b/meson/meson_drm_event.c
index b18e371..f7f956c 100644
--- a/meson/meson_drm_event.c
+++ b/meson/meson_drm_event.c
@@ -23,10 +23,12 @@
#endif
#define LIBUDEV_EVT_TYPE_KERNEL "kernel"
#define LIBUDEV_SUBSYSTEM_DRM "drm"
+#define LIBUDEV_SUBSYSTEM_HDMITX "amhdmitx"
static bool isMonitoringAlive = false;
displayEventCallback _DisplayEventCb = NULL;
static void* uevent_monitor_thread(void *arg);
+static void* hdmitx_uevent_monitor_thread(void *arg);
void startDisplayUeventMonitor()
{
@@ -39,9 +41,18 @@
DEBUG("[%s:%d]", __FUNCTION__, __LINE__);
err = pthread_create (&event_monitor_threadId, &attr,uevent_monitor_thread,NULL);
if (err) {
- ERROR("%s %d DSHAL : Failed to Ceate HDMI Hot Plug Thread ....\r",__FUNCTION__, __LINE__);
+ ERROR("%s %d Failed to Ceate HDMI Hot Plug Thread ....\n",__FUNCTION__, __LINE__);
event_monitor_threadId = -1;
}
+ pthread_t hdmitx_event_monitor_threadId;
+ pthread_attr_t hdmitx_thread_attr;
+ pthread_attr_init(&hdmitx_thread_attr);
+ pthread_attr_setdetachstate(&hdmitx_thread_attr,PTHREAD_CREATE_DETACHED);
+ err = pthread_create (&hdmitx_event_monitor_threadId, &hdmitx_thread_attr,hdmitx_uevent_monitor_thread,NULL);
+ if (err) {
+ ERROR("%s %d Failed to Create hdmi tx monitor Thread ....\n",__FUNCTION__, __LINE__);
+ hdmitx_event_monitor_threadId = -1;
+ }
}
void stopDisplayUeventMonitor()
{
@@ -79,8 +90,6 @@
ENUM_MESON_CONN_CONNECTION enConnection = MESON_UNKNOWNCONNECTION;
ENUM_MESON_CONN_CONNECTION enPreConnection = MESON_UNKNOWNCONNECTION;
ENUM_DISPLAY_EVENT enDisplayEvent = DISPLAY_EVENT_MAX;
- bool enPreStatus = false;
- bool enCurStatus = false;
int drm_fd = meson_open_drm();
/* create udev object */
udev = udev_new();
@@ -137,19 +146,10 @@
(enConnection ? "Connect":"DisConnect"));
enDisplayEvent = enConnection ? DISPLAY_EVENT_CONNECTED:DISPLAY_EVENT_DISCONNECTED;
if (_DisplayEventCb) {
- _DisplayEventCb( enDisplayEvent, NULL);
+ _DisplayEventCb( enDisplayEvent, NULL );
}
}
}
- enCurStatus = get_hdcp_status();
- if ( enCurStatus != enPreStatus ) {
- enPreStatus = enCurStatus;
- enDisplayEvent = enCurStatus ? DISPLAY_HDCP_AUTHENTICATED:DISPLAY_HDCP_AUTHENTICATIONFAILURE;
- INFO("%s %d Send %s !!!\n",__FUNCTION__, __LINE__, (enCurStatus ? "DISPLAY_HDCP_AUTHENTICATED":"DISPLAY_HDCP_AUTHENTICATIONFAILURE"));
- if (_DisplayEventCb) {
- _DisplayEventCb( enDisplayEvent, NULL);
- }
- }
}
/* free dev */
udev_device_unref(dev);
@@ -165,10 +165,13 @@
}
}
}
+ close(fd);
}
+ udev_monitor_unref(mon);
} else {
ERROR("ERROR[%s:%d] udev_monitor_new_from_netlink failed", __FUNCTION__, __LINE__);
}
+ udev_unref(udev);
}
udev = NULL;
dev = NULL;
@@ -177,3 +180,85 @@
pthread_exit(NULL);
return NULL;
}
+static void* hdmitx_uevent_monitor_thread(void *arg)
+{
+ DEBUG("[%s:%d]start", __FUNCTION__, __LINE__);
+ struct udev *udev = NULL;
+ struct udev_device *dev = NULL;
+ struct udev_monitor *mon = NULL;
+ ENUM_DISPLAY_EVENT enDisplayEvent = DISPLAY_EVENT_MAX;
+ /* create udev object */
+ udev = udev_new();
+ if (!udev) {
+ ERROR("ERROR[%s:%d] Can't create udev monitor for DRM", __FUNCTION__, __LINE__);
+ } else {
+ mon = udev_monitor_new_from_netlink(udev, LIBUDEV_EVT_TYPE_KERNEL);
+ if (mon) {
+ int fd = -1;
+ fd_set fds;
+ struct timeval tv;
+ int ret;
+ int curHdcp = 0;
+ int preHdcp = 0;
+ if ((fd = udev_monitor_get_fd(mon)) < 0) {
+ ERROR("ERROR[%s:%d] udev_monitor_get_fd failed", __FUNCTION__, __LINE__);
+ } else {
+ if (udev_monitor_filter_add_match_subsystem_devtype(mon, LIBUDEV_SUBSYSTEM_HDMITX, NULL) < 0) {
+ ERROR("ERROR[%s:%d] udev_monitor_filter_add_match_subsystem_devtype failed", __FUNCTION__, __LINE__);
+ } else {
+ if (udev_monitor_enable_receiving(mon) < 0) {
+ ERROR("ERROR[%s:%d] udev_monitor_enable_receiving", __FUNCTION__, __LINE__);
+ } else {
+ while (isMonitoringAlive) {
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+ ret = select(fd+1, &fds, NULL, NULL, &tv);
+ if (ret > 0 && FD_ISSET(fd, &fds)) {
+ dev = udev_monitor_receive_device(mon);
+ if (dev) {
+ if (!strcmp(udev_device_get_action(dev), "change")) {
+ 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));
+ struct udev_list_entry *list_entry;
+ udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(dev)) {
+ INFO("%s=%s\n",
+ udev_list_entry_get_name(list_entry),
+ udev_list_entry_get_value(list_entry));
+ if (!strcmp(udev_list_entry_get_name(list_entry), "hdmitx_hdcp"))
+ curHdcp = atoi(udev_list_entry_get_value(list_entry));
+ }
+ if (curHdcp != preHdcp) {
+ preHdcp = curHdcp;
+ INFO("%s %d Send %s hdcp event !!!",__FUNCTION__, __LINE__,
+ (curHdcp ? "AUTHENTICATED":"AUTHENTICATIONFAILURE"));
+ enDisplayEvent = curHdcp ? DISPLAY_HDCP_AUTHENTICATED:DISPLAY_HDCP_AUTHENTICATIONFAILURE;
+ if (_DisplayEventCb) {
+ _DisplayEventCb( enDisplayEvent, NULL);
+ }
+ }
+ }
+ /* free dev */
+ udev_device_unref(dev);
+ }
+ }
+ }
+ }
+ }
+ close(fd);
+ }
+ udev_monitor_unref(mon);
+ } else {
+ ERROR("ERROR[%s:%d] udev_monitor_new_from_netlink failed", __FUNCTION__, __LINE__);
+ }
+ udev_unref(udev);
+ }
+ udev = NULL;
+ dev = NULL;
+ mon = NULL;
+ pthread_exit(NULL);
+ return NULL;
+}
+