From 586813b1504669b434f47bb216379561fb3f0f16 Mon Sep 17 00:00:00 2001 From: Matthew Parlane Date: Tue, 13 Nov 2012 00:14:47 +1300 Subject: [PATCH] Basic HID works on windows! I had to customise HIDAPI. --- Externals/libusb/include/hidapi.h | 6 +- Externals/libusb/win32/hidapi.lib | Bin 48456 -> 51150 bytes Externals/libusb/x64/hidapi.lib | Bin 50962 -> 53880 bytes .../Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp | 79 ++++++++++++++---- .../Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h | 3 +- 5 files changed, 69 insertions(+), 19 deletions(-) diff --git a/Externals/libusb/include/hidapi.h b/Externals/libusb/include/hidapi.h index bd912acd7f..3cd829b54a 100644 --- a/Externals/libusb/include/hidapi.h +++ b/Externals/libusb/include/hidapi.h @@ -155,7 +155,7 @@ extern "C" { This function returns a pointer to a #hid_device object on success or NULL on failure. */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, wchar_t *serial_number); + HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); /** @brief Open a HID device by its path name. @@ -173,7 +173,7 @@ extern "C" { HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); /** @brief Write an Output report to a HID device. - + The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since @@ -199,8 +199,8 @@ extern "C" { -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); + int HID_API_EXPORT HID_API_CALL hid_write_report(hid_device *device, const unsigned char *data, size_t length); - int HID_API_EXPORT HID_API_CALL hid_set_output_report(hid_device *dev, const unsigned char *data, size_t length); /** @brief Read an Input report from a HID device with timeout. Input reports are returned diff --git a/Externals/libusb/win32/hidapi.lib b/Externals/libusb/win32/hidapi.lib index 2b75c20b698a2e75eb88a99ea90fd78948170993..7fbc90bbca71487e188cf871a337db918d55a809 100644 GIT binary patch literal 51150 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 literal 48456 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⋘9t8287kiR* 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 U$4o<1e>_K00d$i}OlI-_04glrKmY&$ diff --git a/Externals/libusb/x64/hidapi.lib b/Externals/libusb/x64/hidapi.lib index 067d0166022037012e839cbe0c6bcab38621841c..0626164cb7fa14c5b1a90f5220bb4afae60bd718 100644 GIT binary patch delta 18389 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 s3&~4XeR=YM$N8c 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 delta 16263 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 EUma loaded_devices; +static std::map loaded_devices_rev; +static std::map opened_devices; + + + CWII_IPC_HLE_Device_hid::CWII_IPC_HLE_Device_hid(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) { - usb_init(); /* initialize the library */ - + //usb_init(); /* initialize the library */ + hid_init(); } CWII_IPC_HLE_Device_hid::~CWII_IPC_HLE_Device_hid() { - + hid_exit(); } bool CWII_IPC_HLE_Device_hid::Open(u32 _CommandAddress, u32 _Mode) @@ -175,7 +181,29 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) fclose(test); upto++; */ + + hid_device * dev_handle = GetDeviceByDevNumHidLib(dev_num); + if (dev_handle == NULL) + { + ReturnValue = -4; + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) = %d", + requesttype, request, ReturnValue); + break; + } + + // this is our write request + if(request == 0x09) + { + #define rw_buf_size 0x21 + unsigned char buf[rw_buf_size]; + memset(&buf[0], 0, rw_buf_size); + memcpy(&buf[1], (unsigned char*)Memory::GetPointer(data), size); + int success = hid_write_report(dev_handle, buf, size+1); + + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control) success = %d", success); + } + ReturnValue = size + sizeof(usb_ctrl_setup); DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) = %d", requesttype, request, ReturnValue); @@ -193,21 +221,29 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) u32 data = Memory::Read_U32(BufferIn+0x1C); - struct usb_dev_handle * dev_handle = GetDeviceByDevNum(dev_num); + hid_device * dev_handle = GetDeviceByDevNumHidLib(dev_num); if (dev_handle == NULL) { ReturnValue = -4; + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt In)(%d,%d,%p) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + end_point, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); break; } - usb_claim_interface(dev_handle,0); - ReturnValue = usb_interrupt_read(dev_handle, end_point, (char*)Memory::GetPointer(data), length, 1000); + //ReturnValue = -5; + ReturnValue = hid_read(dev_handle, (unsigned char*)Memory::GetPointer(data), length); + //ReturnValue = usb_interrupt_read(dev_handle, end_point, (char*)Memory::GetPointer(data), length, 1000); + + FILE* test = fopen ("readdata.bin", "wb"); + fwrite(Memory::GetPointer(data), ReturnValue, 1, test); + fclose(test); + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt In)(%d,%d,%p) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", end_point, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); - usb_close(dev_handle); + break; } case IOCTL_HID_INTERRUPT_OUT: @@ -220,21 +256,22 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) u32 data = Memory::Read_U32(BufferIn+0x1C); - struct usb_dev_handle * dev_handle = GetDeviceByDevNum(dev_num); + hid_device * dev_handle = GetDeviceByDevNumHidLib(dev_num); if (dev_handle == NULL) { ReturnValue = -4; + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt Out) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); break; } - usb_claim_interface(dev_handle,0); - ReturnValue = usb_interrupt_write(dev_handle, end_point, (char*)Memory::GetPointer(data), length, 0); + ReturnValue = -5; + //ReturnValue = usb_interrupt_write(dev_handle, end_point, (char*)Memory::GetPointer(data), length, 0); DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt Out) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); - usb_close(dev_handle); break; } default: @@ -303,7 +340,12 @@ void CWII_IPC_HLE_Device_hid::ConvertEndpointToWii(WiiHIDEndpointDescriptor *des static int x = 0; u32 CWII_IPC_HLE_Device_hid::GetAvailableID(char* path) { - return x++; + std::string dev_path = path; + if(loaded_devices.find(dev_path) == loaded_devices.end()){ + loaded_devices_rev[x] = dev_path; + loaded_devices[dev_path] = x++; + } + return loaded_devices[dev_path]; } // hidapi version @@ -411,9 +453,6 @@ void CWII_IPC_HLE_Device_hid::FillOutDevicesHidApi(u32 BufferOut, u32 BufferOutS } Memory::Write_U32(0xFFFFFFFF, OffsetBuffer); // no more devices - FILE* test = fopen ("mattsbin.bin", "wb"); - fwrite(Memory::GetPointer(BufferOut), BufferOutSize, 1, test); - fclose(test); hid_free_enumeration(devs); } @@ -499,6 +538,16 @@ int CWII_IPC_HLE_Device_hid::Align(int num, int alignment) return (num + (alignment-1)) & ~(alignment-1); } +hid_device * CWII_IPC_HLE_Device_hid::GetDeviceByDevNumHidLib(u32 devNum) +{ + if (loaded_devices_rev.find(devNum) == loaded_devices_rev.end()) + return NULL; + if (opened_devices.find(devNum) != opened_devices.end()) + return opened_devices[devNum]; + + hid_device * phPortalHandle = opened_devices[devNum] = hid_open_path(loaded_devices_rev[devNum].c_str()); + return phPortalHandle; +} struct usb_dev_handle * CWII_IPC_HLE_Device_hid::GetDeviceByDevNum(u32 devNum) { diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h index ef3b8912f1..2fc4ba9a22 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h @@ -19,6 +19,7 @@ #include "WII_IPC_HLE.h" #include "WII_IPC_HLE_Device.h" +#include "hidapi.h" class CWII_IPC_HLE_Device_hid : public IWII_IPC_HLE_Device { @@ -122,7 +123,7 @@ private: void ConvertEndpointToWii(WiiHIDEndpointDescriptor *dest, struct usb_endpoint_descriptor *src); int Align(int num, int alignment); - + hid_device * GetDeviceByDevNumHidLib(u32 devNum); struct usb_dev_handle * GetDeviceByDevNum(u32 devNum);