From 89dfe032b8186ac141321c0c578f405cdb1f000f Mon Sep 17 00:00:00 2001 From: Albert Wang Date: Tue, 23 Mar 2021 16:27:22 +0800 Subject: [PATCH] Update USB HAL to V1.3 implementation Supports to enable/disable USB data signaling Bug: 161414036 Test: Pass USB V1.3 HIDL tests Signed-off-by: Albert Wang Change-Id: I370e69264bec6c2c7ac61094db49f5e3a4b317b6 --- CleanSpec.mk | 8 +++ device.mk | 2 +- usb/Android.bp | 9 +-- usb/Usb.cpp | 70 ++++++++++++++----- usb/Usb.h | 44 +++++++++--- ...ndroid.hardware.usb@1.2-service.sunfish.rc | 13 ---- ...ndroid.hardware.usb@1.3-service.sunfish.rc | 21 ++++++ ...roid.hardware.usb@1.3-service.sunfish.xml} | 2 +- usb/service.cpp | 8 +-- 9 files changed, 127 insertions(+), 50 deletions(-) delete mode 100644 usb/android.hardware.usb@1.2-service.sunfish.rc create mode 100644 usb/android.hardware.usb@1.3-service.sunfish.rc rename usb/{android.hardware.usb@1.2-service.sunfish.xml => android.hardware.usb@1.3-service.sunfish.xml} (90%) diff --git a/CleanSpec.mk b/CleanSpec.mk index 241b5ddb..bbebe65e 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -120,3 +120,11 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.po # Remove generic atrace HAL $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.atrace@1.0-service.rc) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.atrace@1.0-service.xml) + +# Update to USB HAL 1.3 +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb@1.2-service.sunfish) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb@1.2-service.sunfish.rc) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb@1.2-service.sunfish.xml) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb@1.3-service.sunfish) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb@1.3-service.sunfish.rc) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb@1.3-service.sunfish.xml) diff --git a/device.mk b/device.mk index 3b3a2d91..e92db181 100644 --- a/device.mk +++ b/device.mk @@ -451,7 +451,7 @@ PRODUCT_COPY_FILES += \ device/google/sunfish/nfc/libnfc-nci.conf:$(TARGET_COPY_OUT_PRODUCT)/etc/libnfc-nci.conf PRODUCT_PACKAGES += \ - android.hardware.usb@1.2-service.sunfish + android.hardware.usb@1.3-service.sunfish PRODUCT_PACKAGES += \ android.hardware.health@2.1-impl-sunfish \ diff --git a/usb/Android.bp b/usb/Android.bp index 42fc8e03..f2173a8c 100644 --- a/usb/Android.bp +++ b/usb/Android.bp @@ -1,5 +1,5 @@ // -// Copyright (C) 2018 The Android Open Source Project +// Copyright (C) 2021 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ package { } cc_binary { - name: "android.hardware.usb@1.2-service.sunfish", + name: "android.hardware.usb@1.3-service.sunfish", relative_install_path: "hw", - init_rc: ["android.hardware.usb@1.2-service.sunfish.rc"], + init_rc: ["android.hardware.usb@1.3-service.sunfish.rc"], vintf_fragments: [ - "android.hardware.usb@1.2-service.sunfish.xml", + "android.hardware.usb@1.3-service.sunfish.xml", "android.hardware.usb.gadget@1.2-service.sunfish.xml", ], srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"], @@ -30,6 +30,7 @@ cc_binary { "android.hardware.usb@1.0", "android.hardware.usb@1.1", "android.hardware.usb@1.2", + "android.hardware.usb@1.3", "android.hardware.usb.gadget@1.0", "android.hardware.usb.gadget@1.1", "android.hardware.usb.gadget@1.2", diff --git a/usb/Usb.cpp b/usb/Usb.cpp index 474c3beb..b7bf7f52 100644 --- a/usb/Usb.cpp +++ b/usb/Usb.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_TAG "android.hardware.usb@1.2-service.sunfish" +#define LOG_TAG "android.hardware.usb@1.3-service.sunfish" #include #include @@ -41,9 +41,49 @@ using android::base::GetProperty; namespace android { namespace hardware { namespace usb { -namespace V1_2 { +namespace V1_3 { namespace implementation { +Return Usb::enableUsbDataSignal(bool enable) { + bool result = true; + + ALOGI("Userspace turn %s USB data signaling", enable ? "on" : "off"); + + if (enable) { + if (!WriteStringToFile("1", USB_DATA_PATH)) { + ALOGE("Not able to turn on usb connection notification"); + result = false; + } + + if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) { + ALOGE("Gadget cannot be pulled up"); + result = false; + } + } else { + if (!WriteStringToFile("1", ID_PATH)) { + ALOGE("Not able to turn off host mode"); + result = false; + } + + if (!WriteStringToFile("0", VBUS_PATH)) { + ALOGE("Not able to set Vbus state"); + result = false; + } + + if (!WriteStringToFile("0", USB_DATA_PATH)) { + ALOGE("Not able to turn on usb connection notification"); + result = false; + } + + if (!WriteStringToFile("none", PULLUP_PATH)) { + ALOGE("Gadget cannot be pulled down"); + result = false; + } + } + + return result; +} + // Set by the signal handler to destroy the thread volatile bool destroyThread; @@ -52,8 +92,7 @@ constexpr char kDetectedPath[] = "/sys/class/power_supply/usb/moisture_detected" constexpr char kConsole[] = "init.svc.console"; constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable"; -void queryVersionHelper(android::hardware::usb::V1_2::implementation::Usb *usb, - hidl_vec *currentPortStatus_1_2); +void queryVersionHelper(implementation::Usb *usb, hidl_vec *currentPortStatus_1_2); int32_t readFile(const std::string &filename, std::string *contents) { FILE *fp; @@ -104,9 +143,9 @@ Status queryMoistureDetectionStatus(hidl_vec *currentPortStatus_1_2) (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes = 0; (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes |= - ContaminantProtectionMode::FORCE_SINK; - (*currentPortStatus_1_2)[0].contaminantProtectionStatus = ContaminantProtectionStatus::NONE; - (*currentPortStatus_1_2)[0].contaminantDetectionStatus = ContaminantDetectionStatus::DISABLED; + V1_2::ContaminantProtectionMode::FORCE_SINK; + (*currentPortStatus_1_2)[0].contaminantProtectionStatus = V1_2::ContaminantProtectionStatus::NONE; + (*currentPortStatus_1_2)[0].contaminantDetectionStatus = V1_2::ContaminantDetectionStatus::DISABLED; (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceDetection = true; (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceProtection = false; @@ -122,12 +161,12 @@ Status queryMoistureDetectionStatus(hidl_vec *currentPortStatus_1_2) } if (status == "1") { (*currentPortStatus_1_2)[0].contaminantDetectionStatus = - ContaminantDetectionStatus::DETECTED; + V1_2::ContaminantDetectionStatus::DETECTED; (*currentPortStatus_1_2)[0].contaminantProtectionStatus = - ContaminantProtectionStatus::FORCE_SINK; + V1_2::ContaminantProtectionStatus::FORCE_SINK; } else (*currentPortStatus_1_2)[0].contaminantDetectionStatus = - ContaminantDetectionStatus::NOT_DETECTED; + V1_2::ContaminantDetectionStatus::NOT_DETECTED; } ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d", @@ -557,8 +596,7 @@ Status getPortStatusHelper(hidl_vec *currentPortStatus_1_2, HALVersi return Status::ERROR; } -void queryVersionHelper(android::hardware::usb::V1_2::implementation::Usb *usb, - hidl_vec *currentPortStatus_1_2) { +void queryVersionHelper(implementation::Usb *usb, hidl_vec *currentPortStatus_1_2) { hidl_vec currentPortStatus_1_1; hidl_vec currentPortStatus; Status status; @@ -609,7 +647,7 @@ Return Usb::queryPortStatus() { struct data { int uevent_fd; - android::hardware::usb::V1_2::implementation::Usb *usb; + android::hardware::usb::V1_3::implementation::Usb *usb; }; static void uevent_event(uint32_t /*epevents*/, struct data *payload) { @@ -682,7 +720,7 @@ void *work(void *param) { } payload.uevent_fd = uevent_fd; - payload.usb = (android::hardware::usb::V1_2::implementation::Usb *)param; + payload.usb = (android::hardware::usb::V1_3::implementation::Usb *)param; fcntl(uevent_fd, F_SETFL, O_NONBLOCK); @@ -797,7 +835,7 @@ Return Usb::setCallback(const sp &callback) { } } // namespace implementation -} // namespace V1_2 +} // namespace V1_3 } // namespace usb } // namespace hardware } // namespace android diff --git a/usb/Usb.h b/usb/Usb.h index 65be180d..5ff110d4 100644 --- a/usb/Usb.h +++ b/usb/Usb.h @@ -1,10 +1,26 @@ -#ifndef ANDROID_HARDWARE_USB_V1_1_USB_H -#define ANDROID_HARDWARE_USB_V1_1_USB_H +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once -#include +#include #include #include +#include #include +#include #include #define UEVENT_MSG_LEN 2048 @@ -17,10 +33,11 @@ namespace android { namespace hardware { namespace usb { -namespace V1_2 { +namespace V1_3 { namespace implementation { using ::android::sp; +using ::android::base::WriteStringToFile; using ::android::hardware::hidl_array; using ::android::hardware::hidl_memory; using ::android::hardware::hidl_string; @@ -32,21 +49,27 @@ using ::android::hardware::usb::V1_0::PortPowerRole; using ::android::hardware::usb::V1_0::PortRole; using ::android::hardware::usb::V1_0::PortRoleType; using ::android::hardware::usb::V1_0::Status; -using ::android::hardware::usb::V1_2::IUsb; -using ::android::hardware::usb::V1_2::IUsbCallback; - using ::android::hardware::usb::V1_1::PortMode_1_1; using ::android::hardware::usb::V1_1::PortStatus_1_1; using ::android::hardware::usb::V1_2::PortStatus; +using ::android::hardware::usb::V1_2::IUsbCallback; +using ::android::hardware::usb::V1_3::IUsb; using ::android::hidl::base::V1_0::DebugInfo; using ::android::hidl::base::V1_0::IBase; enum class HALVersion{ V1_0, V1_1, - V1_2 + V1_2, + V1_3 }; +constexpr char kGadgetName[] = "a600000.dwc3"; +#define SOC_PATH "/sys/devices/platform/soc/a600000.ssusb/" +#define ID_PATH SOC_PATH "id" +#define VBUS_PATH SOC_PATH "b_sess" +#define USB_DATA_PATH SOC_PATH "usb_data_enabled" + struct Usb : public IUsb { Usb(); @@ -55,6 +78,7 @@ struct Usb : public IUsb { Return queryPortStatus() override; Return enableContaminantPresenceDetection(const hidl_string& portName, bool enable); Return enableContaminantPresenceProtection(const hidl_string& portName, bool enable); + Return enableUsbDataSignal(bool enable) override; sp mCallback_1_0; // Protects mCallback variable @@ -73,9 +97,7 @@ struct Usb : public IUsb { }; } // namespace implementation -} // namespace V1_2 +} // namespace V1_3 } // namespace usb } // namespace hardware } // namespace android - -#endif // ANDROID_HARDWARE_USB_V1_2_USB_H diff --git a/usb/android.hardware.usb@1.2-service.sunfish.rc b/usb/android.hardware.usb@1.2-service.sunfish.rc deleted file mode 100644 index 4d3fbe3a..00000000 --- a/usb/android.hardware.usb@1.2-service.sunfish.rc +++ /dev/null @@ -1,13 +0,0 @@ -service vendor.usb-hal-1-2 /vendor/bin/hw/android.hardware.usb@1.2-service.sunfish - class hal - user root - group root system shell mtp - -on boot - chown root system /sys/class/typec/port0/power_role - chown root system /sys/class/typec/port0/data_role - chown root system /sys/class/typec/port0/port_type - chmod 664 /sys/class/typec/port0/power_role - chmod 664 /sys/class/typec/port0/data_role - chmod 664 /sys/class/typec/port0/port_type - chmod 664 /sys/class/power_supply/usb/moisture_detection_enabled diff --git a/usb/android.hardware.usb@1.3-service.sunfish.rc b/usb/android.hardware.usb@1.3-service.sunfish.rc new file mode 100644 index 00000000..2c2f4e52 --- /dev/null +++ b/usb/android.hardware.usb@1.3-service.sunfish.rc @@ -0,0 +1,21 @@ +service vendor.usb-hal-1-3 /vendor/bin/hw/android.hardware.usb@1.3-service.sunfish + class hal + user root + group root system shell mtp + +on boot + chown root system /sys/class/typec/port0/power_role + chown root system /sys/class/typec/port0/data_role + chown root system /sys/class/typec/port0/port_type + chmod 664 /sys/class/typec/port0/power_role + chmod 664 /sys/class/typec/port0/data_role + chmod 664 /sys/class/typec/port0/port_type + chmod 664 /sys/class/power_supply/usb/moisture_detection_enabled + +on post-fs + chown root system /sys/devices/platform/soc/a600000.ssusb/id + chown root system /sys/devices/platform/soc/a600000.ssusb/b_sess + chown root system /sys/devices/platform/soc/a600000.ssusb/usb_data_enabled + chmod 664 /sys/devices/platform/soc/a600000.ssusb/id + chmod 664 /sys/devices/platform/soc/a600000.ssusb/b_sess + chmod 664 /sys/devices/platform/soc/a600000.ssusb/usb_data_enabled diff --git a/usb/android.hardware.usb@1.2-service.sunfish.xml b/usb/android.hardware.usb@1.3-service.sunfish.xml similarity index 90% rename from usb/android.hardware.usb@1.2-service.sunfish.xml rename to usb/android.hardware.usb@1.3-service.sunfish.xml index 25ecf65a..cd542687 100644 --- a/usb/android.hardware.usb@1.2-service.sunfish.xml +++ b/usb/android.hardware.usb@1.3-service.sunfish.xml @@ -2,7 +2,7 @@ android.hardware.usb hwbinder - 1.2 + 1.3 IUsb default diff --git a/usb/service.cpp b/usb/service.cpp index e9b25a34..250cd7e3 100644 --- a/usb/service.cpp +++ b/usb/service.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_TAG "android.hardware.usb@1.2-service.sunfish" +#define LOG_TAG "android.hardware.usb@1.3-service.sunfish" #include #include "Usb.h" @@ -29,8 +29,8 @@ using android::hardware::joinRpcThreadpool; // Generated HIDL files using android::hardware::usb::gadget::V1_2::IUsbGadget; using android::hardware::usb::gadget::V1_2::implementation::UsbGadget; -using android::hardware::usb::V1_2::IUsb; -using android::hardware::usb::V1_2::implementation::Usb; +using android::hardware::usb::V1_3::IUsb; +using android::hardware::usb::V1_3::implementation::Usb; using android::OK; using android::status_t;