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 delta 20728 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 delta 18753 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 delta 16263 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 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 70edc1805b..4d3c7ff8e8 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 @@ -23,17 +23,23 @@ #include "lusb0_usb.h" #include "hidapi.h" +static std::map 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);