summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp
index 250ff7021e..af66f2a307 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp
@@ -216,6 +216,8 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress)
{
int transfered = 0;
+ int checkme = 34;
+ int worked = 35;
u32 dev_num = Memory::Read_U32(BufferIn+0x10);
u32 endpoint = Memory::Read_U32(BufferIn+0x14);
u32 length = Memory::Read_U32(BufferIn+0x18);
@@ -232,8 +234,26 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress)
ReturnValue = -4;
goto int_in_end_print;
}
+ if (libusb_kernel_driver_active(dev_handle, 0) == 1)
+ {
+ DEBUG_LOG(WII_IPC_HID, "Kernel has the interface, gtfo kernel!");
+ worked = libusb_detach_kernel_driver(dev_handle, 0);
+ if (worked)
+ {
+ DEBUG_LOG(WII_IPC_HID, "Attempt to detach interface failed with error: %d", worked);
+ }
+ }
- if(libusb_interrupt_transfer(dev_handle, endpoint, (unsigned char*)Memory::GetPointer(data), length, &transfered, 0 ) == 0)
+ worked = libusb_claim_interface(dev_handle, 0);
+ if (worked)
+ {
+ DEBUG_LOG(WII_IPC_HID, "Attempt to claim interface failed with error: %d", worked);
+ ReturnValue = -4;
+ goto int_in_end_print;
+ }
+
+ checkme = libusb_interrupt_transfer(dev_handle, endpoint, (unsigned char*)Memory::GetPointer(data), length, &transfered, 3000 );
+ if(checkme == 0)
{
ReturnValue = transfered;
}
@@ -249,8 +269,8 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress)
int_in_end_print:
- DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt %s)(%d,%d,%X) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
- Parameter == IOCTL_HID_INTERRUPT_IN ? "In" : "Out", endpoint, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize);
+ DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt %s)(%d,%d,%X) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i), err = %d",
+ Parameter == IOCTL_HID_INTERRUPT_IN ? "In" : "Out", endpoint, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize, checkme);
break;
}
@@ -438,10 +458,13 @@ libusb_device_handle * CWII_IPC_HLE_Device_hid::GetDeviceByDevNum(u32 devNum)
libusb_device_handle *handle = NULL;
ssize_t cnt;
- devNum = 0x204;
+ devNum = 0x304;
if (open_devices.find(devNum) != open_devices.end())
+ {
+ DEBUG_LOG(WII_IPC_HID, "Found it... ");
return open_devices[devNum];
+ }
cnt = libusb_get_device_list(NULL, &list);