diff options
author | Pete Batard <pbatard@gmail.com> | 2010-02-10 23:06:54 +0000 |
---|---|---|
committer | Pete Batard <pbatard@gmail.com> | 2010-02-10 23:06:54 +0000 |
commit | 06f92a48c52f91a6784716fbd0a2c5856c30085f (patch) | |
tree | 23fa0917cd5a50385a376aded13edce7ca2bcb28 | |
parent | 36d76382a06d00c936e881acb60c69cbb91d679f (diff) | |
download | libusb-06f92a48c52f91a6784716fbd0a2c5856c30085f.tar.gz |
final fix for composite HID mouse and keyboard detectionr147
introduces the use of multiple driver names in the USB API backends
-rw-r--r-- | libusb/os/windows_usb.c | 45 | ||||
-rw-r--r-- | libusb/os/windows_usb.h | 3 |
2 files changed, 29 insertions, 19 deletions
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c index 425dc1a..d1d9f0d 100644 --- a/libusb/os/windows_usb.c +++ b/libusb/os/windows_usb.c @@ -352,6 +352,18 @@ static void windows_assign_endpoints(struct libusb_device *dev, int iface, int a } } +// Lookup for a match in the list of API driver names +bool is_api_driver(char* driver, uint8_t api) +{ + uint8_t i; + for (i=0; i<usb_api_backend[api].nb_driver_names; i++) { + if (safe_strcmp(driver, usb_api_backend[api].driver_name_list[i]) == 0) { + return true; + } + } + return false; +} + /* * init: libusb backend init function * @@ -1021,8 +1033,6 @@ enum libusb_hid_report_type { if (dev_interface_details == NULL) break; -// usbi_dbg("processing: %s", dev_interface_details->DevicePath); - // HID devices (and possibly other classes) have an extra indirection // for an USB path we can recognize if (j == HID_DEVICE_INTERFACE_GUID_INDEX) { @@ -1055,17 +1065,8 @@ enum libusb_hid_report_type { driver[0] = 0; } -// usbi_dbg("driver: %s", driver); - // Temporary fix for composite mouse and hid keyboards - // TODO: something better - if (safe_strcmp(driver, "kbdhid") == 0) { - strcpy(driver, "HidUsb"); - } else if (safe_strcmp(driver, "mouhid") == 0) { - strcpy(driver, "HidUsb"); - } - for (api=USB_API_WINUSB; api<USB_API_MAX; api++) { - if ( (safe_strcmp(driver, usb_api_backend[api].driver_name) == 0) + if ( (is_api_driver(driver, api)) || (guid_eq(&class_guid, usb_api_backend[api].class_guid)) ) { api_type[nb_paths] = api; if (j == HID_DEVICE_INTERFACE_GUID_INDEX) { @@ -1258,7 +1259,8 @@ static int set_device_paths(struct libusb_context *ctx, struct discovered_devs * GUID guid; DWORD size, reg_type, install_state, port_nr; int r = LIBUSB_SUCCESS; - unsigned i, j, k, api; + unsigned i, j, k; + uint8_t api; bool found; // TODO (v1.5): MI_## automated driver installation @@ -1352,7 +1354,7 @@ static int set_device_paths(struct libusb_context *ctx, struct discovered_devs * found = true; for (api = 0; api<USB_API_MAX; api++) { - if (safe_strcmp(reg_key, usb_api_backend[api].driver_name) == 0) { + if (is_api_driver(reg_key, api)) { priv->apib = &usb_api_backend[api]; switch(api) { case USB_API_COMPOSITE: @@ -2099,11 +2101,15 @@ static int unsupported_copy_transfer_data(struct usbi_transfer *itransfer, uint3 PRINT_UNSUPPORTED_API(copy_transfer_data); } +const char* composite_driver_names[] = {"usbccgp"}; +const char* winusb_driver_names[] = {"WinUSB"}; +const char* hid_driver_names[] = {"HidUsb", "mouhid", "kbdhid"}; const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { { USB_API_UNSUPPORTED, &CLASS_GUID_UNSUPPORTED, - "_UNSUPPORTED_", + NULL, + 0, unsupported_init, unsupported_exit, unsupported_open, @@ -2122,7 +2128,8 @@ const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { }, { USB_API_COMPOSITE, &CLASS_GUID_COMPOSITE, - "usbccgp", + composite_driver_names, + 1, composite_init, composite_exit, composite_open, @@ -2141,7 +2148,8 @@ const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { }, { USB_API_WINUSB, &CLASS_GUID_LIBUSB_WINUSB, - "WinUSB", + winusb_driver_names, + 1, winusb_init, winusb_exit, winusb_open, @@ -2160,7 +2168,8 @@ const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { }, { USB_API_HID, &CLASS_GUID_HID, - "HidUsb", + hid_driver_names, + 3, hid_init, hid_exit, hid_open, diff --git a/libusb/os/windows_usb.h b/libusb/os/windows_usb.h index e3bc4d1..30ec048 100644 --- a/libusb/os/windows_usb.h +++ b/libusb/os/windows_usb.h @@ -127,7 +127,8 @@ const GUID CLASS_GUID_COMPOSITE = { 0x36FC9E60, 0xC465, 0x11cF, {0x80, 0x56, struct windows_usb_api_backend { const uint8_t id; const GUID *class_guid; // The Class GUID (for fallback in case the driver name cannot be read) - const char *driver_name; // Driver name, without .sys, e.g. "usbccgp" + const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp" + const uint8_t nb_driver_names; int (*init)(struct libusb_context *ctx); int (*exit)(void); int (*open)(struct libusb_device_handle *dev_handle); |