summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Chi <raychi@google.com>2022-05-03 13:30:55 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-05-03 13:30:55 +0000
commit6e2a176cf1dab1b41cd8817955f50f25ce70b463 (patch)
tree986998d2ab8a3e4c4667a577c137badcdd054b18
parent0271740633d62dab5942d3ec8b04426daf96df97 (diff)
parent2b4eaf62b4f8db80fd2dc7138eb982409d3aa2c9 (diff)
downloadbarbet-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.cpp118
-rw-r--r--usb/usb/Usb.h10
-rw-r--r--usb/usb/android.hardware.usb-service.rc8
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, &currentPortStatus);
-// 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, &currentPortStatus);
+
+ 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