diff --git a/hardware/rockchip/usb/usb/Usb.cpp b/hardware/rockchip/usb/usb/Usb.cpp index 05a52958508..2c02a1e1f96 100644 --- a/hardware/rockchip/usb/usb/Usb.cpp +++ b/hardware/rockchip/usb/usb/Usb.cpp @@ -41,6 +41,8 @@ #include "Usb.h" using android::base::GetProperty; +using android::base::GetBoolProperty; +using android::base::SetProperty; using android::base::Trim; namespace aidl { @@ -682,6 +684,12 @@ static void uevent_event(uint32_t /*epevents*/, struct data *payload) { char *cp; int n; + const std::regex re_partner_add("(add)(.*)(-partner)"); + const std::regex re_gadget_add("^add@/.*usb/gadget(\\.[0-9]+)?"); + const std::regex re_gadget_remove("^remove@/.*usb/gadget(\\.[0-9]+)?"); + bool adb_override = GetBoolProperty("persist.sys.usb.adb.override", true); + static const char* kPropertyUsbDisabled = "sys.usb.adb.disabled"; + n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN); if (n <= 0) return; @@ -693,7 +701,18 @@ static void uevent_event(uint32_t /*epevents*/, struct data *payload) { cp = msg; while (*cp) { - if (std::regex_match(cp, std::regex("(add)(.*)(-partner)"))) { + if (adb_override && strstr(cp, "usb/gadget")) { + // Notify adbd usb_ffs_open_thread() + if (std::regex_search(cp, re_gadget_add)) { + ALOGD("gadget add -> resume adbd"); + SetProperty(kPropertyUsbDisabled, "0"); + } else if (std::regex_search(cp, re_gadget_remove)) { + ALOGD("gadget remove -> pause adbd"); + SetProperty(kPropertyUsbDisabled, "1"); + } + } + + if (std::regex_match(cp, re_partner_add)) { ALOGI("partner added"); pthread_mutex_lock(&payload->usb->mPartnerLock); payload->usb->mPartnerUp = true;