input_common: Fix GC adapter initialization

Fix GC controller
This commit is contained in:
german77 2021-10-30 11:20:47 -05:00 committed by Narr the Reg
parent 2d3a63b289
commit d8e3f2b10b

View File

@ -73,7 +73,7 @@ GCAdapter::GCAdapter(const std::string input_engine_) : InputEngine(input_engine
if (usb_adapter_handle) { if (usb_adapter_handle) {
return; return;
} }
LOG_INFO(Input, "GC Adapter Initialization started"); LOG_DEBUG(Input, "Initialization started");
libusb_ctx = std::make_unique<LibUSBContext>(); libusb_ctx = std::make_unique<LibUSBContext>();
const int init_res = libusb_ctx->InitResult(); const int init_res = libusb_ctx->InitResult();
@ -90,7 +90,7 @@ GCAdapter::~GCAdapter() {
} }
void GCAdapter::AdapterInputThread(std::stop_token stop_token) { void GCAdapter::AdapterInputThread(std::stop_token stop_token) {
LOG_DEBUG(Input, "GC Adapter input thread started"); LOG_DEBUG(Input, "Input thread started");
Common::SetCurrentThreadName("yuzu:input:GCAdapter"); Common::SetCurrentThreadName("yuzu:input:GCAdapter");
s32 payload_size{}; s32 payload_size{};
AdapterPayload adapter_payload{}; AdapterPayload adapter_payload{};
@ -120,7 +120,7 @@ bool GCAdapter::IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payl
LOG_DEBUG(Input, "Error reading payload (size: {}, type: {:02x})", payload_size, LOG_DEBUG(Input, "Error reading payload (size: {}, type: {:02x})", payload_size,
adapter_payload[0]); adapter_payload[0]);
if (input_error_counter++ > 20) { if (input_error_counter++ > 20) {
LOG_ERROR(Input, "GC adapter timeout, Is the adapter connected?"); LOG_ERROR(Input, "Timeout, Is the adapter connected?");
adapter_input_thread.request_stop(); adapter_input_thread.request_stop();
restart_scan_thread = true; restart_scan_thread = true;
} }
@ -263,13 +263,6 @@ bool GCAdapter::Setup() {
} }
bool GCAdapter::CheckDeviceAccess() { bool GCAdapter::CheckDeviceAccess() {
// This fixes payload problems from offbrand GCAdapters
const s32 control_transfer_error =
libusb_control_transfer(usb_adapter_handle->get(), 0x21, 11, 0x0001, 0, nullptr, 0, 1000);
if (control_transfer_error < 0) {
LOG_ERROR(Input, "libusb_control_transfer failed with error= {}", control_transfer_error);
}
s32 kernel_driver_error = libusb_kernel_driver_active(usb_adapter_handle->get(), 0); s32 kernel_driver_error = libusb_kernel_driver_active(usb_adapter_handle->get(), 0);
if (kernel_driver_error == 1) { if (kernel_driver_error == 1) {
kernel_driver_error = libusb_detach_kernel_driver(usb_adapter_handle->get(), 0); kernel_driver_error = libusb_detach_kernel_driver(usb_adapter_handle->get(), 0);
@ -291,6 +284,13 @@ bool GCAdapter::CheckDeviceAccess() {
return false; return false;
} }
// This fixes payload problems from offbrand GCAdapters
const s32 control_transfer_error =
libusb_control_transfer(usb_adapter_handle->get(), 0x21, 11, 0x0001, 0, nullptr, 0, 1000);
if (control_transfer_error < 0) {
LOG_ERROR(Input, "libusb_control_transfer failed with error= {}", control_transfer_error);
}
return true; return true;
} }
@ -370,9 +370,9 @@ void GCAdapter::SendVibrations() {
libusb_interrupt_transfer(usb_adapter_handle->get(), output_endpoint, payload.data(), libusb_interrupt_transfer(usb_adapter_handle->get(), output_endpoint, payload.data(),
static_cast<s32>(payload.size()), &size, 16); static_cast<s32>(payload.size()), &size, 16);
if (err) { if (err) {
LOG_DEBUG(Input, "Adapter libusb write failed: {}", libusb_error_name(err)); LOG_DEBUG(Input, "Libusb write failed: {}", libusb_error_name(err));
if (output_error_counter++ > 5) { if (output_error_counter++ > 5) {
LOG_ERROR(Input, "GC adapter output timeout, Rumble disabled"); LOG_ERROR(Input, "Output timeout, Rumble disabled");
rumble_enabled = false; rumble_enabled = false;
} }
return; return;