diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 2902a800..6632fb41 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -69,6 +69,11 @@ typedef enum { HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, } hackrf_vendor_request; +typedef enum { + USB_CONFIG_STANDARD = 0x1, + USB_CONFIG_CPLD_UPDATE = 0x2, +} hackrf_usb_configurations; + typedef enum { HACKRF_TRANSCEIVER_MODE_OFF = 0, HACKRF_TRANSCEIVER_MODE_RECEIVE = 1, @@ -233,6 +238,72 @@ static int prepare_transfers( } } +static int detach_kernel_drivers(libusb_device_handle* usb_device_handle) +{ + int i, num_interfaces, result; + libusb_device* dev; + struct libusb_config_descriptor* config; + + dev = libusb_get_device(usb_device_handle); + result = libusb_get_active_config_descriptor(dev, &config); + if( result < 0 ) + { + return HACKRF_ERROR_LIBUSB; + } + + num_interfaces = config->bNumInterfaces; + libusb_free_config_descriptor(config); + for(i=0; iusb_device, 2); - if (result != LIBUSB_SUCCESS) { - return HACKRF_ERROR_LIBUSB; + result = set_hackrf_configuration(device->usb_device, USB_CONFIG_CPLD_UPDATE); + if( result != LIBUSB_SUCCESS ) + { + return result; } result = libusb_claim_interface(device->usb_device, 0);