introduce api function to read usb string descriptors

This API allows to read manufacturer and product names as well as the
serial number advertized by the device on the bus.
This commit is contained in:
Dimitri Stolnikov 2012-05-20 16:43:59 +02:00
parent 129324b3dd
commit 7d90bb808a
2 changed files with 122 additions and 3 deletions

View File

@ -32,6 +32,22 @@ OSMOSDR_API uint32_t osmosdr_get_device_count(void);
OSMOSDR_API const char* osmosdr_get_device_name(uint32_t index);
/*!
* Get USB device strings.
*
* NOTE: The string arguments must provide space for up to 256 bytes.
*
* \param index the device index
* \param manufact manufacturer name, may be NULL
* \param product product name, may be NULL
* \param serial serial number, may be NULL
* \return 0 on success
*/
OSMOSDR_API int osmosdr_get_device_usb_strings(uint32_t index,
char *manufact,
char *product,
char *serial);
OSMOSDR_API int osmosdr_open(osmosdr_dev_t **dev, uint32_t index);
OSMOSDR_API int osmosdr_close(osmosdr_dev_t *dev);
@ -62,6 +78,20 @@ OSMOSDR_API int osmosdr_set_clock_freq(osmosdr_dev_t *dev, uint32_t adc_clock,
OSMOSDR_API int osmosdr_get_clock_freq(osmosdr_dev_t *dev, uint32_t *adc_clock,
uint32_t *tun_clock);
/*!
* Get USB device strings.
*
* NOTE: The string arguments must provide space for up to 256 bytes.
*
* \param dev the device handle given by osmosdr_open()
* \param manufact manufacturer name, may be NULL
* \param product product name, may be NULL
* \param serial serial number, may be NULL
* \return 0 on success
*/
OSMOSDR_API int osmosdr_get_usb_strings(osmosdr_dev_t *dev, char *manufact,
char *product, char *serial);
/*!
* Set the frequency the device is tuned to.
*
@ -124,6 +154,8 @@ OSMOSDR_API uint32_t osmosdr_get_sample_rate(osmosdr_dev_t *dev);
/* streaming functions */
OSMOSDR_API int osmosdr_reset_buffer(osmosdr_dev_t *dev);
OSMOSDR_API int osmosdr_read_sync(osmosdr_dev_t *dev, void *buf, int len, int *n_read);
typedef void(*osmosdr_read_async_cb_t)(unsigned char *buf, uint32_t len, void *ctx);

View File

@ -84,8 +84,8 @@ typedef struct osmosdr_dongle {
} osmosdr_dongle_t;
static osmosdr_dongle_t known_devices[] = {
{ 0x16c0, 0x0763, "OsmoSDR" },
/* for future modifications of the OsmoSDR */
{ 0x16c0, 0x0763, "sysmocom OsmoSDR" },
/* here come future modifications of the OsmoSDR */
};
#define DEFAULT_BUF_NUMBER 32
@ -159,6 +159,47 @@ int osmosdr_get_xtal_freq(osmosdr_dev_t *dev, uint32_t *adc_clock, uint32_t *tun
return 0;
}
int osmosdr_get_usb_strings(osmosdr_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 osmosdr_set_center_freq(osmosdr_dev_t *dev, uint32_t freq)
{
int r = -1;
@ -279,8 +320,8 @@ uint32_t osmosdr_get_device_count(void)
int i;
libusb_context *ctx;
libusb_device **list;
uint32_t device_count = 0;
struct libusb_device_descriptor dd;
uint32_t device_count = 0;
ssize_t cnt;
libusb_init(&ctx);
@ -338,6 +379,52 @@ const char *osmosdr_get_device_name(uint32_t index)
return "";
}
int osmosdr_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;
osmosdr_dongle_t *device = NULL;
osmosdr_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 = osmosdr_get_usb_strings(&devt,
manufact,
product,
serial);
libusb_close(devt.devh);
}
break;
}
}
}
libusb_free_device_list(list, 1);
libusb_exit(ctx);
return r;
}
int osmosdr_open(osmosdr_dev_t **out_dev, uint32_t index)
{
int r;