early-access version 1617
This commit is contained in:
111
externals/SDL/src/hidapi/windows/hid.c
vendored
111
externals/SDL/src/hidapi/windows/hid.c
vendored
@@ -68,6 +68,13 @@ typedef LONG NTSTATUS;
|
||||
report that we've seen is ~200-250ms so let's double that */
|
||||
#define HID_WRITE_TIMEOUT_MILLISECONDS 500
|
||||
|
||||
/* We will only enumerate devices that match these usages */
|
||||
#define USAGE_PAGE_GENERIC_DESKTOP 0x0001
|
||||
#define USAGE_JOYSTICK 0x0004
|
||||
#define USAGE_GAMEPAD 0x0005
|
||||
#define USAGE_MULTIAXISCONTROLLER 0x0008
|
||||
#define USB_VENDOR_VALVE 0x28de
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -307,25 +314,25 @@ int HID_API_EXPORT hid_exit(void)
|
||||
|
||||
int hid_blacklist(unsigned short vendor_id, unsigned short product_id)
|
||||
{
|
||||
// Corsair Gaming keyboard - Causes deadlock when asking for device details
|
||||
if ( vendor_id == 0x1B1C && product_id == 0x1B3D )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
size_t i;
|
||||
static const struct { unsigned short vid; unsigned short pid; } known_bad[] = {
|
||||
/* Causes deadlock when asking for device details... */
|
||||
{ 0x1B1C, 0x1B3D }, /* Corsair Gaming keyboard */
|
||||
{ 0x1532, 0x0109 }, /* Razer Lycosa Gaming keyboard */
|
||||
{ 0x1532, 0x010B }, /* Razer Arctosa Gaming keyboard */
|
||||
{ 0x045E, 0x0822 }, /* Microsoft Precision Mouse */
|
||||
|
||||
// SPEEDLINK COMPETITION PRO - turns into an Android controller when enumerated
|
||||
if ( vendor_id == 0x0738 && product_id == 0x2217 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
/* Turns into an Android controller when enumerated... */
|
||||
{ 0x0738, 0x2217 } /* SPEEDLINK COMPETITION PRO */
|
||||
};
|
||||
|
||||
// Sound BlasterX G1 - Causes 10 second stalls when asking for manufacturer's string
|
||||
if ( vendor_id == 0x041E && product_id == 0x3249 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
for (i = 0; i < (sizeof(known_bad)/sizeof(known_bad[0])); i++) {
|
||||
if ((vendor_id == known_bad[i].vid) && (product_id == known_bad[i].pid)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id)
|
||||
@@ -402,6 +409,11 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor
|
||||
goto cont;
|
||||
}
|
||||
|
||||
/* XInput devices don't get real HID reports and are better handled by the raw input driver */
|
||||
if (strstr(device_interface_detail_data->DevicePath, "&ig_") != NULL) {
|
||||
goto cont;
|
||||
}
|
||||
|
||||
/* Make sure this device is of Setup Class "HIDClass" and has a
|
||||
driver bound to it. */
|
||||
/* In the main HIDAPI tree this is a loop which will erroneously open
|
||||
@@ -444,7 +456,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor
|
||||
if (write_handle == INVALID_HANDLE_VALUE) {
|
||||
/* Unable to open the device. */
|
||||
//register_error(dev, "CreateFile");
|
||||
goto cont_close;
|
||||
goto cont;
|
||||
}
|
||||
|
||||
|
||||
@@ -469,6 +481,30 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor
|
||||
wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */
|
||||
size_t len;
|
||||
|
||||
/* Get the Usage Page and Usage for this device. */
|
||||
hidp_res = HidD_GetPreparsedData(write_handle, &pp_data);
|
||||
if (hidp_res) {
|
||||
nt_res = HidP_GetCaps(pp_data, &caps);
|
||||
HidD_FreePreparsedData(pp_data);
|
||||
if (nt_res != HIDP_STATUS_SUCCESS) {
|
||||
goto cont_close;
|
||||
}
|
||||
}
|
||||
else {
|
||||
goto cont_close;
|
||||
}
|
||||
|
||||
/* SDL Modification: Ignore the device if it's not a gamepad. This limits compatibility
|
||||
risk from devices that may respond poorly to our string queries below. */
|
||||
if (attrib.VendorID != USB_VENDOR_VALVE) {
|
||||
if (caps.UsagePage != USAGE_PAGE_GENERIC_DESKTOP) {
|
||||
goto cont_close;
|
||||
}
|
||||
if (caps.Usage != USAGE_JOYSTICK && caps.Usage != USAGE_GAMEPAD && caps.Usage != USAGE_MULTIAXISCONTROLLER) {
|
||||
goto cont_close;
|
||||
}
|
||||
}
|
||||
|
||||
/* VID/PID match. Create the record. */
|
||||
tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info));
|
||||
if (cur_dev) {
|
||||
@@ -478,20 +514,10 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor
|
||||
root = tmp;
|
||||
}
|
||||
cur_dev = tmp;
|
||||
|
||||
/* Get the Usage Page and Usage for this device. */
|
||||
hidp_res = HidD_GetPreparsedData(write_handle, &pp_data);
|
||||
if (hidp_res) {
|
||||
nt_res = HidP_GetCaps(pp_data, &caps);
|
||||
if (nt_res == HIDP_STATUS_SUCCESS) {
|
||||
cur_dev->usage_page = caps.UsagePage;
|
||||
cur_dev->usage = caps.Usage;
|
||||
}
|
||||
|
||||
HidD_FreePreparsedData(pp_data);
|
||||
}
|
||||
|
||||
/* Fill out the record */
|
||||
cur_dev->usage_page = caps.UsagePage;
|
||||
cur_dev->usage = caps.Usage;
|
||||
cur_dev->next = NULL;
|
||||
str = device_interface_detail_data->DevicePath;
|
||||
if (str) {
|
||||
@@ -694,6 +720,14 @@ static int hid_write_timeout(hid_device *dev, const unsigned char *data, size_t
|
||||
size_t stashed_length = length;
|
||||
unsigned char *buf;
|
||||
|
||||
#if 1
|
||||
/* If the application is writing to the device, it knows how much data to write.
|
||||
* This matches the behavior on other platforms. It's also important when writing
|
||||
* to Sony game controllers over Bluetooth, where there's a CRC at the end which
|
||||
* must not be tampered with.
|
||||
*/
|
||||
buf = (unsigned char *) data;
|
||||
#else
|
||||
/* Make sure the right number of bytes are passed to WriteFile. Windows
|
||||
expects the number of bytes which are in the _longest_ report (plus
|
||||
one for the report number) bytes even if the data is a report
|
||||
@@ -711,6 +745,7 @@ static int hid_write_timeout(hid_device *dev, const unsigned char *data, size_t
|
||||
memset(buf + length, 0, dev->output_report_length - length);
|
||||
length = dev->output_report_length;
|
||||
}
|
||||
#endif
|
||||
if (length > 512)
|
||||
{
|
||||
return hid_write_output_report( dev, data, stashed_length );
|
||||
@@ -891,12 +926,6 @@ int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* bytes_returned does not include the first byte which contains the
|
||||
report ID. The data buffer actually contains one more byte than
|
||||
bytes_returned. */
|
||||
bytes_returned++;
|
||||
|
||||
|
||||
return bytes_returned;
|
||||
#endif
|
||||
}
|
||||
@@ -973,23 +1002,23 @@ HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev)
|
||||
/*#define S11*/
|
||||
#define P32
|
||||
#ifdef S11
|
||||
unsigned short VendorID = 0xa0a0;
|
||||
unsigned short VendorID = 0xa0a0;
|
||||
unsigned short ProductID = 0x0001;
|
||||
#endif
|
||||
|
||||
#ifdef P32
|
||||
unsigned short VendorID = 0x04d8;
|
||||
unsigned short VendorID = 0x04d8;
|
||||
unsigned short ProductID = 0x3f;
|
||||
#endif
|
||||
|
||||
#ifdef PICPGM
|
||||
unsigned short VendorID = 0x04d8;
|
||||
unsigned short ProductID = 0x0033;
|
||||
unsigned short VendorID = 0x04d8;
|
||||
unsigned short ProductID = 0x0033;
|
||||
#endif
|
||||
|
||||
int __cdecl main(int argc, char* argv[])
|
||||
{
|
||||
int res;
|
||||
int i, res;
|
||||
unsigned char buf[65];
|
||||
|
||||
UNREFERENCED_PARAMETER(argc);
|
||||
@@ -1025,7 +1054,7 @@ int __cdecl main(int argc, char* argv[])
|
||||
printf("Unable to read()\n");
|
||||
|
||||
/* Print out the returned buffer. */
|
||||
for (int i = 0; i < 4; i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
printf("buf[%d]: %d\n", i, buf[i]);
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user