From ba43d547b649a7b0ced0bed00ae3e9284d90525b Mon Sep 17 00:00:00 2001 From: Ricky Niu Date: Mon, 12 Dec 2022 19:52:26 +0800 Subject: [PATCH] usb: migration to USB gadget AIDL Using the USB gadget AIDL Bug: 261027750 Test: USB function switch success and AIDL service is running. Change-Id: I4781ac9eb641a5340ecfb6bda0881761b7a01eb2 --- usbd/Android.bp | 2 ++ usbd/usbd.cpp | 79 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/usbd/Android.bp b/usbd/Android.bp index 27db0fa6b..e67759c53 100644 --- a/usbd/Android.bp +++ b/usbd/Android.bp @@ -8,10 +8,12 @@ cc_binary { srcs: ["usbd.cpp"], shared_libs: [ "libbase", + "libbinder_ndk", "libhidlbase", "liblog", "libutils", "libhardware", "android.hardware.usb.gadget@1.0", + "android.hardware.usb.gadget-V1-ndk", ], } diff --git a/usbd/usbd.cpp b/usbd/usbd.cpp index 6e24d8e78..0616cfb00 100644 --- a/usbd/usbd.cpp +++ b/usbd/usbd.cpp @@ -18,43 +18,78 @@ #include +#include +#include #include #include +#include +#include #include -#include - +using aidl::android::hardware::usb::gadget::GadgetFunction; using android::base::GetProperty; using android::base::SetProperty; -using android::hardware::configureRpcThreadpool; -using android::hardware::usb::gadget::V1_0::GadgetFunction; -using android::hardware::usb::gadget::V1_0::IUsbGadget; using android::hardware::Return; +using ndk::ScopedAStatus; +using std::shared_ptr; + +std::atomic sUsbOperationCount{}; int main(int /*argc*/, char** /*argv*/) { if (GetProperty("ro.bootmode", "") == "charger") exit(0); + int operationId = sUsbOperationCount++; - configureRpcThreadpool(1, true /*callerWillJoin*/); - android::sp gadget = IUsbGadget::getService(); - Return ret; + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); + const std::string service_name = + std::string(aidl::android::hardware::usb::gadget::IUsbGadget::descriptor) + .append("/default"); - if (gadget != nullptr) { - LOG(INFO) << "Usb HAL found."; - std::string function = GetProperty("persist.sys.usb.config", ""); - if (function == "adb") { - LOG(INFO) << "peristent prop is adb"; - SetProperty("ctl.start", "adbd"); - ret = gadget->setCurrentUsbFunctions(static_cast(GadgetFunction::ADB), - nullptr, 0); + std::string function = GetProperty("persist.sys.usb.config", ""); + if (function == "adb") { + LOG(INFO) << "persistent prop is adb"; + SetProperty("ctl.start", "adbd"); + } + + if (AServiceManager_isDeclared(service_name.c_str())) { + shared_ptr gadget_aidl = + aidl::android::hardware::usb::gadget::IUsbGadget::fromBinder( + ndk::SpAIBinder(AServiceManager_waitForService(service_name.c_str()))); + ScopedAStatus ret; + if (gadget_aidl != nullptr) { + LOG(INFO) << "Usb AIDL HAL found."; + if (function == "adb") { + ret = gadget_aidl->setCurrentUsbFunctions( + static_cast(GadgetFunction::ADB), nullptr, 0, operationId); + } else { + LOG(INFO) << "Signal MTP to enable default functions"; + ret = gadget_aidl->setCurrentUsbFunctions( + static_cast(GadgetFunction::MTP), nullptr, 0, operationId); + } + + if (!ret.isOk()) LOG(ERROR) << "Error while invoking usb hal"; } else { - LOG(INFO) << "Signal MTP to enable default functions"; - ret = gadget->setCurrentUsbFunctions(static_cast(GadgetFunction::MTP), - nullptr, 0); + LOG(INFO) << "Usb AIDL HAL not found"; } - - if (!ret.isOk()) LOG(ERROR) << "Error while invoking usb hal"; } else { - LOG(INFO) << "Usb HAL not found"; + android::sp gadget = + android::hardware::usb::gadget::V1_0::IUsbGadget::getService(); + Return ret; + if (gadget != nullptr) { + LOG(INFO) << "Usb HAL found."; + if (function == "adb") { + ret = gadget->setCurrentUsbFunctions(static_cast(GadgetFunction::ADB), + nullptr, 0); + } else { + LOG(INFO) << "Signal MTP to enable default functions"; + ret = gadget->setCurrentUsbFunctions(static_cast(GadgetFunction::MTP), + nullptr, 0); + } + + if (!ret.isOk()) LOG(ERROR) << "Error while invoking usb hal"; + } else { + LOG(INFO) << "Usb HAL not found"; + } } exit(0); }