summaryrefslogtreecommitdiff
path: root/src/dlo_usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dlo_usb.c')
-rw-r--r--src/dlo_usb.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/dlo_usb.c b/src/dlo_usb.c
index 5c12ee3..e28f803 100644
--- a/src/dlo_usb.c
+++ b/src/dlo_usb.c
@@ -289,6 +289,7 @@ dlo_retcode_t dlo_usb_open(dlo_device_t * const dev)
{
dlo_retcode_t err;
usb_dev_handle *uhand;
+ char* driver_name;
int usb_configuration;
int32_t db = usb_find_busses();
int32_t dd = usb_find_devices();
@@ -310,11 +311,26 @@ dlo_retcode_t dlo_usb_open(dlo_device_t * const dev)
/* Establish the connection with the device */
//DPRINTF("usb: open: setting config...\n");
- /* set configuration fails on composite devices,
- * such as 1st gen HP USB 2.0 docks.
- * With libusb 1.0, we could at least only set
- * configuration when necessary, but only partial
- * mitigation. Need full solution.
+ /*
+ * Because some displaylink devices may report
+ * a class code (like HID or MSC) that gets
+ * matched by a kernel driver, must detach
+ * those drivers before libusb can successfully
+ * set configuration or talk to those devices
+ * unfortunately, this call returns error
+ * even if successful
+ /
+ driver_name = dlo_malloc(128);
+ if (!usb_get_driver_np(uhand, 0, driver_name, 128))
+ {
+ DPRINTF("usb: driver (%s) already attached to device\n", driver_name);
+ usb_detach_kernel_driver_np(uhand,0);
+ }
+
+ /* set configuration fails on composite devices.
+ * We could set configuration
+ * only when necessary, but that's just a partial
+ * mitigation. TODO: Need fuller solution.
*/
//usb_configuration = usb_get_configuration(uhand);
//if (usb_configuration != 1)