diff --git a/usbd/Android.bp b/usbd/Android.bp new file mode 100644 index 000000000..4f9338fef --- /dev/null +++ b/usbd/Android.bp @@ -0,0 +1,16 @@ +cc_binary { + name: "usbd", + init_rc: ["usbd.rc"], + srcs: ["usbd.cpp"], + shared_libs: [ + "libbase", + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", + "libhardware", + "android.hardware.usb.gadget@1.0", + "libcutils", + ], +} + diff --git a/usbd/usbd.cpp b/usbd/usbd.cpp new file mode 100644 index 000000000..41cd8dd9b --- /dev/null +++ b/usbd/usbd.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2018 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. + */ + +#define LOG_TAG "usbd" + +#include + +#include +#include +#include + +#define PERSISTENT_USB_CONFIG "persist.sys.usb.config" + +using android::base::GetProperty; +using android::base::SetProperty; +using android::hardware::usb::gadget::V1_0::GadgetFunction; +using android::hardware::usb::gadget::V1_0::IUsbGadget; +using android::hardware::Return; + +int main(int /*argc*/, char** /*argv*/) { + android::sp gadget = IUsbGadget::getService(); + Return ret; + + if (gadget != nullptr) { + LOG(INFO) << "Usb HAL found."; + std::string function = GetProperty(PERSISTENT_USB_CONFIG, ""); + if (function == "adb") { + LOG(INFO) << "peristent prop is adb"; + SetProperty("ctl.start", "adbd"); + 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); +} diff --git a/usbd/usbd.rc b/usbd/usbd.rc new file mode 100644 index 000000000..c7838e831 --- /dev/null +++ b/usbd/usbd.rc @@ -0,0 +1,5 @@ +service usbd /system/bin/usbd + class late_start + oneshot + user root + group root usb