mirror of
https://github.com/rtlsdrblog/rtl-sdr-blog.git
synced 2025-01-13 19:57:18 +01:00
lib: detach and reattach kernel driver if needed
Signed-off-by: Steve Markgraf <steve@steve-m.de>
This commit is contained in:
parent
698a8a152e
commit
3c4aa46f5a
@ -90,6 +90,7 @@ struct rtlsdr_dev {
|
||||
int gain; /* tenth dB */
|
||||
struct e4k_state e4k_s;
|
||||
int dev_lost;
|
||||
int driver_active;
|
||||
unsigned int xfer_errors;
|
||||
};
|
||||
|
||||
@ -1347,6 +1348,16 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
|
||||
|
||||
libusb_free_device_list(list, 1);
|
||||
|
||||
if (libusb_kernel_driver_active(dev->devh, 0) == 1) {
|
||||
dev->driver_active = 1;
|
||||
if (!libusb_detach_kernel_driver(dev->devh, 0)) {
|
||||
fprintf(stderr, "Detached kernel driver\n");
|
||||
} else {
|
||||
fprintf(stderr, "Detaching kernel driver failed!");
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
r = libusb_claim_interface(dev->devh, 0);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "usb_claim_interface error %d\n", r);
|
||||
@ -1471,6 +1482,14 @@ int rtlsdr_close(rtlsdr_dev_t *dev)
|
||||
}
|
||||
|
||||
libusb_release_interface(dev->devh, 0);
|
||||
|
||||
if (dev->driver_active) {
|
||||
if (!libusb_attach_kernel_driver(dev->devh, 0))
|
||||
fprintf(stderr, "Reattached kernel driver\n");
|
||||
else
|
||||
fprintf(stderr, "Reattaching kernel driver failed!\n");
|
||||
}
|
||||
|
||||
libusb_close(dev->devh);
|
||||
|
||||
libusb_exit(dev->ctx);
|
||||
|
Loading…
Reference in New Issue
Block a user