|
|
@ -571,6 +571,47 @@ int rtlsdr_get_xtal_freq(rtlsdr_dev_t *dev, uint32_t *rtl_freq, uint32_t *tuner_ |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int rtlsdr_get_usb_strings(rtlsdr_dev_t *dev, char *manufact, char *product, |
|
|
|
|
|
|
|
char *serial) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
struct libusb_device_descriptor dd; |
|
|
|
|
|
|
|
libusb_device *device = NULL; |
|
|
|
|
|
|
|
const int buf_max = 256; |
|
|
|
|
|
|
|
int r = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!dev || !dev->devh) |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
device = libusb_get_device(dev->devh); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r = libusb_get_device_descriptor(device, &dd); |
|
|
|
|
|
|
|
if (r < 0) |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (manufact) { |
|
|
|
|
|
|
|
memset(manufact, 0, buf_max); |
|
|
|
|
|
|
|
libusb_get_string_descriptor_ascii(dev->devh, dd.iManufacturer, |
|
|
|
|
|
|
|
(unsigned char *)manufact, |
|
|
|
|
|
|
|
buf_max); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (product) { |
|
|
|
|
|
|
|
memset(product, 0, buf_max); |
|
|
|
|
|
|
|
libusb_get_string_descriptor_ascii(dev->devh, dd.iProduct, |
|
|
|
|
|
|
|
(unsigned char *)product, |
|
|
|
|
|
|
|
buf_max); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (serial) { |
|
|
|
|
|
|
|
memset(serial, 0, buf_max); |
|
|
|
|
|
|
|
libusb_get_string_descriptor_ascii(dev->devh, dd.iSerialNumber, |
|
|
|
|
|
|
|
(unsigned char *)serial, |
|
|
|
|
|
|
|
buf_max); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq) |
|
|
|
int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int r = -1; |
|
|
|
int r = -1; |
|
|
@ -815,6 +856,52 @@ const char *rtlsdr_get_device_name(uint32_t index) |
|
|
|
return ""; |
|
|
|
return ""; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int rtlsdr_get_device_usb_strings(uint32_t index, char *manufact, |
|
|
|
|
|
|
|
char *product, char *serial) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int r = -2; |
|
|
|
|
|
|
|
int i; |
|
|
|
|
|
|
|
libusb_context *ctx; |
|
|
|
|
|
|
|
libusb_device **list; |
|
|
|
|
|
|
|
struct libusb_device_descriptor dd; |
|
|
|
|
|
|
|
rtlsdr_dongle_t *device = NULL; |
|
|
|
|
|
|
|
rtlsdr_dev_t devt; |
|
|
|
|
|
|
|
uint32_t device_count = 0; |
|
|
|
|
|
|
|
ssize_t cnt; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libusb_init(&ctx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cnt = libusb_get_device_list(ctx, &list); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < cnt; i++) { |
|
|
|
|
|
|
|
libusb_get_device_descriptor(list[i], &dd); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
device = find_known_device(dd.idVendor, dd.idProduct); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (device) { |
|
|
|
|
|
|
|
device_count++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (index == device_count - 1) { |
|
|
|
|
|
|
|
r = libusb_open(list[i], &devt.devh); |
|
|
|
|
|
|
|
if (!r) { |
|
|
|
|
|
|
|
r = rtlsdr_get_usb_strings(&devt, |
|
|
|
|
|
|
|
manufact, |
|
|
|
|
|
|
|
product, |
|
|
|
|
|
|
|
serial); |
|
|
|
|
|
|
|
libusb_close(devt.devh); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libusb_free_device_list(list, 1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libusb_exit(ctx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return r; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index) |
|
|
|
int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int r; |
|
|
|
int r; |
|
|
|