From 005049d207a9f3c0f87d26329c8776640ba756d6 Mon Sep 17 00:00:00 2001 From: RD Babiera Date: Tue, 20 Sep 2022 23:35:04 +0000 Subject: [PATCH 1/3] Usb non-compliant port partner implementation Adds vendor code for non-compliant charger feature. Currently updates service version. Minor port of commit 96ccf93453583642a15dd96b1e4d6bf0645fc10b Test: atest VtsAidlUsbTargetTest Bug: 236322506 Change-Id: Ie1a48b1acaaae9a53f3b9bfebcfee7a2f4814810 (cherry picked from commit 96ccf93453583642a15dd96b1e4d6bf0645fc10b) --- usb/usb/Usb.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index 19454049..b71d33c0 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -66,6 +66,11 @@ constexpr char kI2CPath[] = "/sys/devices/platform/10cb0000.hsi2c/i2c-"; constexpr char kContaminantDetectionPath[] = "-0025/contaminant_detection"; constexpr char kDisplayPortDrmPath[] = "/sys/devices/platform/110f0000.drmdp/drm-displayport/"; constexpr char kDisplayPortUsbPath[] = "/sys/class/typec/port0-partner/"; +constexpr char kComplianceWarningsPath[] = "device/non_compliant_reasons"; +constexpr char kComplianceWarningBC12[] = "bc12"; +constexpr char kComplianceWarningDebugAccessory[] = "debug-accessory"; +constexpr char kComplianceWarningMissingRp[] = "missing_rp"; +constexpr char kComplianceWarningOther[] = "other"; constexpr char kStatusPath[] = "-0025/contaminant_detection_status"; constexpr char kSinkLimitEnable[] = "-0025/usb_limit_sink_enable"; constexpr char kSourceLimitEnable[] = "-0025/usb_limit_source_enable"; @@ -270,6 +275,42 @@ Status queryMoistureDetectionStatus(std::vector *currentPortStatus) return Status::SUCCESS; } +Status queryNonCompliantChargerStatus(std::vector *currentPortStatus) { + string reasons, path; + + for (int i = 0; i < currentPortStatus->size(); i++) { + (*currentPortStatus)[i].supportsComplianceWarnings = true; + path = string(kTypecPath) + "/" + (*currentPortStatus)[i].portName + "/" + + string(kComplianceWarningsPath); + if (ReadFileToString(path.c_str(), &reasons)) { + std::vector reasonsList = Tokenize(reasons.c_str(), "[], \n\0"); + for (string reason : reasonsList) { + if (!strncmp(reason.c_str(), kComplianceWarningDebugAccessory, + strlen(kComplianceWarningDebugAccessory))) { + (*currentPortStatus)[i].complianceWarnings.push_back(ComplianceWarning::DEBUG_ACCESSORY); + continue; + } + if (!strncmp(reason.c_str(), kComplianceWarningBC12, + strlen(kComplianceWarningBC12))) { + (*currentPortStatus)[i].complianceWarnings.push_back(ComplianceWarning::BC_1_2); + continue; + } + if (!strncmp(reason.c_str(), kComplianceWarningMissingRp, + strlen(kComplianceWarningMissingRp))) { + (*currentPortStatus)[i].complianceWarnings.push_back(ComplianceWarning::MISSING_RP); + continue; + } + if (!strncmp(reason.c_str(), kComplianceWarningOther, + strlen(kComplianceWarningOther))) { + (*currentPortStatus)[i].complianceWarnings.push_back(ComplianceWarning::OTHER); + continue; + } + } + } + } + return Status::SUCCESS; +} + string appendRoleNodeHelper(const string &portName, PortRole::Tag tag) { string node("/sys/class/typec/" + portName); @@ -771,6 +812,7 @@ void queryVersionHelper(android::hardware::usb::Usb *usb, status = getPortStatusHelper(usb, currentPortStatus); queryMoistureDetectionStatus(currentPortStatus); queryPowerTransferStatus(currentPortStatus); + queryNonCompliantChargerStatus(currentPortStatus); if (usb->mCallback != NULL) { ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus, status); From e707356f6a65440feb3ba40b4d721d2efd6a5ca6 Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Sat, 11 Feb 2023 09:49:45 +0000 Subject: [PATCH 2/3] Usb: Set connected status when connected to non compliant port partners Set mode, power role and data role when connected to non compliant port partners. Bug: 268584498 Change-Id: I6c3e7df09a61e26f3b976a86bd65cb646edd653d Signed-off-by: Badhri Jagan Sridharan (cherry picked from commit 7c2d62aafc219af11252dabf49d84d84b7ccfa57) --- usb/usb/Usb.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index b71d33c0..090c1b39 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -306,6 +306,12 @@ Status queryNonCompliantChargerStatus(std::vector *currentPortStatus continue; } } + if ((*currentPortStatus)[i].complianceWarnings.size() > 0) { + (*currentPortStatus)[i].currentMode = PortMode::UFP; + (*currentPortStatus)[i].currentPowerRole = PortPowerRole::SINK; + (*currentPortStatus)[i].currentDataRole = PortDataRole::NONE; + (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::CONNECTED; + } } } return Status::SUCCESS; From 47e1400c8fef8af1aea985795d7adfe3ff16871b Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Tue, 16 May 2023 03:52:41 +0000 Subject: [PATCH 3/3] Usb: Populate UsbDataStatus only when not populated Do not override UsbDataStatus when already populated. Compliance warnings such as missing Rp do not populate UsbDataStatus and the port partner is detected. Populate UsbDataStatus only when not populated. Bug: 279251052 Change-Id: Ibe71bdd5c521ba90c124d89bd56af90087c0df18 --- usb/usb/Usb.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index 090c1b39..bf82acad 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -306,7 +306,8 @@ Status queryNonCompliantChargerStatus(std::vector *currentPortStatus continue; } } - if ((*currentPortStatus)[i].complianceWarnings.size() > 0) { + if ((*currentPortStatus)[i].complianceWarnings.size() > 0 && + (*currentPortStatus)[i].currentPowerRole == PortPowerRole::NONE) { (*currentPortStatus)[i].currentMode = PortMode::UFP; (*currentPortStatus)[i].currentPowerRole = PortPowerRole::SINK; (*currentPortStatus)[i].currentDataRole = PortDataRole::NONE;