aboutsummaryrefslogtreecommitdiffstats
path: root/src/libosmo-fl2k.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libosmo-fl2k.c')
-rw-r--r--src/libosmo-fl2k.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/libosmo-fl2k.c b/src/libosmo-fl2k.c
index afc4d4f..99dcd33 100644
--- a/src/libosmo-fl2k.c
+++ b/src/libosmo-fl2k.c
@@ -2,7 +2,7 @@
* osmo-fl2k, turns FL2000-based USB 3.0 to VGA adapters into
* low cost DACs
*
- * Copyright (C) 2016-2018 by Steve Markgraf <steve@steve-m.de>
+ * Copyright (C) 2016-2020 by Steve Markgraf <steve@steve-m.de>
*
* SPDX-License-Identifier: GPL-2.0+
*
@@ -250,9 +250,9 @@ int fl2k_set_sample_rate(fl2k_dev_t *dev, uint32_t target_freq)
error = sample_clock - (double)target_freq;
/* Keep closest match */
- if (fabsf(error) < last_error) {
+ if (fabs(error) < last_error) {
result_reg = reg;
- last_error = fabsf(error);
+ last_error = fabs(error);
}
}
}
@@ -262,7 +262,7 @@ int fl2k_set_sample_rate(fl2k_dev_t *dev, uint32_t target_freq)
error = sample_clock - (double)target_freq;
dev->rate = sample_clock;
- if (fabsf(error) > 1)
+ if (fabs(error) > 1)
fprintf(stderr, "Requested sample rate %d not possible, using"
" %f, error is %f\n", target_freq, sample_clock, error);
@@ -444,11 +444,16 @@ int fl2k_open(fl2k_dev_t **out_dev, uint32_t index)
fprintf(stderr, "usb_claim_interface 0 error %d\n", r);
goto err;
}
- r = libusb_claim_interface(dev->devh, 1);
+ r = libusb_set_interface_alt_setting(dev->devh, 0, 1);
if (r < 0) {
- fprintf(stderr, "usb_claim_interface 1 error %d\n", r);
- goto err;
+ fprintf(stderr, "Failed to switch interface 0 to "
+ "altsetting 1, trying to use interface 1\n");
+
+ r = libusb_claim_interface(dev->devh, 1);
+ if (r < 0) {
+ fprintf(stderr, "Could not claim interface 1: %d\n", r);
+ }
}
r = fl2k_init_device(dev);
@@ -573,6 +578,10 @@ static int fl2k_alloc_submit_transfers(fl2k_dev_t *dev)
{
unsigned int i;
int r = 0;
+ const char *incr_usbfs = "Please increase your allowed usbfs buffer"
+ " size with the following command:\n"
+ "echo 0 > /sys/module/usbcore/parameters/"
+ "usbfs_memory_mb\n";
if (!dev)
return FL2K_ERROR_INVALID_PARAM;
@@ -613,8 +622,9 @@ static int fl2k_alloc_submit_transfers(fl2k_dev_t *dev)
}
} else {
fprintf(stderr, "Failed to allocate zero-copy "
- "buffer for transfer %d\nFalling "
- "back to buffers in userspace\n", i);
+ "buffer for transfer %d\n%sFalling "
+ "back to buffers in userspace\n",
+ i, incr_usbfs);
dev->use_zerocopy = 0;
break;
}
@@ -668,12 +678,8 @@ static int fl2k_alloc_submit_transfers(fl2k_dev_t *dev)
dev->xfer_info[i].state = BUF_SUBMITTED;
if (r < 0) {
- fprintf(stderr, "Failed to submit transfer %i\n"
- "Please increase your allowed "
- "usbfs buffer size with the "
- "following command:\n"
- "echo 0 > /sys/module/usbcore"
- "/parameters/usbfs_memory_mb\n", i);
+ fprintf(stderr, "Failed to submit transfer %i\n%s",
+ i, incr_usbfs);
break;
}
}
@@ -781,6 +787,9 @@ static void *fl2k_usb_worker(void *arg)
}
}
+ /* wake up sample worker */
+ pthread_cond_signal(&dev->buf_cond);
+
/* wait for sample worker thread to finish before freeing buffers */
pthread_join(dev->sample_worker_thread, NULL);
_fl2k_free_async_buffers(dev);