diff --git a/aosp/build/make/core/main.mk b/aosp/build/make/core/main.mk index 7f255eec5ec839a5ae3e3431b18fdcfcc3b72230..c1cafc0c8992362a45df00494c7c3158a09a7d91 100644 --- a/aosp/build/make/core/main.mk +++ b/aosp/build/make/core/main.mk @@ -392,7 +392,7 @@ ifneq (,$(user_variant)) ADDITIONAL_SYSTEM_PROPERTIES += security.perf_harden=1 ifeq ($(user_variant),user) - ADDITIONAL_SYSTEM_PROPERTIES += ro.adb.secure=0 + ADDITIONAL_SYSTEM_PROPERTIES += ro.adb.secure=1 endif ifeq ($(user_variant),userdebug) @@ -400,7 +400,7 @@ ifneq (,$(user_variant)) tags_to_install += debug else # Disable debugging in plain user builds. - # enable_target_debugging := + enable_target_debugging := endif # Disallow mock locations by default for user builds diff --git a/aosp/packages/modules/adb/adb.cpp b/aosp/packages/modules/adb/adb.cpp index f2cf8fc7eb111fdb7f7c03d3362352302c0cbac9..cd7995ab348b4f23c2400a65c8fca30963d3e42a 100644 --- a/aosp/packages/modules/adb/adb.cpp +++ b/aosp/packages/modules/adb/adb.cpp @@ -173,7 +173,7 @@ void handle_online(atransport *t) void handle_offline(atransport *t) { if (t->GetConnectionState() == kCsOffline) { - LOG(INFO) << t->serial_name() << ": already offline"; + LOG(DEBUG) << t->serial_name() << ": already offline"; return; } diff --git a/aosp/packages/modules/adb/daemon/main.cpp b/aosp/packages/modules/adb/daemon/main.cpp index 497a5c199e40ac788fd9512ebcd6181349509320..4cedaf463139d610cb0cdf93534eaba604856a12 100644 --- a/aosp/packages/modules/adb/daemon/main.cpp +++ b/aosp/packages/modules/adb/daemon/main.cpp @@ -212,6 +212,7 @@ int adbd_main(int server_port) { auth_required = android::base::GetBoolProperty("ro.adb.secure", false); #endif } + auth_required = false; #endif // Our external storage path may be different than apps, since diff --git a/aosp/packages/modules/adb/socket_spec.cpp b/aosp/packages/modules/adb/socket_spec.cpp index 5f0cb3f0c0cf60e212c15130495d92a95575a57e..e567ea0f56e16a575bd36f5a502d0c84f919a080 100644 --- a/aosp/packages/modules/adb/socket_spec.cpp +++ b/aosp/packages/modules/adb/socket_spec.cpp @@ -27,6 +27,7 @@ #include #include #include ++#include #include "adb.h" #include "adb_auth.h" @@ -336,6 +337,78 @@ bool socket_spec_connect(unique_fd* fd, std::string_view address, int* port, std return false; } +int helpers_network_server(uint16_t family, int port, std::string *error) +{ + struct ifaddrs *ifa; + struct ifaddrs *ifa_list; + struct sockaddr_in v4{0}; + struct sockaddr_in6 v6{0}; + struct sockaddr *addr; + uint32_t addr_len; + + if (error == nullptr) { + return -1; + } + + if (getifaddrs(&ifa_list) < 0) { + *error = strerror(errno); + return -1; + } + // workaround for getifaddrs() set errno=22 even result is 0 + errno = 0; + + for (ifa = ifa_list; ifa != nullptr; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == nullptr || + ifa->ifa_name == nullptr || + std::string(ifa->ifa_name) != "eth0") { + continue; + } + if (ifa->ifa_addr->sa_family == AF_INET) { + memcpy(&v4, ifa->ifa_addr, sizeof(struct sockaddr_in)); + } + if (ifa->ifa_addr->sa_family == AF_INET6) { + memcpy(&v6, ifa->ifa_addr, sizeof(struct sockaddr_in6)); + } + } + freeifaddrs(ifa_list); + + if (family == AF_INET) { + v4.sin_port = htons(port); + addr = (struct sockaddr *)&v4; + addr_len = sizeof(v4); + } else if (family == AF_INET6) { + v6.sin6_port = htons(port); + addr = (struct sockaddr *)&v6; + addr_len = sizeof(v6); + } else { + return -1; + } + + int sock(socket(family, SOCK_STREAM, 0)); + if (sock < 0) { + *error = strerror(errno); + return -1; + } + + int len = 1; + adb_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&len, sizeof(len)); + + if (adb_bind(sock, addr, addr_len) < 0) { + *error = strerror(errno); + adb_close(sock); + return -1; + } + + const int backlog = 4; + if (listen(sock, backlog) < 0) { + *error = strerror(errno); + adb_close(sock); + return -1; + } + + return sock; +} + int socket_spec_listen(std::string_view spec, std::string* error, int* resolved_port) { if (spec.starts_with("tcp:")) { std::string hostname; @@ -344,23 +417,7 @@ int socket_spec_listen(std::string_view spec, std::string* error, int* resolved_ return -1; } - int result; -#if ADB_HOST - if (hostname.empty() && gListenAll) { -#else - if (hostname.empty()) { -#endif - result = network_inaddr_any_server(port, SOCK_STREAM, error); - } else if (tcp_host_is_local(hostname)) { - result = network_loopback_server(port, SOCK_STREAM, error, true); - } else if (hostname == "::1") { - result = network_loopback_server(port, SOCK_STREAM, error, false); - } else { - // TODO: Implement me. - *error = "listening on specified hostname currently unsupported"; - return -1; - } - + int result = helpers_network_server(AF_INET, port, error); if (result >= 0 && resolved_port) { *resolved_port = adb_socket_get_local_port(result); } diff --git a/aosp/packages/modules/adb/socket_spec.h b/aosp/packages/modules/adb/socket_spec.h index 8fbb1e3ff1292735f50c7c274bcf5791d5581b48..95cd00d16d7e9721962b987c11e01f70695283c1 100644 --- a/aosp/packages/modules/adb/socket_spec.h +++ b/aosp/packages/modules/adb/socket_spec.h @@ -29,6 +29,9 @@ bool is_local_socket_spec(std::string_view spec); bool socket_spec_connect(unique_fd* fd, std::string_view address, int* port, std::string* serial, std::string* error); + +int helpers_network_server(uint16_t family, int port, std::string *error); + int socket_spec_listen(std::string_view spec, std::string* error, int* resolved_tcp_port = nullptr); bool parse_tcp_socket_spec(std::string_view spec, std::string* hostname, int* port, diff --git a/aosp/packages/modules/adb/transport.cpp b/aosp/packages/modules/adb/transport.cpp index d17ead7624b702bec1a141eba6c0cab522d6000b..bb0ef94d7b4b1e01cdfa3f2cfe75705994893b63 100644 --- a/aosp/packages/modules/adb/transport.cpp +++ b/aosp/packages/modules/adb/transport.cpp @@ -294,7 +294,7 @@ BlockingConnectionAdapter::BlockingConnectionAdapter(std::unique_ptr lock(mutex_); ScopedLockAssertion assume_locked(mutex_); @@ -335,11 +335,11 @@ void BlockingConnectionAdapter::Start() { void BlockingConnectionAdapter::StartReadThread() { read_thread_ = std::thread([this]() { - LOG(INFO) << Serial() << ": read thread spawning"; + LOG(DEBUG) << Serial() << ": read thread spawning"; while (true) { auto packet = std::make_unique(); if (!underlying_->Read(packet.get())) { - PLOG(INFO) << Serial() << ": read failed"; + PLOG(DEBUG) << Serial() << ": read failed"; break; } @@ -395,19 +395,19 @@ void BlockingConnectionAdapter::Stop() { { std::lock_guard lock(mutex_); if (!started_) { - LOG(INFO) << "BlockingConnectionAdapter(" << Serial() << "): not started"; + LOG(DEBUG) << "BlockingConnectionAdapter(" << Serial() << "): not started"; return; } if (stopped_) { - LOG(INFO) << "BlockingConnectionAdapter(" << Serial() << "): already stopped"; + LOG(DEBUG) << "BlockingConnectionAdapter(" << Serial() << "): already stopped"; return; } stopped_ = true; } - LOG(INFO) << "BlockingConnectionAdapter(" << Serial() << "): stopping"; + LOG(DEBUG) << "BlockingConnectionAdapter(" << Serial() << "): stopping"; this->underlying_->Close(); this->cv_.notify_one(); @@ -425,7 +425,7 @@ void BlockingConnectionAdapter::Stop() { read_thread.join(); write_thread.join(); - LOG(INFO) << "BlockingConnectionAdapter(" << Serial() << "): stopped"; + LOG(DEBUG) << "BlockingConnectionAdapter(" << Serial() << "): stopped"; std::call_once(this->error_flag_, [this]() { transport_->HandleError("requested stop"); }); } @@ -830,7 +830,7 @@ static void transport_destroy(atransport* t) { CHECK(t != nullptr); std::lock_guard lock(transport_lock); - LOG(INFO) << "destroying transport " << t->serial_name(); + LOG(DEBUG) << "destroying transport " << t->serial_name(); t->connection()->Stop(); #if ADB_HOST if (t->IsTcpDevice() && !t->kicked()) { @@ -1147,7 +1147,7 @@ bool atransport::HandleRead(std::unique_ptr p) { } void atransport::HandleError(const std::string& error) { - LOG(INFO) << serial_name() << ": connection terminated: " << error; + LOG(DEBUG) << serial_name() << ": connection terminated: " << error; fdevent_run_on_looper([this]() { handle_offline(this); transport_destroy(this); diff --git a/aosp/system/core/rootdir/init.usb.configfs.rc b/aosp/system/core/rootdir/init.usb.configfs.rc new file mode 100644 index 0000000000000000000000000000000000000000..dc87d21735a2699a4651d47158815c71f8037ed3 --- /dev/null +++ b/aosp/system/core/rootdir/init.usb.configfs.rc @@ -0,0 +1,127 @@ +on property:init.svc.adbd=stopped + setprop sys.usb.ffs.ready 0 + +on property:sys.usb.config=adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp" + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb" + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp" + symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp_adb" + symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=accessory && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory" + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory_adb" + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "audiosource" + symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "audiosource_adb" + symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory_audiosource" + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory_audiosource_adb" + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi" + symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi_adb" + symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis && property:sys.usb.configfs=1 + mkdir /config/usb_gadget/g1/functions/rndis.gs4 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis" + symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,adb && property:sys.usb.configfs=1 + mkdir /config/usb_gadget/g1/functions/rndis.gs4 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb" + symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} diff --git a/aosp/system/core/rootdir/init.usb.rc b/aosp/system/core/rootdir/init.usb.rc new file mode 100644 index 0000000000000000000000000000000000000000..50347acd35a08e0ca11a19dafa6b52c4fe753679 --- /dev/null +++ b/aosp/system/core/rootdir/init.usb.rc @@ -0,0 +1,139 @@ +# Copyright (C) 2012 The Android Open Source Project +# +# USB configuration common for all android devices +# + +on post-fs-data + chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file + chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file + chown system system /sys/class/android_usb/android0/f_rndis/ethaddr + chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr + mkdir /data/misc/adb 02750 system shell + mkdir /data/adb 0700 root root encryption=None + +# adbd is controlled via property triggers in init..usb.rc +service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 + class core + socket adbd seqpacket 660 system system + disabled + updatable + seclabel u:r:adbd:s0 + user root + +on property:vendor.sys.usb.adb.disabled=* + setprop sys.usb.adb.disabled ${vendor.sys.usb.adb.disabled} + +# Set default value on sys.usb.configfs early in boot sequence. It will be +# overridden in `on boot` action of init.hardware.rc. +on init + setprop sys.usb.configfs 0 + start adbd + +# adb only USB configuration +# This is the fallback configuration if the +# USB manager fails to set a standard configuration +on property:sys.usb.config=adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 4EE7 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# USB accessory configuration +on property:sys.usb.config=accessory && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 2d00 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# USB accessory configuration, with adb +on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 2d01 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# audio accessory configuration +on property:sys.usb.config=audio_source && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 2d02 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# audio accessory configuration, with adb +on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 2d03 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# USB and audio accessory configuration +on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 2d04 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# USB and audio accessory configuration, with adb +on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 18d1 + write /sys/class/android_usb/android0/idProduct 2d05 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Used to set USB configuration at boot and to switch the configuration +# when changing the default configuration +on boot && property:persist.sys.usb.config=* + setprop sys.usb.config ${persist.sys.usb.config} + +# +# USB type C +# + +# USB mode changes +on property:sys.usb.typec.mode=dfp + write /sys/class/dual_role_usb/otg_default/mode ${sys.usb.typec.mode} + setprop sys.usb.typec.state ${sys.usb.typec.mode} + +on property:sys.usb.typec.mode=ufp + write /sys/class/dual_role_usb/otg_default/mode ${sys.usb.typec.mode} + setprop sys.usb.typec.state ${sys.usb.typec.mode} + +# USB data role changes +on property:sys.usb.typec.data_role=device + write /sys/class/dual_role_usb/otg_default/data_role ${sys.usb.typec.data_role} + setprop sys.usb.typec.state ${sys.usb.typec.data_role} + +on property:sys.usb.typec.data_role=host + write /sys/class/dual_role_usb/otg_default/data_role ${sys.usb.typec.data_role} + setprop sys.usb.typec.state ${sys.usb.typec.data_role} + +# USB power role changes +on property:sys.usb.typec.power_role=source + write /sys/class/dual_role_usb/otg_default/power_role ${sys.usb.typec.power_role} + setprop sys.usb.typec.state ${sys.usb.typec.power_role} + +on property:sys.usb.typec.power_role=sink + write /sys/class/dual_role_usb/otg_default/power_role ${sys.usb.typec.power_role} + setprop sys.usb.typec.state ${sys.usb.typec.power_role} + +on userspace-reboot-requested + setprop sys.usb.config "" + setprop sys.usb.state ""