diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index 4997323d..d4d882e1 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -106,6 +106,12 @@ constexpr char kHost1StatePath[] = "/sys/bus/usb/devices/usb1/1-0:1.0/usb1-port1 constexpr char kHost2UeventRegex[] = "/devices/platform/11210000.usb/11210000.dwc3/xhci-hcd-exynos.[0-9].auto/usb2/2-0:1.0"; constexpr char kHost2StatePath[] = "/sys/bus/usb/devices/usb2/2-0:1.0/usb2-port1/state"; +constexpr char kHubHost1UeventRegex[] = + "/devices/platform/11210000.usb/11210000.dwc3/xhci-hcd-exynos.[0-9].auto/usb1/1-1/1-1:1.0"; +constexpr char kHubHost1StatePath[] = "/sys/bus/usb/devices/usb1/1-1/1-1:1.0/1-1-port1/state"; +constexpr char kHubHost2UeventRegex[] = + "/devices/platform/11210000.usb/11210000.dwc3/xhci-hcd-exynos.[0-9].auto/usb1/1-1/1-1:1.0"; +constexpr char kHubHost2StatePath[] = "/sys/bus/usb/devices/usb1/1-1/1-1:1.0/1-1-port2/state"; constexpr char kDataRolePath[] = "/sys/devices/platform/11210000.usb/new_data_role"; constexpr int kSamplingIntervalSec = 5; @@ -474,6 +480,12 @@ bool switchMode(const string &portName, const PortRole &in_role, struct Usb *usb return roleSwitch; } +void updatePortStatus(android::hardware::usb::Usb *usb) { + std::vector currentPortStatus; + + queryVersionHelper(usb, ¤tPortStatus); +} + static int getInternalHubUniqueId() { string internalHubDevnum; int devnum = 0, internalHubUniqueId = -1; @@ -483,10 +495,9 @@ static int getInternalHubUniqueId() { return internalHubUniqueId; } -static Status tuneInternalHub(const char *devname, void* client_data) { +static Status tuneInternalHub(const char *devname, android::hardware::usb::Usb *usb) { uint16_t vendorId, productId; struct usb_device *device; - ::aidl::android::hardware::usb::Usb *usb; int value, index; device = usb_device_open(devname); @@ -495,7 +506,6 @@ static Status tuneInternalHub(const char *devname, void* client_data) { return Status::ERROR; } - usb = (::aidl::android::hardware::usb::Usb *)client_data; value = usb->mUsbHubVendorCmdValue; index = usb->mUsbHubVendorCmdIndex; @@ -518,20 +528,46 @@ static Status tuneInternalHub(const char *devname, void* client_data) { } static int usbDeviceRemoved(const char *devname, void* client_data) { + string pogoEnableHub; + ::aidl::android::hardware::usb::Usb *usb; + + usb = (::aidl::android::hardware::usb::Usb *)client_data; + + if (usb->mIntHubEnabled == true && ReadFileToString(kPogoEnableHub, &pogoEnableHub) + && Trim(pogoEnableHub) == "0") { + ALOGI("Internal hub disabled"); + usb->mIntHubEnabled = false; + usb->mUsbDataSessionMonitor.reset(new UsbDataSessionMonitor(kUdcUeventRegex, kUdcStatePath, + kHost1UeventRegex, kHost1StatePath, kHost2UeventRegex, + kHost2StatePath, kDataRolePath, + std::bind(&updatePortStatus, usb))); + } + return 0; } static int usbDeviceAdded(const char *devname, void* client_data) { string pogoEnableHub; int uniqueId = 0; + ::aidl::android::hardware::usb::Usb *usb; + + usb = (::aidl::android::hardware::usb::Usb *)client_data; // Enable hub tuning when the pogo dock is connected. if (ReadFileToString(kPogoEnableHub, &pogoEnableHub) && Trim(pogoEnableHub) == "1") { // If enable_hub is set to 1, the internal hub is the first enumearted device on bus 1 and // port 1. uniqueId = usb_device_get_unique_id_from_name(devname); - if (uniqueId == getInternalHubUniqueId()) - tuneInternalHub(devname, client_data); + if (uniqueId == getInternalHubUniqueId()) { + ALOGI("Internal hub enabled"); + usb->mIntHubEnabled = true; + tuneInternalHub(devname, usb); + usb->mUsbDataSessionMonitor.reset(new UsbDataSessionMonitor(kUdcUeventRegex, + kUdcStatePath, kHubHost1UeventRegex, + kHubHost1StatePath, kHubHost2UeventRegex, + kHubHost2StatePath, kDataRolePath, + std::bind(&updatePortStatus, usb))); + } } return 0; @@ -554,12 +590,6 @@ void *usbHostWork(void *param) { return NULL; } -void updatePortStatus(android::hardware::usb::Usb *usb) { - std::vector currentPortStatus; - - queryVersionHelper(usb, ¤tPortStatus); -} - Usb::Usb() : mLock(PTHREAD_MUTEX_INITIALIZER), mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER), diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h index dca913d2..63e200a0 100644 --- a/usb/usb/Usb.h +++ b/usb/usb/Usb.h @@ -93,6 +93,7 @@ struct Usb : public BnUsb { // Report usb data session event and data incompliance warnings std::unique_ptr mUsbDataSessionMonitor; + bool mIntHubEnabled; // Usb Overheat object for push suez event UsbOverheatEvent mOverheat; // Temperature when connected