From 0eb85c529c9850f57c210c1ca733dc5e8666c4cc Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Wed, 1 Feb 2017 16:21:04 -0700 Subject: [PATCH] Fixed firmware dwell time bug in sweep mode. Two buffers of sample data are now thrown away at the start of each step in order to allow time for tuning. Fixes #317. --- firmware/hackrf_usb/usb_api_sweep.c | 17 ++++++++++------- host/hackrf-tools/src/hackrf_sweep.c | 7 ++++++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 581faacc..503e7f6a 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -34,6 +34,7 @@ #define MIN_FREQ 1 #define MAX_FREQ 6000 #define MAX_FREQ_COUNT 1000 +#define THROWAWAY_BUFFERS 2 volatile bool start_sweep_mode = false; static uint64_t sweep_freq; @@ -89,16 +90,18 @@ void sweep_mode(void) { if (transfer) { *(uint16_t*)buffer = 0x7F7F; *(uint16_t*)(buffer+2) = sweep_freq; - usb_transfer_schedule_block( - &usb_endpoint_bulk_in, - buffer, - 0x4000, - NULL, NULL - ); + if (blocks_queued > THROWAWAY_BUFFERS) { + usb_transfer_schedule_block( + &usb_endpoint_bulk_in, + buffer, + 0x4000, + NULL, NULL + ); + } transfer = false; } - if (blocks_queued >= dwell_blocks) { + if ((dwell_blocks + THROWAWAY_BUFFERS) <= blocks_queued) { if(++ifreq >= frequency_count) ifreq = 0; sweep_freq = frequencies[ifreq]; diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 6c044203..13a9c64d 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -243,7 +243,7 @@ static void usage() { fprintf(stderr, "\t[-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps\n"); fprintf(stderr, "\t[-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps\n"); fprintf(stderr, "\t[-x gain_db] # TX VGA (IF) gain, 0-47dB, 1dB steps\n"); - fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 0-4294967296\n"); + fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 16384-4294967296\n"); } static hackrf_device* device = NULL; @@ -355,6 +355,11 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } + if (num_samples < 0x4000) { + fprintf(stderr, "warning: num_samples (-n) must be at least 16384\n"); + return EXIT_FAILURE; + } + if( amp ) { if( amp_enable > 1 ) { fprintf(stderr, "argument error: amp_enable shall be 0 or 1.\n");