From 34a590e50966341cec5f1874410931decbce284f Mon Sep 17 00:00:00 2001 From: Ameer Date: Wed, 1 Jul 2020 12:52:50 -0400 Subject: [PATCH] Reset adapter state on init, fixes errors relating driver hang from unexpected unplug --- src/input_common/gcadapter/gc_adapter.cpp | 8 ++++++++ src/input_common/gcadapter/gc_adapter.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/input_common/gcadapter/gc_adapter.cpp b/src/input_common/gcadapter/gc_adapter.cpp index b98b85441b..1ddb9cdb42 100644 --- a/src/input_common/gcadapter/gc_adapter.cpp +++ b/src/input_common/gcadapter/gc_adapter.cpp @@ -97,6 +97,7 @@ void Adapter::Read() { libusb_interrupt_transfer(usb_adapter_handle, input_endpoint, adapter_payload.data(), sizeof(adapter_payload), &payload_size_in, 16); payload_size_copy = 0; + // this mutex might be redundant? { std::lock_guard lk(s_mutex); std::copy(std::begin(adapter_payload), std::end(adapter_payload), @@ -265,10 +266,17 @@ void Adapter::GetGCEndpoint(libusb_device* device) { const libusb_endpoint_descriptor* endpoint = &interface->endpoint[e]; if (endpoint->bEndpointAddress & LIBUSB_ENDPOINT_IN) { input_endpoint = endpoint->bEndpointAddress; + } else { + output_endpoint = endpoint->bEndpointAddress; } } } } + // This transfer seems to be responsible for clearing the state of the adapter + // Used to clear the "busy" state of when the device is unexpectedly unplugged + unsigned char clear_payload = 0x13; + libusb_interrupt_transfer(usb_adapter_handle, output_endpoint, &clear_payload, + sizeof(clear_payload), nullptr, 16); adapter_thread_running = true; current_status = ADAPTER_DETECTED; diff --git a/src/input_common/gcadapter/gc_adapter.h b/src/input_common/gcadapter/gc_adapter.h index 91aa9622bc..4a8e2644c2 100644 --- a/src/input_common/gcadapter/gc_adapter.h +++ b/src/input_common/gcadapter/gc_adapter.h @@ -152,6 +152,7 @@ private: libusb_context* libusb_ctx; u8 input_endpoint = 0; + u8 output_endpoint = 0; bool configuring = false;