summaryrefslogtreecommitdiff
path: root/usb/MonitorFfs.cpp
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-04 02:21:40 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-04 02:21:40 +0000
commit7bb61e1e3d2eb83681c1f7890d307501eecc442d (patch)
treefc5699671449d0d51c34dc7e97fa8f0da931a269 /usb/MonitorFfs.cpp
parent487abc3c547f6bf8e00a82a1acabc95fdd097463 (diff)
parent78b56211491a0839760625807b044e3d8a4ec6dc (diff)
Snap for 9562233 from 78b56211491a0839760625807b044e3d8a4ec6dc to tm-qpr3-release
Change-Id: I419aaaa7e26d72797fe5994ebff5211060477404
Diffstat (limited to 'usb/MonitorFfs.cpp')
-rw-r--r--usb/MonitorFfs.cpp36
1 files changed, 33 insertions, 3 deletions
diff --git a/usb/MonitorFfs.cpp b/usb/MonitorFfs.cpp
index 717e6a7..7a5ad9d 100644
--- a/usb/MonitorFfs.cpp
+++ b/usb/MonitorFfs.cpp
@@ -26,7 +26,8 @@ namespace usb {
static volatile bool gadgetPullup;
-MonitorFfs::MonitorFfs(const char *const gadget)
+MonitorFfs::MonitorFfs(const char *const gadget, const char *const extconTypecState,
+ const char *const usbGadgetState)
: mWatchFd(),
mEndpointList(),
mLock(),
@@ -37,6 +38,8 @@ MonitorFfs::MonitorFfs(const char *const gadget)
mCallback(NULL),
mPayload(NULL),
mGadgetName(gadget),
+ mExtconTypecState(extconTypecState),
+ mUsbGadgetState(usbGadgetState),
mMonitorRunning(false) {
unique_fd eventFd(eventfd(0, 0));
if (eventFd == -1) {
@@ -112,12 +115,26 @@ static void displayInotifyEvent(struct inotify_event *i) {
ALOGE(" name = %s\n", i->name);
}
+void updateState(const char *typecState, const char *usbGadgetState, std::string &typec_state,
+ std::string &usb_gadget_state) {
+ if (ReadFileToString(typecState, &typec_state))
+ typec_state = Trim(typec_state);
+ else
+ typec_state = TYPEC_GADGET_MODE_ENABLE;
+
+ if (ReadFileToString(usbGadgetState, &usb_gadget_state))
+ usb_gadget_state = Trim(usb_gadget_state);
+ else
+ usb_gadget_state = "";
+}
+
void *MonitorFfs::startMonitorFd(void *param) {
MonitorFfs *monitorFfs = (MonitorFfs *)param;
char buf[kBufferSize];
bool writeUdc = true, stopMonitor = false;
struct epoll_event events[kEpollEvents];
steady_clock::time_point disconnect;
+ std::string typec_state, usb_gadget_state;
bool descriptorWritten = true;
for (int i = 0; i < static_cast<int>(monitorFfs->mEndpointList.size()); i++) {
@@ -127,8 +144,14 @@ void *MonitorFfs::startMonitorFd(void *param) {
}
}
+ updateState(monitorFfs->mExtconTypecState, monitorFfs->mUsbGadgetState, typec_state,
+ usb_gadget_state);
+
// notify here if the endpoints are already present.
- if (descriptorWritten) {
+ if (typec_state == TYPEC_GADGET_MODE_DISABLE && usb_gadget_state == GADGET_ACTIVATE) {
+ gadgetPullup = false;
+ ALOGI("pending GADGET pulled up due to USB disconnected");
+ } else if (descriptorWritten) {
usleep(kPullUpDelay);
if (!!WriteStringToFile(monitorFfs->mGadgetName, PULLUP_PATH)) {
lock_guard<mutex> lock(monitorFfs->mLock);
@@ -172,7 +195,14 @@ void *MonitorFfs::startMonitorFd(void *param) {
}
}
- if (!descriptorPresent && !writeUdc) {
+ updateState(monitorFfs->mExtconTypecState, monitorFfs->mUsbGadgetState,
+ typec_state, usb_gadget_state);
+
+ if (typec_state == TYPEC_GADGET_MODE_DISABLE &&
+ usb_gadget_state == GADGET_ACTIVATE) {
+ gadgetPullup = false;
+ ALOGI("pending GADGET pulled up due to USB disconnected");
+ } else if (!descriptorPresent && !writeUdc) {
if (kDebug)
ALOGI("endpoints not up");
writeUdc = true;