diff options
author | Ray Chi <raychi@google.com> | 2022-05-03 13:30:55 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-05-03 13:30:55 +0000 |
commit | 6e2a176cf1dab1b41cd8817955f50f25ce70b463 (patch) | |
tree | 986998d2ab8a3e4c4667a577c137badcdd054b18 | |
parent | 0271740633d62dab5942d3ec8b04426daf96df97 (diff) | |
parent | 2b4eaf62b4f8db80fd2dc7138eb982409d3aa2c9 (diff) | |
download | barbet-6e2a176cf1dab1b41cd8817955f50f25ce70b463.tar.gz |
Implement callbacks for USB AIDL am: 2b4eaf62b4
Original change: https://googleplex-android-review.googlesource.com/c/device/google/barbet/+/18133410
Change-Id: I0933e8b92e53b6efbfd0bf299c733d086a73441c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | usb/usb/Usb.cpp | 118 | ||||
-rw-r--r-- | usb/usb/Usb.h | 10 | ||||
-rw-r--r-- | usb/usb/android.hardware.usb-service.rc | 8 |
3 files changed, 126 insertions, 10 deletions
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index d71455b..2450b62 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -115,19 +115,95 @@ ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable, return ScopedAStatus::ok(); } -// TODO: remove enableUsbDataWhileDocked() and add back later if ready -/*ScopedAStatus Usb::enableUsbDataWhileDocked(const string& in_portName, +ScopedAStatus Usb::enableUsbDataWhileDocked(const string& in_portName, int64_t in_transactionId) { -}*/ + std::vector<PortStatus> currentPortStatus; + + ALOGI("Userspace enableUsbDataWhileDocked opID:%ld", in_transactionId); + + pthread_mutex_lock(&mLock); + if (mCallback != NULL) { + ScopedAStatus ret = mCallback->notifyEnableUsbDataWhileDockedStatus( + in_portName, Status::NOT_SUPPORTED, in_transactionId); + if (!ret.isOk()) + ALOGE("notifyEnableUsbDataStatus error %s", ret.getDescription().c_str()); + } else { + ALOGE("Not notifying the userspace. Callback is not set"); + } + pthread_mutex_unlock(&mLock); + queryVersionHelper(this, ¤tPortStatus); -// TODO: remove resetUsbPort() and add back later if ready -/*ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_transactionId) { -}*/ + return ScopedAStatus::ok(); +} -// TODO: remove limitPowerTransfer() and add back later if ready -/*ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit, +ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_transactionId) { + bool result = true; + std::vector<PortStatus> currentPortStatus; + + ALOGI("Userspace reset USB Port. opID:%ld", in_transactionId); + + if (!WriteStringToFile("none", PULLUP_PATH)) { + ALOGI("Gadget cannot be pulled down"); + result = false; + } + + pthread_mutex_lock(&mLock); + if (mCallback != NULL) { + ::ndk::ScopedAStatus ret = mCallback->notifyResetUsbPortStatus( + in_portName, result ? Status::SUCCESS : Status::ERROR, in_transactionId); + if (!ret.isOk()) + ALOGE("notifyTransactionStatus error %s", ret.getDescription().c_str()); + } else { + ALOGE("Not notifying the userspace. Callback is not set"); + } + pthread_mutex_unlock(&mLock); + + return ::ndk::ScopedAStatus::ok(); +} + +ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit, int64_t in_transactionId) { -}*/ + std::vector<PortStatus> currentPortStatus; + bool sessionFail = false, success; + + pthread_mutex_lock(&mLock); + ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId); + + if (in_limit) { + success = WriteStringToFile("0", SINK_CURRENT_LIMIT_PATH); + if (!success) { + ALOGE("Failed to set sink current limit"); + sessionFail = true; + } + } + success = WriteStringToFile(in_limit ? "1" : "0", SINK_LIMIT_ENABLE_PATH); + if (!success) { + ALOGE("Failed to %s sink current limit: %s", in_limit ? "enable" : "disable", + SINK_LIMIT_ENABLE_PATH); + sessionFail = true; + } + success = WriteStringToFile(in_limit ? "1" : "0", SOURCE_LIMIT_ENABLE_PATH); + if (!success) { + ALOGE("Failed to %s source current limit: %s", in_limit ? "enable" : "disable", + SOURCE_LIMIT_ENABLE_PATH); + sessionFail = true; + } + + if (mCallback != NULL && in_transactionId >= 0) { + ScopedAStatus ret = mCallback->notifyLimitPowerTransferStatus( + in_portName, in_limit, sessionFail ? Status::ERROR : Status::SUCCESS, + in_transactionId); + if (!ret.isOk()) + ALOGE("limitPowerTransfer error %s", ret.getDescription().c_str()); + } else { + ALOGE("Not notifying the userspace. Callback is not set"); + } + + pthread_mutex_unlock(&mLock); + queryVersionHelper(this, ¤tPortStatus); + + return ScopedAStatus::ok(); +} Status queryMoistureDetectionStatus(std::vector<PortStatus> *currentPortStatus) { string enabled, status, path, DetectedPath; @@ -530,7 +606,13 @@ Status getPortStatusHelper(android::hardware::usb::Usb *usb, port.second ? canSwitchRoleHelper(port.first) : false; (*currentPortStatus)[i].supportedModes.push_back(PortMode::DRP); - (*currentPortStatus)[i].usbDataEnabled = usb->mUsbDataEnabled; //temporary + + if (!usb->mUsbDataEnabled) { + (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_FORCE); + } else { + (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::ENABLED); + } + (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::UNKNOWN; ALOGI("%d:%s connected:%d canChangeMode:%d canChagedata:%d canChangePower:%d " "usbDataEnabled:%d", @@ -546,12 +628,28 @@ done: return Status::ERROR; } +Status queryPowerTransferStatus(std::vector<PortStatus> *currentPortStatus) { + string enabled; + + if (!ReadFileToString(SINK_LIMIT_ENABLE_PATH, &enabled)) { + ALOGE("Failed to open limit_sink_enable"); + return Status::ERROR; + } + + enabled = Trim(enabled); + (*currentPortStatus)[0].powerTransferLimited = enabled == "1"; + + ALOGI("powerTransferLimited:%d", (*currentPortStatus)[0].powerTransferLimited ? 1 : 0); + return Status::SUCCESS; +} + void queryVersionHelper(android::hardware::usb::Usb *usb, std::vector<PortStatus> *currentPortStatus) { Status status; pthread_mutex_lock(&usb->mLock); status = getPortStatusHelper(usb, currentPortStatus); queryMoistureDetectionStatus(currentPortStatus); + queryPowerTransferStatus(currentPortStatus); if (usb->mCallback != NULL) { ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus, status); diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h index 9a883bc..94fbecb 100644 --- a/usb/usb/Usb.h +++ b/usb/usb/Usb.h @@ -49,6 +49,11 @@ constexpr char kGadgetName[] = "a600000.dwc3"; #define USB_DATA_PATH SOC_PATH "usb_data_enabled" #define VBUS_PATH SOC_PATH "b_sess" +#define USB_POWER_LIMIT_PATH "/sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/" +#define SINK_CURRENT_LIMIT_PATH USB_POWER_LIMIT_PATH "usb_limit_sink_current" +#define SINK_LIMIT_ENABLE_PATH USB_POWER_LIMIT_PATH "usb_limit_sink_enable" +#define SOURCE_LIMIT_ENABLE_PATH USB_POWER_LIMIT_PATH "usb_limit_source_enable" + struct Usb : public BnUsb { Usb(); @@ -60,6 +65,11 @@ struct Usb : public BnUsb { int64_t in_transactionId) override; ScopedAStatus enableUsbData(const string& in_portName, bool in_enable, int64_t in_transactionId) override; + ScopedAStatus enableUsbDataWhileDocked(const string& in_portName, + int64_t in_transactionId) override; + ScopedAStatus limitPowerTransfer(const string& in_portName, bool in_limit, + int64_t in_transactionId) override; + ScopedAStatus resetUsbPort(const string& in_portName, int64_t in_transactionId) override; std::shared_ptr<::aidl::android::hardware::usb::IUsbCallback> mCallback; // Protects mCallback variable diff --git a/usb/usb/android.hardware.usb-service.rc b/usb/usb/android.hardware.usb-service.rc index b035ee6..d881c93 100644 --- a/usb/usb/android.hardware.usb-service.rc +++ b/usb/usb/android.hardware.usb-service.rc @@ -2,3 +2,11 @@ service vendor.usb /vendor/bin/hw/android.hardware.usb-service.barbet class hal user system group system shell + +on boot + chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_enable + chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_source_enable + chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_current + chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_enable + chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_source_enable + chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_current |