Enable usb_mode udev event for factory mode. 78/222178/3
authorINSUN PYO <insun.pyo@samsung.com>
Fri, 10 Jan 2020 05:00:10 +0000 (14:00 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Fri, 10 Jan 2020 08:20:46 +0000 (08:20 +0000)
Factory jig internally disconnects only signal cable(in Blue and White) of USB cable.
It makes a strange state.

In general, when the USB cable is disconnected, switch udev event and usb_mode udev event occur.
But, in factory jig case, usb_mode udev event only occurs.

Without luck, data-router.service crashs on factory jig because of one's own problems.
So, we have to restart data-router.service when usb_mode udev event happens.

And, sdbd.service and mtp-response.service also restart as a preventive measure.

Change-Id: Ia538383aefd82bad9eaf976fc4dedef605c60026

src/usb/usb.c

index 65a33d0..367aa21 100644 (file)
 #include <vconf.h>
 #include <bundle.h>
 #include <eventsystem.h>
+#include <libsyscommon/dbus-systemd.h>
 
 #include "core/log.h"
 #include "core/list.h"
+#include "core/udev.h"
 #include "core/common.h"
 #include "core/device-notifier.h"
 #include "display/poll.h"
@@ -397,6 +399,34 @@ static int usb_state_changed(int status)
        return ret;
 }
 
+static void uevent_usb_mode_handler(struct udev_device *dev)
+{
+       const char *state = NULL;
+
+       state = udev_device_get_property_value(dev, "USB_STATE");
+       if (!state)
+               return;
+
+       if (strncmp(state, "CONFIGURED", strlen(state) + 1))
+               return;
+
+       _I("usb_mode udev event happend : CONFIGURED");
+
+       if (usb_state_get_selected_mode() | USB_FUNCTION_ACM)
+               systemd_start_unit_wait_started ("data-router.service", NULL, -1);
+
+       if (usb_state_get_selected_mode() | USB_FUNCTION_SDB)
+               systemd_start_unit_wait_started ("sdbd.service", NULL, -1);
+
+       if (usb_state_get_selected_mode() | USB_FUNCTION_MTP)
+               systemd_start_unit_wait_started ("mtp-responder.service", NULL, -1);
+}
+
+static struct uevent_handler uh = {
+       .subsystem = "usb_mode",
+       .uevent_func = uevent_usb_mode_handler,
+};
+
 static void usb_init(void *data)
 {
        int ret;
@@ -413,6 +443,10 @@ static void usb_init(void *data)
                ret = usb_config_init();
                if (ret < 0)
                        _E("Failed to initialize usb configuation.");
+
+               ret = register_udev_uevent_control(&uh);
+               if (ret < 0)
+                       _E("Failed to register udev event(%d)", ret);
        }
 
        ret = usb_dbus_init();
@@ -434,6 +468,7 @@ static void usb_exit(void *data)
        usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE);
 
        if (!is_emulator()) {
+               unregister_udev_uevent_control(&uh);
                usb_config_deinit();
                usb_release();
        }