From 4f9665fb3b43462e39a1592fc34f3dfb50de4a07 Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Sun, 3 Apr 2016 07:36:48 +0200 Subject: [PATCH 001/103] Fixed missing reset of do_exit, which prevented calls to callback when thread is created once again. --- host/libhackrf/src/hackrf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 2f309c38..b9707319 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1415,6 +1415,7 @@ static int create_transfer_thread(hackrf_device* device, if( device->transfer_thread_started == false ) { device->streaming = false; + do_exit = false; result = prepare_transfers( device, endpoint_address, From 47ea4326e963abca60c4b86c36cd373b19eec6bf Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Fri, 8 Jul 2016 23:36:03 +0200 Subject: [PATCH 002/103] Used delay instead of equivalent code --- firmware/blinky/blinky.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/firmware/blinky/blinky.c b/firmware/blinky/blinky.c index 143c9940..d3aeea0a 100644 --- a/firmware/blinky/blinky.c +++ b/firmware/blinky/blinky.c @@ -36,15 +36,13 @@ int main(void) led_on(LED2); led_on(LED3); - for (i = 0; i < 2000000; i++) /* Wait a bit. */ - __asm__("nop"); + delay(2000000); led_off(LED1); led_off(LED2); led_off(LED3); - for (i = 0; i < 2000000; i++) /* Wait a bit. */ - __asm__("nop"); + delay(2000000); } return 0; From 4b56d88024230630fa78c8dc60743aea7f086417 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Fri, 29 Jul 2016 16:02:56 +0200 Subject: [PATCH 003/103] Use strndup instead of strdup, to handle situations where the reported length and the actual length are different, or not null terminated --- host/libhackrf/src/hackrf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 2f309c38..b0dfa687 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -384,7 +384,7 @@ hackrf_device_list_t* ADDCALL hackrf_device_list() serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); if( serial_number_length == 32 ) { serial_number[32] = 0; - list->serial_numbers[idx] = strdup(serial_number); + list->serial_numbers[idx] = strndup(serial_number, serial_number_length); } libusb_close(usb_device); From ad6f9df89ad7abab11e019cd19e4c3bdad37542d Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Thu, 14 Jan 2016 14:38:29 +0100 Subject: [PATCH 004/103] First receive streaming implementation --- host/hackrf-tools/src/hackrf_transfer.c | 66 ++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index a0c5d637..9804139c 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -298,6 +298,11 @@ uint32_t amplitude = 0; bool receive = false; bool receive_wav = false; +uint64_t stream_size = 0; +uint32_t stream_head = 0; +uint32_t stream_tail = 0; +uint32_t stream_drop = 0; +uint8_t *stream_buf = NULL; bool transmit = false; struct timeval time_start; @@ -326,7 +331,7 @@ uint32_t sample_rate_hz; bool limit_num_samples = false; uint64_t samples_to_xfer = 0; -ssize_t bytes_to_xfer = 0; +size_t bytes_to_xfer = 0; bool baseband_filter_bw = false; uint32_t baseband_filter_bw_hz = 0; @@ -337,9 +342,9 @@ bool crystal_correct = false; uint32_t crystal_correct_ppm ; int rx_callback(hackrf_transfer* transfer) { - ssize_t bytes_to_write; - ssize_t bytes_written; - int i; + size_t bytes_to_write; + size_t bytes_written; + unsigned int i; if( fd != NULL ) { @@ -357,6 +362,20 @@ int rx_callback(hackrf_transfer* transfer) { transfer->buffer[i] ^= (uint8_t)0x80; } } + if (stream_size>0){ + if ((stream_size-1+stream_head-stream_tail)%stream_size buffer,bytes_to_write); + }else{ + memcpy(stream_buf+stream_tail,transfer->buffer,(stream_size-stream_tail)); + memcpy(stream_buf,transfer->buffer+(stream_size-stream_tail),bytes_to_write-(stream_size-stream_tail)); + }; + __atomic_store_n(&stream_tail,(stream_tail+bytes_to_write)%stream_size,__ATOMIC_RELEASE); + } + return 0; + }else{ bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); if ((bytes_written != bytes_to_write) || (limit_num_samples && (bytes_to_xfer == 0))) { @@ -364,15 +383,16 @@ int rx_callback(hackrf_transfer* transfer) { } else { return 0; } + } } else { return -1; } } int tx_callback(hackrf_transfer* transfer) { - ssize_t bytes_to_read; - ssize_t bytes_read; - int i; + size_t bytes_to_read; + size_t bytes_read; + unsigned int i; if( fd != NULL ) { @@ -452,6 +472,7 @@ static void usage() { printf("\t[-s sample_rate_hz] # Sample rate in Hz (4/8/10/12.5/16/20MHz, default %sMHz).\n", u64toa((DEFAULT_SAMPLE_RATE_HZ/FREQ_ONE_MHZ),&ascii_u64_data1)); printf("\t[-n num_samples] # Number of samples to transfer (default is unlimited).\n"); + printf("\t[-S buf_size] # Enable receive streaming with buffer size buf_size.\n"); printf("\t[-c amplitude] # CW signal source mode, amplitude 0-127 (DC value to DAC).\n"); printf("\t[-R] # Repeat TX mode (default is off) \n"); printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" ); @@ -499,7 +520,7 @@ int main(int argc, char** argv) { float time_diff; unsigned int lna_gain=8, vga_gain=20, txvga_gain=0; - while( (opt = getopt(argc, argv, "wr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:C:R")) != EOF ) + while( (opt = getopt(argc, argv, "wr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:C:RS:")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) @@ -522,6 +543,11 @@ int main(int argc, char** argv) { serial_number = optarg; break; + case 'S': + result = parse_u64(optarg, &stream_size); + stream_buf = calloc(1,stream_size); + break; + case 'f': f_hz = strtod(optarg, &endptr); if (optarg == endptr) { @@ -984,6 +1010,29 @@ int main(int argc, char** argv) { uint32_t byte_count_now; struct timeval time_now; float time_difference, rate; + if (stream_size>0){ + if(stream_head==stream_tail){ + usleep(10000); // queue empty + }else{ + ssize_t len; + ssize_t bytes_written; + uint32_t _st= __atomic_load_n(&stream_tail,__ATOMIC_ACQUIRE); + if(stream_head<_st) + len=_st-stream_head; + else + len=stream_size-stream_head; + bytes_written = fwrite(stream_buf+stream_head, 1, len, fd); + if (len != bytes_written){ + printf("write failed"); + do_exit=true; + }; + stream_head=(stream_head+len)%stream_size; + } + if(stream_drop>0){ + uint32_t drops= __atomic_exchange_n (&stream_drop,0,__ATOMIC_SEQ_CST); + printf("dropped frames: [%d]\n",drops); + } + }else{ sleep(1); gettimeofday(&time_now, NULL); @@ -1003,6 +1052,7 @@ int main(int argc, char** argv) { fprintf(stderr, "\nCouldn't transfer any bytes for one second.\n"); break; } + } } result = hackrf_is_streaming(device); From b57b32afa5907fdab65d7bd6489ce60a8e526112 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Fri, 9 Dec 2016 23:36:46 +0200 Subject: [PATCH 005/103] Start of sync flag --- firmware/hackrf_usb/hackrf_usb.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 2c5ec3d0..16fecb18 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -210,6 +210,20 @@ void usb_set_descriptor_by_serial_number(void) } int main(void) { + struct gpio_t gpio_sync_in = GPIO(3, 11); + struct gpio_t gpio_sync_out_a = GPIO(3, 8); + struct gpio_t gpio_sync_out_b = GPIO(3, 9); + + uint8_t usb_dummy_buffer[32768]; + for(int i = 0; i < 0x4000; i += 2) { + usb_dummy_buffer[i] = 0xff; + usb_dummy_buffer[i + 1] = 0x0; + } + for(int i = 0x4000; i < 0x8000; i += 2) { + usb_dummy_buffer[i] = 0xff; + usb_dummy_buffer[i + 1] = 0x0; + } + pin_setup(); enable_1v8_power(); #ifdef HACKRF_ONE @@ -238,12 +252,17 @@ int main(void) { rf_path_init(&rf_path); + int wait_for_sync_count = 100000000; + unsigned int phase = 0; while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) cpld_update(); + + int gpio_sync_in_flag = gpio_get(gpio_sync_in); + // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 && phase == 1 From 242f73efb1e48cf3825f655c23c11bdfb7e55ca7 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Sat, 10 Dec 2016 01:13:43 +0200 Subject: [PATCH 006/103] Added multiple device sync --- firmware/common/hackrf_core.c | 15 +++++++++++++++ firmware/common/hackrf_core.h | 3 +++ firmware/hackrf_usb/hackrf_usb.c | 28 +++++++++++++++++----------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 6e116bc8..bb6ba3aa 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -85,6 +85,11 @@ static struct gpio_t gpio_rffc5072_select = GPIO(2, 13); static struct gpio_t gpio_rffc5072_clock = GPIO(5, 6); static struct gpio_t gpio_rffc5072_data = GPIO(3, 3); static struct gpio_t gpio_rffc5072_reset = GPIO(2, 14); + +static struct gpio_t gpio_sync_in_a = GPIO(3, 8); +static struct gpio_t gpio_sync_in_b = GPIO(3, 9); +static struct gpio_t gpio_sync_out_a = GPIO(3, 10); +static struct gpio_t gpio_sync_out_b = GPIO(3, 11); #endif /* RF LDO control */ @@ -886,3 +891,13 @@ void led_off(const led_t led) { void led_toggle(const led_t led) { gpio_toggle(&gpio_led[led]); } + +void hw_sync_start() { + gpio_set(&gpio_sync_out_a); + gpio_set(&gpio_sync_out_b); +} + +bool hw_sync_ready() { + return (gpio_read(&gpio_sync_in_a) && gpio_read(&gpio_sync_in_b)); +} + diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index a1b9b00f..e83a6266 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -271,6 +271,9 @@ void led_on(const led_t led); void led_off(const led_t led); void led_toggle(const led_t led); +void hw_sync_start(); +bool hw_sync_ready(); + #ifdef __cplusplus } #endif diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 16fecb18..11411461 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -44,7 +44,7 @@ #include "usb_api_transceiver.h" #include "sgpio_isr.h" #include "usb_bulk_buffer.h" - + static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { @@ -203,17 +203,13 @@ void usb_set_descriptor_by_serial_number(void) usb_descriptor_string_serial_number[2 + i * 2] = c; usb_descriptor_string_serial_number[3 + i * 2] = 0x00; } - } else { - usb_descriptor_string_serial_number[0] = 2; +} else { + usb_descriptor_string_serial_number[0] = 2; usb_descriptor_string_serial_number[1] = USB_DESCRIPTOR_TYPE_STRING; } } int main(void) { - struct gpio_t gpio_sync_in = GPIO(3, 11); - struct gpio_t gpio_sync_out_a = GPIO(3, 8); - struct gpio_t gpio_sync_out_b = GPIO(3, 9); - uint8_t usb_dummy_buffer[32768]; for(int i = 0; i < 0x4000; i += 2) { usb_dummy_buffer[i] = 0xff; @@ -252,7 +248,8 @@ int main(void) { rf_path_init(&rf_path); - int wait_for_sync_count = 100000000; + bool synced = false; + int hw_sync_count = 0; unsigned int phase = 0; while(true) { @@ -261,7 +258,16 @@ int main(void) { cpld_update(); - int gpio_sync_in_flag = gpio_get(gpio_sync_in); + // check for hardware sync + if(hw_sync_ready()) { + synced = true; + hw_sync_start(); + } /*else if(hw_sync_count++ > 1000) { + led_toggle(LED3); + hw_sync_count = 0; + }*/ + + //int gpio_sync_in_flag = gpio_get(gpio_sync_in); // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 @@ -270,7 +276,7 @@ int main(void) { usb_transfer_schedule_block( (transceiver_mode() == TRANSCEIVER_MODE_RX) ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x0000], + synced ? &usb_bulk_buffer[0x0000] : &usb_dummy_buffer[0x0000], 0x4000, NULL, NULL ); @@ -284,7 +290,7 @@ int main(void) { usb_transfer_schedule_block( (transceiver_mode() == TRANSCEIVER_MODE_RX) ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x4000], + synced ? &usb_bulk_buffer[0x4000] : &usb_dummy_buffer[0x4000], 0x4000, NULL, NULL ); From 3672f38b2765807db6ed8eb8106ee90c6e4984d9 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Sat, 10 Dec 2016 18:47:38 +0200 Subject: [PATCH 007/103] Experiments with gpio pins, for hardware sync --- firmware/common/hackrf_core.c | 30 ++++++++++++++++++++++++++++++ firmware/common/hackrf_core.h | 3 +++ firmware/hackrf_usb/hackrf_usb.c | 19 ++++++++++++++----- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index bb6ba3aa..d3329c6f 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -86,10 +86,16 @@ static struct gpio_t gpio_rffc5072_clock = GPIO(5, 6); static struct gpio_t gpio_rffc5072_data = GPIO(3, 3); static struct gpio_t gpio_rffc5072_reset = GPIO(2, 14); +/* static struct gpio_t gpio_sync_in_a = GPIO(3, 8); static struct gpio_t gpio_sync_in_b = GPIO(3, 9); static struct gpio_t gpio_sync_out_a = GPIO(3, 10); static struct gpio_t gpio_sync_out_b = GPIO(3, 11); +*/ +static struct gpio_t gpio_sync_in_a = GPIO(3, 10); +static struct gpio_t gpio_sync_in_b = GPIO(3, 11); +static struct gpio_t gpio_sync_out_a = GPIO(3, 8); +static struct gpio_t gpio_sync_out_b = GPIO(3, 9); #endif /* RF LDO control */ @@ -846,6 +852,12 @@ void pin_setup(void) { /* Safe state: start with VAA turned off: */ disable_rf_power(); + + gpio_input(&gpio_sync_in_a); + gpio_input(&gpio_sync_in_b); + + gpio_output(&gpio_sync_out_a); + gpio_output(&gpio_sync_out_b); #endif /* enable input on SCL and SDA pins */ @@ -897,6 +909,24 @@ void hw_sync_start() { gpio_set(&gpio_sync_out_b); } +void hw_sync_stop() { + gpio_clear(&gpio_sync_out_a); + gpio_clear(&gpio_sync_out_b); +} + +void hw_sync_copy_state() { + if(gpio_read(&gpio_sync_in_a)) { + gpio_set(&gpio_sync_out_a); + } else { + gpio_clear(&gpio_sync_out_a); + } + if(gpio_read(&gpio_sync_in_b)) { + gpio_set(&gpio_sync_out_b); + } else { + gpio_clear(&gpio_sync_out_b); + } +} + bool hw_sync_ready() { return (gpio_read(&gpio_sync_in_a) && gpio_read(&gpio_sync_in_b)); } diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index e83a6266..4458a65d 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -272,7 +272,10 @@ void led_off(const led_t led); void led_toggle(const led_t led); void hw_sync_start(); +void hw_sync_stop(); bool hw_sync_ready(); +void hw_sync_copy_state(); + #ifdef __cplusplus } diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 11411461..adcdbcab 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -252,20 +252,27 @@ int main(void) { int hw_sync_count = 0; unsigned int phase = 0; + + hw_sync_start(); while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) cpld_update(); + hw_sync_copy_state(); + // check for hardware sync if(hw_sync_ready()) { synced = true; - hw_sync_start(); - } /*else if(hw_sync_count++ > 1000) { + //hw_sync_start(); + } else if(hw_sync_count++ > 1000000) { + //hw_sync_stop(); led_toggle(LED3); hw_sync_count = 0; - }*/ + } else if(hw_sync_count == 500000) { + //hw_sync_start(); + } //int gpio_sync_in_flag = gpio_get(gpio_sync_in); @@ -276,7 +283,8 @@ int main(void) { usb_transfer_schedule_block( (transceiver_mode() == TRANSCEIVER_MODE_RX) ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - synced ? &usb_bulk_buffer[0x0000] : &usb_dummy_buffer[0x0000], + //synced ? &usb_bulk_buffer[0x0000] : &usb_dummy_buffer[0x0000], + &usb_bulk_buffer[0x0000], 0x4000, NULL, NULL ); @@ -290,7 +298,8 @@ int main(void) { usb_transfer_schedule_block( (transceiver_mode() == TRANSCEIVER_MODE_RX) ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - synced ? &usb_bulk_buffer[0x4000] : &usb_dummy_buffer[0x4000], + //synced ? &usb_bulk_buffer[0x4000] : &usb_dummy_buffer[0x4000], + &usb_bulk_buffer[0x4000], 0x4000, NULL, NULL ); From 976c99c1ad58d7813a82d07d2c7975f0587b57b7 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Sat, 10 Dec 2016 21:42:20 +0200 Subject: [PATCH 008/103] Kind of working hardware sync --- firmware/common/hackrf_core.c | 10 ++++++++-- firmware/common/hackrf_core.h | 3 ++- firmware/hackrf_usb/hackrf_usb.c | 17 +++++------------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index d3329c6f..6212c974 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -853,6 +853,9 @@ void pin_setup(void) { /* Safe state: start with VAA turned off: */ disable_rf_power(); + scu_pinmux(SCU_PINMUX_GPIO3_10, SCU_GPIO_PDN | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_PINMUX_GPIO3_11, SCU_GPIO_PDN | SCU_CONF_FUNCTION0); + gpio_input(&gpio_sync_in_a); gpio_input(&gpio_sync_in_b); @@ -904,9 +907,8 @@ void led_toggle(const led_t led) { gpio_toggle(&gpio_led[led]); } -void hw_sync_start() { +void hw_sync_syn() { gpio_set(&gpio_sync_out_a); - gpio_set(&gpio_sync_out_b); } void hw_sync_stop() { @@ -914,6 +916,10 @@ void hw_sync_stop() { gpio_clear(&gpio_sync_out_b); } +void hw_sync_ack() { + gpio_set(&gpio_sync_out_b); +} + void hw_sync_copy_state() { if(gpio_read(&gpio_sync_in_a)) { gpio_set(&gpio_sync_out_a); diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 4458a65d..78ccde41 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -271,8 +271,9 @@ void led_on(const led_t led); void led_off(const led_t led); void led_toggle(const led_t led); -void hw_sync_start(); +void hw_sync_syn(); void hw_sync_stop(); +void hw_sync_ack(); bool hw_sync_ready(); void hw_sync_copy_state(); diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index adcdbcab..393a1cb8 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -253,26 +253,19 @@ int main(void) { unsigned int phase = 0; - hw_sync_start(); + led_off(LED3); + hw_sync_syn(); while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) cpld_update(); - hw_sync_copy_state(); - - // check for hardware sync if(hw_sync_ready()) { synced = true; - //hw_sync_start(); - } else if(hw_sync_count++ > 1000000) { - //hw_sync_stop(); - led_toggle(LED3); - hw_sync_count = 0; - } else if(hw_sync_count == 500000) { - //hw_sync_start(); - } + hw_sync_ack(); + led_on(LED3); + } //int gpio_sync_in_flag = gpio_get(gpio_sync_in); From cde5ef5bb707979a3cd1c1263f97ae2c477c8237 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 13 Dec 2016 19:05:49 -0700 Subject: [PATCH 009/103] Fix multibyte reads over i2c --- firmware/common/i2c_lpc.c | 20 +++++++++++++------- firmware/libopencm3 | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/firmware/common/i2c_lpc.c b/firmware/common/i2c_lpc.c index f7bf4393..607a1a0a 100644 --- a/firmware/common/i2c_lpc.c +++ b/firmware/common/i2c_lpc.c @@ -44,17 +44,23 @@ void i2c_lpc_transfer(i2c_bus_t* const bus, uint8_t* const data_rx, const size_t count_rx ) { const uint32_t port = (uint32_t)bus->obj; - i2c_tx_start(port); - i2c_tx_byte(port, (slave_address << 1) | I2C_WRITE); - for(size_t i=0; i 0)) { + i2c_tx_start(port); + i2c_tx_byte(port, (slave_address << 1) | I2C_WRITE); + for(i=0; i 0)) { i2c_tx_start(port); i2c_tx_byte(port, (slave_address << 1) | I2C_READ); - for(size_t i=0; i Date: Tue, 13 Dec 2016 19:07:11 -0700 Subject: [PATCH 010/103] Add initial operacake support --- firmware/common/hackrf_core.h | 1 + firmware/common/operacake.c | 99 +++++++++++++++++++++++++ firmware/common/operacake.h | 40 ++++++++++ firmware/hackrf_usb/CMakeLists.txt | 2 + firmware/hackrf_usb/hackrf_usb.c | 4 + firmware/hackrf_usb/usb_api_operacake.c | 37 +++++++++ firmware/hackrf_usb/usb_api_operacake.h | 31 ++++++++ 7 files changed, 214 insertions(+) create mode 100644 firmware/common/operacake.c create mode 100644 firmware/common/operacake.h create mode 100644 firmware/hackrf_usb/usb_api_operacake.c create mode 100644 firmware/hackrf_usb/usb_api_operacake.h diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index a1b9b00f..974fa5ee 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -240,6 +240,7 @@ extern w25q80bv_driver_t spi_flash; extern sgpio_config_t sgpio_config; extern rf_path_t rf_path; extern jtag_t jtag_cpld; +extern i2c_bus_t i2c0; void cpu_clock_init(void); void cpu_clock_pll1_low_speed(void); diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c new file mode 100644 index 00000000..9ec35b1f --- /dev/null +++ b/firmware/common/operacake.c @@ -0,0 +1,99 @@ +/* + * Copyright 2016 Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "operacake.h" +#include "hackrf_core.h" + +#define OPERACAKE_PIN_OE (1<<7) +#define OPERACAKE_PIN_U2CTRL1 (1<<6) +#define OPERACAKE_PIN_U2CTRL0 (1<<5) +#define OPERACAKE_PIN_U3CTRL1 (1<<4) +#define OPERACAKE_PIN_U3CTRL0 (1<<3) +#define OPERACAKE_PIN_U1CTRL (1<<2) +#define OPERACAKE_PIN_LEDEN2 (1<<1) +#define OPERACAKE_PIN_LEDEN (1<<0) + +#define OPERACAKE_PA1 (!OPERACAKE_PIN_U2CTRL0 | !OPERACAKE_PIN_U2CTRL1) +#define OPERACAKE_PA2 (OPERACAKE_PIN_U2CTRL0 | !OPERACAKE_PIN_U2CTRL1) +#define OPERACAKE_PA3 (!OPERACAKE_PIN_U2CTRL0 | OPERACAKE_PIN_U2CTRL1) +#define OPERACAKE_PA4 (OPERACAKE_PIN_U2CTRL0 | OPERACAKE_PIN_U2CTRL1) + +#define OPERACAKE_PB1 (!OPERACAKE_PIN_U3CTRL0 | !OPERACAKE_PIN_U3CTRL1) +#define OPERACAKE_PB2 (OPERACAKE_PIN_U3CTRL0 | !OPERACAKE_PIN_U3CTRL1) +#define OPERACAKE_PB3 (!OPERACAKE_PIN_U3CTRL0 | OPERACAKE_PIN_U3CTRL1) +#define OPERACAKE_PB4 (OPERACAKE_PIN_U3CTRL0 | OPERACAKE_PIN_U3CTRL1) + +#define OPERACAKE_CROSSOVER (!OPERACAKE_PIN_U1CTRL) +#define OPERACAKE_EN_LEDS (OPERACAKE_PIN_LEDEN2 | !OPERACAKE_PIN_LEDEN) + +#define OPERACAKE_REG_INPUT 0x00 +#define OPERACAKE_REG_OUTPUT 0x01 +#define OPERACAKE_REG_POLARITY 0x02 +#define OPERACAKE_REG_CONFIG 0x03 + +#define OPERACAKE_DEFAULT_OUTPUT (!OPERACAKE_PIN_OE | OPERACAKE_PA1 | OPERACAKE_PB1 | OPERACAKE_EN_LEDS) +#define OPERACAKE_DEFAULT_POLARITY (0x00)//(OPERACAKE_PIN_OE | OPERACAKE_PIN_LEDEN) +#define OPERACAKE_CONFIG_ALL_OUTPUT (0x00) + +typedef struct { + i2c_bus_t* const bus; + uint8_t i2c_address; +} operacake_driver_t; + +operacake_driver_t operacake_driver = { + .bus = &i2c0, + .i2c_address = 0x18, +}; + +uint8_t operacake_read_single(operacake_driver_t* drv, uint8_t reg); +void operacake_write(operacake_driver_t* drv, const uint8_t* const data, const size_t data_count); + + +uint8_t operacake_init(void) { + /* TODO: detect Operacake */ + uint8_t polarity_data[] = {OPERACAKE_REG_POLARITY, + OPERACAKE_DEFAULT_POLARITY}; + operacake_write(&operacake_driver, polarity_data, 2); + uint8_t output_data[] = {OPERACAKE_REG_OUTPUT, + OPERACAKE_DEFAULT_OUTPUT}; + operacake_write(&operacake_driver, output_data, 2); + const uint8_t config_data[] = {OPERACAKE_REG_CONFIG, + OPERACAKE_CONFIG_ALL_OUTPUT}; + operacake_write(&operacake_driver, config_data, 2); + return 0; +} + +uint8_t operacake_set_ports(uint8_t PA, uint8_t PB) { + return PA | PB; +} + +/* read single register */ +uint8_t operacake_read_single(operacake_driver_t* drv, uint8_t reg) { + const uint8_t data_tx[] = { reg }; + uint8_t data_rx[] = { 0x00 }; + i2c_bus_transfer(drv->bus, drv->i2c_address, data_tx, 1, data_rx, 1); + return data_rx[0]; +} + +/* Write to one of the PCA9557 registers */ +void operacake_write(operacake_driver_t* drv, const uint8_t* const data, const size_t data_count) { + i2c_bus_transfer(drv->bus, drv->i2c_address, data, data_count, NULL, 0); +} diff --git a/firmware/common/operacake.h b/firmware/common/operacake.h new file mode 100644 index 00000000..33c35a4f --- /dev/null +++ b/firmware/common/operacake.h @@ -0,0 +1,40 @@ +/* + * Copyright 2016 Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __OPERACAKE_H +#define __OPERACAKE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include "i2c_bus.h" + +uint8_t operacake_init(void); +uint8_t operacake_set_ports(uint8_t PA, uint8_t PB); + +#ifdef __cplusplus +} +#endif + +#endif /* __OPERACAKE_H */ diff --git a/firmware/hackrf_usb/CMakeLists.txt b/firmware/hackrf_usb/CMakeLists.txt index 10ee4ffb..5f2252aa 100644 --- a/firmware/hackrf_usb/CMakeLists.txt +++ b/firmware/hackrf_usb/CMakeLists.txt @@ -42,6 +42,8 @@ set(SRC_M4 usb_api_register.c usb_api_spiflash.c usb_api_transceiver.c + "${PATH_HACKRF_FIRMWARE_COMMON}/operacake.c" + usb_api_operacake.c "${PATH_HACKRF_FIRMWARE_COMMON}/usb_queue.c" "${PATH_HACKRF_FIRMWARE_COMMON}/fault_handler.c" "${PATH_HACKRF_FIRMWARE_COMMON}/cpld_jtag.c" diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 2c5ec3d0..bea6add6 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -40,6 +40,8 @@ #include "usb_api_cpld.h" #include "usb_api_register.h" #include "usb_api_spiflash.h" +#include "usb_api_operacake.h" +#include "operacake.h" #include "usb_api_transceiver.h" #include "sgpio_isr.h" @@ -140,6 +142,7 @@ static const usb_request_handler_fn vendor_request_handler[] = { #endif usb_vendor_request_set_freq_explicit, usb_vendor_request_read_wcid, // USB_WCID_VENDOR_REQ + usb_vendor_request_operacake_set_ports }; static const uint32_t vendor_request_handler_count = @@ -237,6 +240,7 @@ int main(void) { usb_run(&usb_device); rf_path_init(&rf_path); + operacake_init(); unsigned int phase = 0; while(true) { diff --git a/firmware/hackrf_usb/usb_api_operacake.c b/firmware/hackrf_usb/usb_api_operacake.c new file mode 100644 index 00000000..7ac4da81 --- /dev/null +++ b/firmware/hackrf_usb/usb_api_operacake.c @@ -0,0 +1,37 @@ +/* + * Copyright 2016 Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "usb_api_operacake.h" +#include "usb_queue.h" + +#include +#include +#include + +usb_request_status_t usb_vendor_request_operacake_set_ports( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) +{ + if (stage == USB_TRANSFER_STAGE_SETUP) { + /* TODO: implement something */ + usb_transfer_schedule_ack(endpoint->in); + } + return USB_REQUEST_STATUS_OK; +} diff --git a/firmware/hackrf_usb/usb_api_operacake.h b/firmware/hackrf_usb/usb_api_operacake.h new file mode 100644 index 00000000..b2f4f890 --- /dev/null +++ b/firmware/hackrf_usb/usb_api_operacake.h @@ -0,0 +1,31 @@ +/* + * Copyright 2016 Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __USB_API_OPERACAKE_H__ +#define __USB_API_OPERACAKE_H__ + +#include +#include + +usb_request_status_t usb_vendor_request_operacake_set_ports( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); + +#endif /* end of include guard: __USB_API_OPERACAKE_H__ */ From bd1111a2e3645c80fafc62441cd42be5635f5ada Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 13 Dec 2016 19:23:19 -0700 Subject: [PATCH 011/103] Fix silly polarity issues --- firmware/common/operacake.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index 9ec35b1f..50bc9339 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -31,26 +31,27 @@ #define OPERACAKE_PIN_LEDEN2 (1<<1) #define OPERACAKE_PIN_LEDEN (1<<0) -#define OPERACAKE_PA1 (!OPERACAKE_PIN_U2CTRL0 | !OPERACAKE_PIN_U2CTRL1) -#define OPERACAKE_PA2 (OPERACAKE_PIN_U2CTRL0 | !OPERACAKE_PIN_U2CTRL1) -#define OPERACAKE_PA3 (!OPERACAKE_PIN_U2CTRL0 | OPERACAKE_PIN_U2CTRL1) +#define OPERACAKE_PA1 (0) +#define OPERACAKE_PA2 (OPERACAKE_PIN_U2CTRL0) +#define OPERACAKE_PA3 (OPERACAKE_PIN_U2CTRL1) #define OPERACAKE_PA4 (OPERACAKE_PIN_U2CTRL0 | OPERACAKE_PIN_U2CTRL1) -#define OPERACAKE_PB1 (!OPERACAKE_PIN_U3CTRL0 | !OPERACAKE_PIN_U3CTRL1) -#define OPERACAKE_PB2 (OPERACAKE_PIN_U3CTRL0 | !OPERACAKE_PIN_U3CTRL1) -#define OPERACAKE_PB3 (!OPERACAKE_PIN_U3CTRL0 | OPERACAKE_PIN_U3CTRL1) +#define OPERACAKE_PB1 (0) +#define OPERACAKE_PB2 (OPERACAKE_PIN_U3CTRL0) +#define OPERACAKE_PB3 (OPERACAKE_PIN_U3CTRL1) #define OPERACAKE_PB4 (OPERACAKE_PIN_U3CTRL0 | OPERACAKE_PIN_U3CTRL1) -#define OPERACAKE_CROSSOVER (!OPERACAKE_PIN_U1CTRL) -#define OPERACAKE_EN_LEDS (OPERACAKE_PIN_LEDEN2 | !OPERACAKE_PIN_LEDEN) +#define OPERACAKE_CROSSOVER (0) +#define OPERACAKE_EN_LEDS (OPERACAKE_PIN_LEDEN2) #define OPERACAKE_REG_INPUT 0x00 #define OPERACAKE_REG_OUTPUT 0x01 #define OPERACAKE_REG_POLARITY 0x02 #define OPERACAKE_REG_CONFIG 0x03 -#define OPERACAKE_DEFAULT_OUTPUT (!OPERACAKE_PIN_OE | OPERACAKE_PA1 | OPERACAKE_PB1 | OPERACAKE_EN_LEDS) -#define OPERACAKE_DEFAULT_POLARITY (0x00)//(OPERACAKE_PIN_OE | OPERACAKE_PIN_LEDEN) +#define OPERACAKE_DEFAULT_OUTPUT (OPERACAKE_PIN_OE | OPERACAKE_PIN_U1CTRL | \ + OPERACAKE_PA1 | OPERACAKE_PB1 | \ + OPERACAKE_EN_LEDS) #define OPERACAKE_CONFIG_ALL_OUTPUT (0x00) typedef struct { @@ -69,9 +70,6 @@ void operacake_write(operacake_driver_t* drv, const uint8_t* const data, const s uint8_t operacake_init(void) { /* TODO: detect Operacake */ - uint8_t polarity_data[] = {OPERACAKE_REG_POLARITY, - OPERACAKE_DEFAULT_POLARITY}; - operacake_write(&operacake_driver, polarity_data, 2); uint8_t output_data[] = {OPERACAKE_REG_OUTPUT, OPERACAKE_DEFAULT_OUTPUT}; operacake_write(&operacake_driver, output_data, 2); From 25929965f5446733dd30e5f8e7d1d1ffc75073cc Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Thu, 15 Dec 2016 21:56:49 +0200 Subject: [PATCH 012/103] Kind of working hw sync --- firmware/hackrf_usb/hackrf_usb.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 393a1cb8..7485b1f1 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -49,6 +49,8 @@ static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { baseband_streaming_disable(&sgpio_config); + + disable_sync usb_endpoint_disable(&usb_endpoint_bulk_in); usb_endpoint_disable(&usb_endpoint_bulk_out); @@ -76,6 +78,9 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { si5351c_activate_best_clock_source(&clock_gen); + + wait_for_sync + baseband_streaming_enable(&sgpio_config); } } @@ -261,11 +266,13 @@ int main(void) { cpld_update(); - if(hw_sync_ready()) { - synced = true; - hw_sync_ack(); - led_on(LED3); - } +// if(!synced) { + if(hw_sync_ready()) { + synced = true; + hw_sync_ack(); + led_on(LED3); + } +// } //int gpio_sync_in_flag = gpio_get(gpio_sync_in); From 1cec9ad4db974612ca241028fe26844c0f6a3e17 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Mon, 19 Dec 2016 21:50:29 -0700 Subject: [PATCH 013/103] Add Operacake USB API (firmware) --- firmware/common/operacake.c | 103 +++++++++++++++++------- firmware/common/operacake.h | 10 +++ firmware/hackrf_usb/usb_api_operacake.c | 4 +- 3 files changed, 85 insertions(+), 32 deletions(-) diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index 50bc9339..02d16851 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -22,36 +22,39 @@ #include "operacake.h" #include "hackrf_core.h" -#define OPERACAKE_PIN_OE (1<<7) -#define OPERACAKE_PIN_U2CTRL1 (1<<6) -#define OPERACAKE_PIN_U2CTRL0 (1<<5) -#define OPERACAKE_PIN_U3CTRL1 (1<<4) -#define OPERACAKE_PIN_U3CTRL0 (1<<3) -#define OPERACAKE_PIN_U1CTRL (1<<2) -#define OPERACAKE_PIN_LEDEN2 (1<<1) -#define OPERACAKE_PIN_LEDEN (1<<0) +#define OPERACAKE_PIN_OE(x) (x<<7) +#define OPERACAKE_PIN_U2CTRL1(x) (x<<6) +#define OPERACAKE_PIN_U2CTRL0(x) (x<<5) +#define OPERACAKE_PIN_U3CTRL1(x) (x<<4) +#define OPERACAKE_PIN_U3CTRL0(x) (x<<3) +#define OPERACAKE_PIN_U1CTRL(x) (x<<2) +#define OPERACAKE_PIN_LEDEN2(x) (x<<1) +#define OPERACAKE_PIN_LEDEN(x) (x<<0) -#define OPERACAKE_PA1 (0) -#define OPERACAKE_PA2 (OPERACAKE_PIN_U2CTRL0) -#define OPERACAKE_PA3 (OPERACAKE_PIN_U2CTRL1) -#define OPERACAKE_PA4 (OPERACAKE_PIN_U2CTRL0 | OPERACAKE_PIN_U2CTRL1) +#define OPERACAKE_PORT_A1 (OPERACAKE_PIN_U2CTRL0(0) | OPERACAKE_PIN_U2CTRL1(0)) +#define OPERACAKE_PORT_A2 (OPERACAKE_PIN_U2CTRL0(1) | OPERACAKE_PIN_U2CTRL1(0)) +#define OPERACAKE_PORT_A3 (OPERACAKE_PIN_U2CTRL0(0) | OPERACAKE_PIN_U2CTRL1(1)) +#define OPERACAKE_PORT_A4 (OPERACAKE_PIN_U2CTRL0(1) | OPERACAKE_PIN_U2CTRL1(1)) -#define OPERACAKE_PB1 (0) -#define OPERACAKE_PB2 (OPERACAKE_PIN_U3CTRL0) -#define OPERACAKE_PB3 (OPERACAKE_PIN_U3CTRL1) -#define OPERACAKE_PB4 (OPERACAKE_PIN_U3CTRL0 | OPERACAKE_PIN_U3CTRL1) +#define OPERACAKE_PORT_B1 (OPERACAKE_PIN_U3CTRL0(0) | OPERACAKE_PIN_U3CTRL1(0)) +#define OPERACAKE_PORT_B2 (OPERACAKE_PIN_U3CTRL0(1) | OPERACAKE_PIN_U3CTRL1(0)) +#define OPERACAKE_PORT_B3 (OPERACAKE_PIN_U3CTRL0(0) | OPERACAKE_PIN_U3CTRL1(1)) +#define OPERACAKE_PORT_B4 (OPERACAKE_PIN_U3CTRL0(1) | OPERACAKE_PIN_U3CTRL1(1)) -#define OPERACAKE_CROSSOVER (0) -#define OPERACAKE_EN_LEDS (OPERACAKE_PIN_LEDEN2) +#define OPERACAKE_SAMESIDE OPERACAKE_PIN_U1CTRL(1) +#define OPERACAKE_CROSSOVER OPERACAKE_PIN_U1CTRL(0) +#define OPERACAKE_EN_LEDS (OPERACAKE_PIN_LEDEN2(1) | OPERACAKE_PIN_LEDEN2(0)) +#define OPERACAKE_GPIO_EN OPERACAKE_PIN_OE(0) +#define OPERACAKE_GPIO_DISABLE OPERACAKE_PIN_OE(1) #define OPERACAKE_REG_INPUT 0x00 #define OPERACAKE_REG_OUTPUT 0x01 #define OPERACAKE_REG_POLARITY 0x02 #define OPERACAKE_REG_CONFIG 0x03 -#define OPERACAKE_DEFAULT_OUTPUT (OPERACAKE_PIN_OE | OPERACAKE_PIN_U1CTRL | \ - OPERACAKE_PA1 | OPERACAKE_PB1 | \ - OPERACAKE_EN_LEDS) +#define OPERACAKE_DEFAULT_OUTPUT (OPERACAKE_GPIO_DISABLE | OPERACAKE_SAMESIDE \ + | OPERACAKE_PORT_A1 | OPERACAKE_PORT_B1 \ + | OPERACAKE_EN_LEDS) #define OPERACAKE_CONFIG_ALL_OUTPUT (0x00) typedef struct { @@ -79,16 +82,58 @@ uint8_t operacake_init(void) { return 0; } -uint8_t operacake_set_ports(uint8_t PA, uint8_t PB) { - return PA | PB; +uint8_t port_to_pins(uint8_t port) { + switch(port) { + case OPERACAKE_PA1: + return OPERACAKE_PORT_A1; + case OPERACAKE_PA2: + return OPERACAKE_PORT_A2; + case OPERACAKE_PA3: + return OPERACAKE_PORT_A3; + case OPERACAKE_PA4: + return OPERACAKE_PORT_A4; + + case OPERACAKE_PB1: + return OPERACAKE_PORT_B1; + case OPERACAKE_PB2: + return OPERACAKE_PORT_B2; + case OPERACAKE_PB3: + return OPERACAKE_PORT_B3; + case OPERACAKE_PB4: + return OPERACAKE_PORT_B4; + } + return 0xFF; } -/* read single register */ -uint8_t operacake_read_single(operacake_driver_t* drv, uint8_t reg) { - const uint8_t data_tx[] = { reg }; - uint8_t data_rx[] = { 0x00 }; - i2c_bus_transfer(drv->bus, drv->i2c_address, data_tx, 1, data_rx, 1); - return data_rx[0]; +uint8_t operacake_set_ports(uint8_t PA, uint8_t PB) { + uint8_t side, pa, pb; + uint8_t output_data[2]; + /* Start with some error checking, + * which should have been done either + * on the host or elsewhere in firmware + */ + if((PA > OPERACAKE_PB4) || (PB > OPERACAKE_PB4)) { + return 1; + } + /* Check which side PA and PB are on */ + if(((PA <= OPERACAKE_PA4) && (PB <= OPERACAKE_PA4)) + || ((PA > OPERACAKE_PA4) && (PB > OPERACAKE_PA4))) { + return 1; + } + + if(PA > OPERACAKE_PA4) + side = OPERACAKE_CROSSOVER; + else + side = OPERACAKE_SAMESIDE; + + pa = port_to_pins(PA); + pb = port_to_pins(PB); + + output_data[0] = OPERACAKE_REG_OUTPUT; + output_data[1] = (OPERACAKE_GPIO_DISABLE | side + | pa | pb | OPERACAKE_EN_LEDS); + operacake_write(&operacake_driver, output_data, 2); + return 0; } /* Write to one of the PCA9557 registers */ diff --git a/firmware/common/operacake.h b/firmware/common/operacake.h index 33c35a4f..20a9a998 100644 --- a/firmware/common/operacake.h +++ b/firmware/common/operacake.h @@ -30,6 +30,16 @@ extern "C" #include #include "i2c_bus.h" +#define OPERACAKE_PA1 0 +#define OPERACAKE_PA2 1 +#define OPERACAKE_PA3 2 +#define OPERACAKE_PA4 3 + +#define OPERACAKE_PB1 4 +#define OPERACAKE_PB2 5 +#define OPERACAKE_PB3 6 +#define OPERACAKE_PB4 7 + uint8_t operacake_init(void); uint8_t operacake_set_ports(uint8_t PA, uint8_t PB); diff --git a/firmware/hackrf_usb/usb_api_operacake.c b/firmware/hackrf_usb/usb_api_operacake.c index 7ac4da81..c93ec494 100644 --- a/firmware/hackrf_usb/usb_api_operacake.c +++ b/firmware/hackrf_usb/usb_api_operacake.c @@ -22,15 +22,13 @@ #include "usb_api_operacake.h" #include "usb_queue.h" -#include -#include #include usb_request_status_t usb_vendor_request_operacake_set_ports( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if (stage == USB_TRANSFER_STAGE_SETUP) { - /* TODO: implement something */ + operacake_set_ports(endpoint->setup.index, endpoint->setup.value); usb_transfer_schedule_ack(endpoint->in); } return USB_REQUEST_STATUS_OK; From 9d7b55ccb19072e029cfd2d84442bb0f8fb7e70d Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 22 Dec 2016 17:22:04 +0000 Subject: [PATCH 014/103] Add host functions to set operacake ports --- host/libhackrf/src/hackrf.c | 37 +++++++++++++++++++++++++++++++++++++ host/libhackrf/src/hackrf.h | 11 +++++++++++ 2 files changed, 48 insertions(+) diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index a759fb3a..c9ccd858 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -67,6 +67,9 @@ typedef enum { HACKRF_VENDOR_REQUEST_SET_TXVGA_GAIN = 21, HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23, HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, + HACKRF_VENDOR_REQUEST_READ_WCID = 25, + HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS = 26, + HACKRF_VENDOR_REQUEST_GET_OPERACAKES = 27, } hackrf_vendor_request; typedef enum { @@ -1695,6 +1698,40 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) return p->bandwidth_hz; } +/* Set Operacake ports */ +int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, + const uint8_t port_a, + const uint8_t port_b) +{ + int result; + /* Error checking */ + if((port_a > OPERACAKE_PB4) || (port_b > OPERACAKE_PB4)) { + return HACKRF_ERROR_INVALID_PARAM; + } + /* Check which side PA and PB are on */ + if(((port_a <= OPERACAKE_PA4) && (port_b <= OPERACAKE_PA4)) + || ((port_a > OPERACAKE_PA4) && (port_b > OPERACAKE_PA4))) { + return HACKRF_ERROR_INVALID_PARAM; + } + result = libusb_control_transfer( + device->usb_device, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS, + port_a, + port_b, + NULL, + 0, + 0 + ); + + if (result != 0) + { + return HACKRF_ERROR_LIBUSB; + } else { + return HACKRF_SUCCESS; + } +} + #ifdef __cplusplus } // __cplusplus defined. #endif diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 7ac0530f..e4e0d1c9 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -83,6 +83,17 @@ enum rf_path_filter { RF_PATH_FILTER_HIGH_PASS = 2, }; +enum operacake_ports { + OPERACAKE_PA1 = 0, + OPERACAKE_PA2 = 1, + OPERACAKE_PA3 = 2, + OPERACAKE_PA4 = 3, + OPERACAKE_PB1 = 4, + OPERACAKE_PB2 = 5, + OPERACAKE_PB3 = 6, + OPERACAKE_PB4 = 7, +}; + typedef struct hackrf_device hackrf_device; typedef struct { From c54e31f397efed25d46e691c02d23b0cbb168800 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 23 Dec 2016 21:59:45 +0000 Subject: [PATCH 015/103] Add support for multiple operacake boards connected to one HackRF --- firmware/common/operacake.c | 65 +++++++++++++++---------- firmware/common/operacake.h | 3 ++ firmware/hackrf_usb/hackrf_usb.c | 1 + firmware/hackrf_usb/usb_api_operacake.c | 12 ++++- firmware/hackrf_usb/usb_api_operacake.h | 3 ++ host/hackrf-tools/src/hackrf_info.c | 18 ++++++- host/libhackrf/src/hackrf.c | 29 ++++++++++- host/libhackrf/src/hackrf.h | 6 +++ 8 files changed, 106 insertions(+), 31 deletions(-) diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index 02d16851..3dad30c9 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -57,31 +57,50 @@ | OPERACAKE_EN_LEDS) #define OPERACAKE_CONFIG_ALL_OUTPUT (0x00) -typedef struct { - i2c_bus_t* const bus; - uint8_t i2c_address; -} operacake_driver_t; +#define OPERACAKE_DEFAULT_ADDRESS 0x18 -operacake_driver_t operacake_driver = { - .bus = &i2c0, - .i2c_address = 0x18, -}; +i2c_bus_t* const oc_bus = &i2c0; +uint8_t operacake_boards[8] = {0,0,0,0,0,0,0,0}; -uint8_t operacake_read_single(operacake_driver_t* drv, uint8_t reg); -void operacake_write(operacake_driver_t* drv, const uint8_t* const data, const size_t data_count); +/* read single register */ +uint8_t operacake_read_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg) { + const uint8_t data_tx[] = { reg }; + uint8_t data_rx[] = { 0x00 }; + i2c_bus_transfer(bus, address, data_tx, 1, data_rx, 1); + return data_rx[0]; +} +/* Write to one of the PCA9557 registers */ +void operacake_write_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg, uint8_t value) { + const uint8_t data[] = {reg, value}; + i2c_bus_transfer(bus, address, data, 2, NULL, 0); +} uint8_t operacake_init(void) { - /* TODO: detect Operacake */ - uint8_t output_data[] = {OPERACAKE_REG_OUTPUT, - OPERACAKE_DEFAULT_OUTPUT}; - operacake_write(&operacake_driver, output_data, 2); - const uint8_t config_data[] = {OPERACAKE_REG_CONFIG, - OPERACAKE_CONFIG_ALL_OUTPUT}; - operacake_write(&operacake_driver, config_data, 2); + int reg, addr, i, j = 0; + /* Find connected operacakes */ + for(i=0; i<8; i++) { + addr = OPERACAKE_DEFAULT_ADDRESS | i; + operacake_write_reg(oc_bus, addr, OPERACAKE_REG_OUTPUT, + OPERACAKE_DEFAULT_OUTPUT); + operacake_write_reg(oc_bus, addr, OPERACAKE_REG_CONFIG, + OPERACAKE_CONFIG_ALL_OUTPUT); + reg = operacake_read_reg(oc_bus, addr, OPERACAKE_REG_CONFIG); + if(reg==OPERACAKE_CONFIG_ALL_OUTPUT) + operacake_boards[j++] = addr; + } return 0; } +// uint8_t operacake_get_boards(uint8_t *boards) { +// int i, j = 0; +// for(i=0; i<8; i++) { +// if(operacake_boards & (1<bus, drv->i2c_address, data, data_count, NULL, 0); -} diff --git a/firmware/common/operacake.h b/firmware/common/operacake.h index 20a9a998..78dba000 100644 --- a/firmware/common/operacake.h +++ b/firmware/common/operacake.h @@ -40,6 +40,9 @@ extern "C" #define OPERACAKE_PB3 6 #define OPERACAKE_PB4 7 +/* Up to 8 Operacake boards can be used with one HackRF */ +extern uint8_t operacake_boards[8]; + uint8_t operacake_init(void); uint8_t operacake_set_ports(uint8_t PA, uint8_t PB); diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index bea6add6..2d5fd2ff 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -142,6 +142,7 @@ static const usb_request_handler_fn vendor_request_handler[] = { #endif usb_vendor_request_set_freq_explicit, usb_vendor_request_read_wcid, // USB_WCID_VENDOR_REQ + usb_vendor_request_operacake_get_boards, usb_vendor_request_operacake_set_ports }; diff --git a/firmware/hackrf_usb/usb_api_operacake.c b/firmware/hackrf_usb/usb_api_operacake.c index c93ec494..ce420860 100644 --- a/firmware/hackrf_usb/usb_api_operacake.c +++ b/firmware/hackrf_usb/usb_api_operacake.c @@ -24,8 +24,18 @@ #include +usb_request_status_t usb_vendor_request_operacake_get_boards( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) +{ + if (stage == USB_TRANSFER_STAGE_SETUP) { + usb_transfer_schedule_block(endpoint->in, operacake_boards, 8, NULL, NULL); + usb_transfer_schedule_ack(endpoint->out); + } + return USB_REQUEST_STATUS_OK; +} + usb_request_status_t usb_vendor_request_operacake_set_ports( - usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if (stage == USB_TRANSFER_STAGE_SETUP) { operacake_set_ports(endpoint->setup.index, endpoint->setup.value); diff --git a/firmware/hackrf_usb/usb_api_operacake.h b/firmware/hackrf_usb/usb_api_operacake.h index b2f4f890..4339488d 100644 --- a/firmware/hackrf_usb/usb_api_operacake.h +++ b/firmware/hackrf_usb/usb_api_operacake.h @@ -25,6 +25,9 @@ #include #include +usb_request_status_t usb_vendor_request_operacake_get_boards( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); + usb_request_status_t usb_vendor_request_operacake_set_ports( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); diff --git a/host/hackrf-tools/src/hackrf_info.c b/host/hackrf-tools/src/hackrf_info.c index eed24c37..def5371d 100644 --- a/host/hackrf-tools/src/hackrf_info.c +++ b/host/hackrf-tools/src/hackrf_info.c @@ -32,9 +32,10 @@ int main(void) uint8_t board_id = BOARD_ID_INVALID; char version[255 + 1]; read_partid_serialno_t read_partid_serialno; + uint8_t operacakes[8]; hackrf_device_list_t *list; hackrf_device* device; - int i; + int i, j; result = hackrf_init(); if (result != HACKRF_SUCCESS) { @@ -98,7 +99,20 @@ int main(void) read_partid_serialno.serial_no[1], read_partid_serialno.serial_no[2], read_partid_serialno.serial_no[3]); - + + result = hackrf_get_operacake_boards(device, &operacakes[0]); + if (result != HACKRF_SUCCESS) { + fprintf(stderr, "hackrf_get_operacake_boards() failed: %s (%d)\n", + hackrf_error_name(result), result); + return EXIT_FAILURE; + } + for(j=0; j<8; j++) { + if(operacakes[j] == 0) + break; + printf("Operacake found, address: 0x%02x\n", operacakes[j]); + + } + result = hackrf_close(device); if (result != HACKRF_SUCCESS) { fprintf(stderr, "hackrf_close() failed: %s (%d)\n", diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index c9ccd858..dc7edec3 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -68,8 +68,8 @@ typedef enum { HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23, HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, HACKRF_VENDOR_REQUEST_READ_WCID = 25, - HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS = 26, - HACKRF_VENDOR_REQUEST_GET_OPERACAKES = 27, + HACKRF_VENDOR_REQUEST_OPERACAKE_GET_BOARDS = 26, + HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS = 27, } hackrf_vendor_request; typedef enum { @@ -1698,6 +1698,31 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) return p->bandwidth_hz; } +/* Retrieve list of Operacake board addresses + * boards must be *uint8_t[8] + */ +int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards) +{ + int result; + result = libusb_control_transfer( + device->usb_device, + LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + HACKRF_VENDOR_REQUEST_OPERACAKE_GET_BOARDS, + 0, + 0, + boards, + 8, + 0 + ); + + if (result < 8) + { + return HACKRF_ERROR_LIBUSB; + } else { + return HACKRF_SUCCESS; + } +} + /* Set Operacake ports */ int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, const uint8_t port_a, diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index e4e0d1c9..87e9556b 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -208,6 +208,12 @@ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw_round_down_lt(c /* Compute best default value depending on sample rate (auto filter) */ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz); +/* Operacake functions */ +int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards); +int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, + const uint8_t port_a, + const uint8_t port_b); + #ifdef __cplusplus } // __cplusplus defined. #endif From b528af46c1e647841709aaa729db238f724cd273 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Sun, 25 Dec 2016 11:01:55 +0000 Subject: [PATCH 016/103] Tidy unused operacake code and use addresses to refer to boards --- firmware/common/operacake.c | 15 +++------------ firmware/common/operacake.h | 2 +- firmware/hackrf_usb/usb_api_operacake.c | 6 +++++- host/libhackrf/src/hackrf.c | 9 +++++---- host/libhackrf/src/hackrf.h | 5 +++-- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index 3dad30c9..ec7df4ba 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -77,7 +77,7 @@ void operacake_write_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg, uin } uint8_t operacake_init(void) { - int reg, addr, i, j = 0; + uint8_t reg, addr, i, j = 0; /* Find connected operacakes */ for(i=0; i<8; i++) { addr = OPERACAKE_DEFAULT_ADDRESS | i; @@ -92,15 +92,6 @@ uint8_t operacake_init(void) { return 0; } -// uint8_t operacake_get_boards(uint8_t *boards) { -// int i, j = 0; -// for(i=0; i<8; i++) { -// if(operacake_boards & (1<setup.index & 0xFF; + port_a = endpoint->setup.value & 0xFF; + port_b = (endpoint->setup.value >> 8) & 0xFF; if (stage == USB_TRANSFER_STAGE_SETUP) { - operacake_set_ports(endpoint->setup.index, endpoint->setup.value); + operacake_set_ports(address, port_a, port_b); usb_transfer_schedule_ack(endpoint->in); } return USB_REQUEST_STATUS_OK; diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index dc7edec3..61824cf1 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1725,8 +1725,9 @@ int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards) /* Set Operacake ports */ int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, - const uint8_t port_a, - const uint8_t port_b) + uint8_t address, + uint8_t port_a, + uint8_t port_b) { int result; /* Error checking */ @@ -1742,8 +1743,8 @@ int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, device->usb_device, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS, - port_a, - port_b, + address, + port_a | (port_b<<8), NULL, 0, 0 diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 87e9556b..ef7f0958 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -211,8 +211,9 @@ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t /* Operacake functions */ int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards); int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, - const uint8_t port_a, - const uint8_t port_b); + uint8_t address, + uint8_t port_a, + uint8_t port_b); #ifdef __cplusplus } // __cplusplus defined. From 303334870f91af7eff46e551dbbaf6db7f9e1984 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 1 Jul 2016 20:07:29 +0100 Subject: [PATCH 017/103] Don't bother setting path 1 when tuning RFFC5072 Mixer path 1 only exists in the RFFC5071 --- firmware/common/rffc5071.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/firmware/common/rffc5071.c b/firmware/common/rffc5071.c index 71ba9f5c..653a28a8 100644 --- a/firmware/common/rffc5071.c +++ b/firmware/common/rffc5071.c @@ -254,13 +254,6 @@ uint64_t rffc5071_config_synth_int(rffc5071_driver_t* const drv, uint16_t lo) { tune_freq_hz = (REF_FREQ * (tmp_n >> 5ULL) * fbkdiv * FREQ_ONE_MHZ) / (lodiv * (1 << 24ULL)); - /* Path 1 */ - set_RFFC5071_P1LODIV(drv, n_lo); - set_RFFC5071_P1N(drv, n); - set_RFFC5071_P1PRESC(drv, fbkdiv >> 1); - set_RFFC5071_P1NMSB(drv, p1nmsb); - set_RFFC5071_P1NLSB(drv, p1nlsb); - /* Path 2 */ set_RFFC5071_P2LODIV(drv, n_lo); set_RFFC5071_P2N(drv, n); From f7bdbb07d89b817b27d7a6a595952e1b85a2c3da Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 9 Jul 2016 00:02:45 +0100 Subject: [PATCH 018/103] Speed up RFFC5072 comms by 50%! --- firmware/common/rffc5071_spi.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/firmware/common/rffc5071_spi.c b/firmware/common/rffc5071_spi.c index 7c3d9da2..5699f93c 100644 --- a/firmware/common/rffc5071_spi.c +++ b/firmware/common/rffc5071_spi.c @@ -94,10 +94,7 @@ void rffc5071_spi_stop(spi_bus_t* const bus) { static void rffc5071_spi_serial_delay(spi_bus_t* const bus) { (void)bus; - volatile uint32_t i; - - for (i = 0; i < 2; i++) - __asm__("nop"); + __asm__("nop"); } static void rffc5071_spi_sck(spi_bus_t* const bus) { From 31a37bd841b99154fce7217d2b3d78a24f8aacd9 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 9 Jul 2016 00:03:35 +0100 Subject: [PATCH 019/103] Output RFFC5072 LOCK status --- firmware/common/rffc5071.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/firmware/common/rffc5071.c b/firmware/common/rffc5071.c index 653a28a8..10542b6c 100644 --- a/firmware/common/rffc5071.c +++ b/firmware/common/rffc5071.c @@ -117,6 +117,10 @@ void rffc5071_setup(rffc5071_driver_t* const drv) /* GPOs are active at all times */ set_RFFC5071_GATE(drv, 1); + /* Output LOCK status on GPO4 and enable lock detect */ + set_RFFC5071_LOCK(drv, 1); + set_RFFC5071_LDEN(drv, 1); + rffc5071_regs_commit(drv); } From 9f2d6cdbeada0bc4d543aadf8b6ba6d6b2ba4b2b Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 1 Jul 2016 20:09:15 +0100 Subject: [PATCH 020/103] WIP scanning --- firmware/hackrf_usb/hackrf_usb.c | 50 +++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 2c5ec3d0..394875c4 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -28,6 +28,8 @@ #include +#include "tuning.h" + #include "usb.h" #include "usb_standard_request.h" @@ -239,6 +241,13 @@ int main(void) { rf_path_init(&rf_path); unsigned int phase = 0; + + unsigned int blocks_queued = 0; + const uint64_t scan_freq_min = 100000000; + const uint64_t scan_freq_max = 6000000000; + const uint64_t scan_freq_step = 20000000; + uint64_t scan_freq = scan_freq_min; + set_freq(scan_freq); while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) @@ -248,28 +257,41 @@ int main(void) { if ( usb_bulk_buffer_offset >= 16384 && phase == 1 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x0000], - 0x4000, - NULL, NULL - ); + if (blocks_queued == 2) + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x0000], + 0x4000, + NULL, NULL + ); phase = 0; + blocks_queued++; } // Set up IN transfer of buffer 1. if ( usb_bulk_buffer_offset < 16384 && phase == 0 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x4000], - 0x4000, - NULL, NULL - ); + if (blocks_queued == 2) + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x4000], + 0x4000, + NULL, NULL + ); phase = 1; + blocks_queued++; + } + + if (blocks_queued > 2) { + scan_freq += scan_freq_step; + if (scan_freq > scan_freq_max) { + scan_freq = scan_freq_min; + } + set_freq(scan_freq); + blocks_queued = 0; } } From 2e17b7e88494f0e5bdd2244115b37a36938b2bc5 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 21 Jul 2016 18:53:49 +0100 Subject: [PATCH 021/103] Use vendor request to start scan mode --- firmware/hackrf_usb/CMakeLists.txt | 1 + firmware/hackrf_usb/hackrf_usb.c | 15 +++------ firmware/hackrf_usb/usb_api_scan.c | 53 ++++++++++++++++++++++++++++++ firmware/hackrf_usb/usb_api_scan.h | 36 ++++++++++++++++++++ 4 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 firmware/hackrf_usb/usb_api_scan.c create mode 100644 firmware/hackrf_usb/usb_api_scan.h diff --git a/firmware/hackrf_usb/CMakeLists.txt b/firmware/hackrf_usb/CMakeLists.txt index 10ee4ffb..8db83f7f 100644 --- a/firmware/hackrf_usb/CMakeLists.txt +++ b/firmware/hackrf_usb/CMakeLists.txt @@ -42,6 +42,7 @@ set(SRC_M4 usb_api_register.c usb_api_spiflash.c usb_api_transceiver.c + usb_api_scan.c "${PATH_HACKRF_FIRMWARE_COMMON}/usb_queue.c" "${PATH_HACKRF_FIRMWARE_COMMON}/fault_handler.c" "${PATH_HACKRF_FIRMWARE_COMMON}/cpld_jtag.c" diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 394875c4..c5dea94c 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -42,6 +42,7 @@ #include "usb_api_cpld.h" #include "usb_api_register.h" #include "usb_api_spiflash.h" +#include "usb_api_scan.h" #include "usb_api_transceiver.h" #include "sgpio_isr.h" @@ -142,6 +143,7 @@ static const usb_request_handler_fn vendor_request_handler[] = { #endif usb_vendor_request_set_freq_explicit, usb_vendor_request_read_wcid, // USB_WCID_VENDOR_REQ + usb_vendor_request_init_scan, }; static const uint32_t vendor_request_handler_count = @@ -241,13 +243,8 @@ int main(void) { rf_path_init(&rf_path); unsigned int phase = 0; - unsigned int blocks_queued = 0; - const uint64_t scan_freq_min = 100000000; - const uint64_t scan_freq_max = 6000000000; - const uint64_t scan_freq_step = 20000000; - uint64_t scan_freq = scan_freq_min; - set_freq(scan_freq); + while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) @@ -286,11 +283,7 @@ int main(void) { } if (blocks_queued > 2) { - scan_freq += scan_freq_step; - if (scan_freq > scan_freq_max) { - scan_freq = scan_freq_min; - } - set_freq(scan_freq); + scan_callback(); blocks_queued = 0; } } diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c new file mode 100644 index 00000000..376a17f7 --- /dev/null +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -0,0 +1,53 @@ +/* + * Copyright 2016 Mike Walters, Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "usb_api_scan.h" +#include "usb_queue.h" +#include +//#include +#include "tuning.h" + +volatile bool scan_mode = false; +static uint64_t scan_freq; +static uint64_t scan_freq_min; +static uint64_t scan_freq_max; +static uint64_t scan_freq_step; + +usb_request_status_t usb_vendor_request_init_scan( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) +{ + if (stage == USB_TRANSFER_STAGE_SETUP) { + // DGS set scan frequencies here + scan_freq = scan_freq_min; + set_freq(scan_freq); + scan_mode = true; + usb_transfer_schedule_ack(endpoint->in); + } + return USB_REQUEST_STATUS_OK; +} + +void scan_callback(void) { + scan_freq += scan_freq_step; + if (scan_freq > scan_freq_max) { + scan_freq = scan_freq_min; + } + set_freq(scan_freq); +} diff --git a/firmware/hackrf_usb/usb_api_scan.h b/firmware/hackrf_usb/usb_api_scan.h new file mode 100644 index 00000000..3aca5372 --- /dev/null +++ b/firmware/hackrf_usb/usb_api_scan.h @@ -0,0 +1,36 @@ +/* + * Copyright 2016 Mike Walters, Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __USB_API_SCAN_H__ +#define __USB_API_SCAN_H__ + +#include +#include +#include + +extern volatile bool scan_mode; + +usb_request_status_t usb_vendor_request_init_scan( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); + +void scan_callback(void); + +#endif /* __USB_API_SPCAN_H__ */ From 1b8e1d18c55214acfcb8af18508b5e5795f1709b Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Sun, 24 Jul 2016 14:32:55 +0100 Subject: [PATCH 022/103] Add scan mode function separate to main loop --- firmware/hackrf_usb/hackrf_usb.c | 113 ++++------------------ firmware/hackrf_usb/usb_api_scan.c | 81 ++++++++++++++-- firmware/hackrf_usb/usb_api_scan.h | 4 +- firmware/hackrf_usb/usb_api_transceiver.c | 72 ++++++++++++++ firmware/hackrf_usb/usb_api_transceiver.h | 5 + 5 files changed, 171 insertions(+), 104 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index c5dea94c..25dff4ee 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -22,8 +22,6 @@ #include -#include - #include #include @@ -45,73 +43,8 @@ #include "usb_api_scan.h" #include "usb_api_transceiver.h" -#include "sgpio_isr.h" #include "usb_bulk_buffer.h" -static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; - -void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { - baseband_streaming_disable(&sgpio_config); - - usb_endpoint_disable(&usb_endpoint_bulk_in); - usb_endpoint_disable(&usb_endpoint_bulk_out); - - _transceiver_mode = new_transceiver_mode; - - if( _transceiver_mode == TRANSCEIVER_MODE_RX ) { - led_off(LED3); - led_on(LED2); - usb_endpoint_init(&usb_endpoint_bulk_in); - rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_RX); - vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; - } else if (_transceiver_mode == TRANSCEIVER_MODE_TX) { - led_off(LED2); - led_on(LED3); - usb_endpoint_init(&usb_endpoint_bulk_out); - rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_TX); - vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_tx; - } else { - led_off(LED2); - led_off(LED3); - rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_OFF); - vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; - } - - if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { - si5351c_activate_best_clock_source(&clock_gen); - baseband_streaming_enable(&sgpio_config); - } -} - -transceiver_mode_t transceiver_mode(void) { - return _transceiver_mode; -} - -usb_request_status_t usb_vendor_request_set_transceiver_mode( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage -) { - if( stage == USB_TRANSFER_STAGE_SETUP ) { - switch( endpoint->setup.value ) { - case TRANSCEIVER_MODE_OFF: - case TRANSCEIVER_MODE_RX: - case TRANSCEIVER_MODE_TX: - set_transceiver_mode(endpoint->setup.value); - usb_transfer_schedule_ack(endpoint->in); - return USB_REQUEST_STATUS_OK; - case TRANSCEIVER_MODE_CPLD_UPDATE: - usb_endpoint_init(&usb_endpoint_bulk_out); - start_cpld_update = true; - usb_transfer_schedule_ack(endpoint->in); - return USB_REQUEST_STATUS_OK; - default: - return USB_REQUEST_STATUS_STALL; - } - } else { - return USB_REQUEST_STATUS_OK; - } -} - static const usb_request_handler_fn vendor_request_handler[] = { NULL, usb_vendor_request_set_transceiver_mode, @@ -243,50 +176,44 @@ int main(void) { rf_path_init(&rf_path); unsigned int phase = 0; - unsigned int blocks_queued = 0; while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) cpld_update(); + // Check whether we need to initiate scan mode + if (start_scan_mode) + scan_mode(); + // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 && phase == 1 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - if (blocks_queued == 2) - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x0000], - 0x4000, - NULL, NULL - ); + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x0000], + 0x4000, + NULL, NULL + ); phase = 0; - blocks_queued++; } - + // Set up IN transfer of buffer 1. if ( usb_bulk_buffer_offset < 16384 && phase == 0 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - if (blocks_queued == 2) - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x4000], - 0x4000, - NULL, NULL - ); + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x4000], + 0x4000, + NULL, NULL + ); phase = 1; - blocks_queued++; - } - - if (blocks_queued > 2) { - scan_callback(); - blocks_queued = 0; } } - + return 0; } diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 376a17f7..14298996 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -22,32 +22,95 @@ #include "usb_api_scan.h" #include "usb_queue.h" #include -//#include +#include +#include "usb_api_transceiver.h" +#include "usb_bulk_buffer.h" #include "tuning.h" +#include "usb_endpoint.h" -volatile bool scan_mode = false; +#define MIN(x,y) ((x)<(y)?(x):(y)) +#define MAX(x,y) ((x)>(y)?(x):(y)) +#define MIN_FREQ 1000000 +#define MAX_FREQ 6000000000 + +volatile bool start_scan_mode = false; static uint64_t scan_freq; static uint64_t scan_freq_min; static uint64_t scan_freq_max; static uint64_t scan_freq_step; +static inline uint64_t bytes_to_uint64(uint8_t* buf) { + uint64_t tmp = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]; + tmp <<= 32; + tmp |= buf[4] << 24 | buf[5] << 16 | buf[6] << 8 | buf[7]; + return tmp; +} + usb_request_status_t usb_vendor_request_init_scan( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { - if (stage == USB_TRANSFER_STAGE_SETUP) { + uint64_t freqs[3]; + if ((stage == USB_TRANSFER_STAGE_SETUP) && + (endpoint->setup.length == 24)) { // DGS set scan frequencies here + //freq_min = bytes_to_uint64(); + usb_transfer_schedule_block(endpoint->out, &freqs, 3*sizeof(uint64_t), + NULL, NULL); + + scan_freq_min = MAX(MIN_FREQ, freqs[0]); + scan_freq_max = MIN(MAX_FREQ, freqs[1]); + scan_freq_step = freqs[2]; + scan_freq = scan_freq_min; set_freq(scan_freq); - scan_mode = true; + start_scan_mode = true; usb_transfer_schedule_ack(endpoint->in); } return USB_REQUEST_STATUS_OK; } -void scan_callback(void) { - scan_freq += scan_freq_step; - if (scan_freq > scan_freq_max) { - scan_freq = scan_freq_min; +void scan_mode(void) { + unsigned int blocks_queued = 0; + unsigned int phase = 0; + + while(transceiver_mode() != TRANSCEIVER_MODE_OFF) { + // Set up IN transfer of buffer 0. + if ( usb_bulk_buffer_offset >= 16384 + && phase == 1 + && transceiver_mode() != TRANSCEIVER_MODE_OFF) { + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x0000], + 0x4000, + NULL, NULL + ); + phase = 0; + blocks_queued++; } - set_freq(scan_freq); + + // Set up IN transfer of buffer 1. + if ( usb_bulk_buffer_offset < 16384 + && phase == 0 + && transceiver_mode() != TRANSCEIVER_MODE_OFF) { + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x4000], + 0x4000, + NULL, NULL + ); + phase = 1; + blocks_queued++; + } + + if (blocks_queued > 2) { + scan_freq += scan_freq_step; + if (scan_freq > scan_freq_max) { + scan_freq = scan_freq_min; + } + set_freq(scan_freq); + blocks_queued = 0; + } + } } diff --git a/firmware/hackrf_usb/usb_api_scan.h b/firmware/hackrf_usb/usb_api_scan.h index 3aca5372..be066612 100644 --- a/firmware/hackrf_usb/usb_api_scan.h +++ b/firmware/hackrf_usb/usb_api_scan.h @@ -26,11 +26,11 @@ #include #include -extern volatile bool scan_mode; +extern volatile bool start_scan_mode; usb_request_status_t usb_vendor_request_init_scan( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); -void scan_callback(void); +void scan_mode(void); #endif /* __USB_API_SPCAN_H__ */ diff --git a/firmware/hackrf_usb/usb_api_transceiver.c b/firmware/hackrf_usb/usb_api_transceiver.c index e8bac410..d86de7db 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.c +++ b/firmware/hackrf_usb/usb_api_transceiver.c @@ -22,9 +22,16 @@ #include "usb_api_transceiver.h" +#include +#include +#include "sgpio_isr.h" + +#include "usb_api_cpld.h" // Remove when CPLD update is handled elsewhere + #include #include #include +#include #include #include @@ -221,3 +228,68 @@ usb_request_status_t usb_vendor_request_set_freq_explicit( return USB_REQUEST_STATUS_OK; } } + +static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; + + +transceiver_mode_t transceiver_mode(void) { + return _transceiver_mode; +} + +void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { + baseband_streaming_disable(&sgpio_config); + + usb_endpoint_disable(&usb_endpoint_bulk_in); + usb_endpoint_disable(&usb_endpoint_bulk_out); + + _transceiver_mode = new_transceiver_mode; + + if( _transceiver_mode == TRANSCEIVER_MODE_RX ) { + led_off(LED3); + led_on(LED2); + usb_endpoint_init(&usb_endpoint_bulk_in); + rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_RX); + vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; + } else if (_transceiver_mode == TRANSCEIVER_MODE_TX) { + led_off(LED2); + led_on(LED3); + usb_endpoint_init(&usb_endpoint_bulk_out); + rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_TX); + vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_tx; + } else { + led_off(LED2); + led_off(LED3); + rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_OFF); + vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; + } + + if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { + si5351c_activate_best_clock_source(&clock_gen); + baseband_streaming_enable(&sgpio_config); + } +} + +usb_request_status_t usb_vendor_request_set_transceiver_mode( + usb_endpoint_t* const endpoint, + const usb_transfer_stage_t stage +) { + if( stage == USB_TRANSFER_STAGE_SETUP ) { + switch( endpoint->setup.value ) { + case TRANSCEIVER_MODE_OFF: + case TRANSCEIVER_MODE_RX: + case TRANSCEIVER_MODE_TX: + set_transceiver_mode(endpoint->setup.value); + usb_transfer_schedule_ack(endpoint->in); + return USB_REQUEST_STATUS_OK; + case TRANSCEIVER_MODE_CPLD_UPDATE: + usb_endpoint_init(&usb_endpoint_bulk_out); + start_cpld_update = true; + usb_transfer_schedule_ack(endpoint->in); + return USB_REQUEST_STATUS_OK; + default: + return USB_REQUEST_STATUS_STALL; + } + } else { + return USB_REQUEST_STATUS_OK; + } +} \ No newline at end of file diff --git a/firmware/hackrf_usb/usb_api_transceiver.h b/firmware/hackrf_usb/usb_api_transceiver.h index 24244025..59f85778 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.h +++ b/firmware/hackrf_usb/usb_api_transceiver.h @@ -53,4 +53,9 @@ usb_request_status_t usb_vendor_request_set_antenna_enable( usb_request_status_t usb_vendor_request_set_freq_explicit( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); +transceiver_mode_t transceiver_mode(void); +void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode); +usb_request_status_t usb_vendor_request_set_transceiver_mode( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); + #endif/*__USB_API_TRANSCEIVER_H__*/ From 97c317e9a47865f9c276be8135f9cffba80f5d5a Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sun, 24 Jul 2016 17:48:06 +0100 Subject: [PATCH 023/103] Add init_scan call to libhackrf --- firmware/hackrf_usb/usb_api_scan.c | 21 ++++++++-------- host/libhackrf/src/hackrf.c | 40 ++++++++++++++++++++++++++++++ host/libhackrf/src/hackrf.h | 4 +++ 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 14298996..9b160dec 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -39,27 +39,26 @@ static uint64_t scan_freq_min; static uint64_t scan_freq_max; static uint64_t scan_freq_step; -static inline uint64_t bytes_to_uint64(uint8_t* buf) { - uint64_t tmp = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]; - tmp <<= 32; - tmp |= buf[4] << 24 | buf[5] << 16 | buf[6] << 8 | buf[7]; - return tmp; -} +struct init_scan_params { + uint64_t min_freq_hz; + uint64_t max_freq_hz; + uint64_t step_freq_hz; +}; +struct init_scan_params scan_params; usb_request_status_t usb_vendor_request_init_scan( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { - uint64_t freqs[3]; if ((stage == USB_TRANSFER_STAGE_SETUP) && (endpoint->setup.length == 24)) { // DGS set scan frequencies here //freq_min = bytes_to_uint64(); - usb_transfer_schedule_block(endpoint->out, &freqs, 3*sizeof(uint64_t), + usb_transfer_schedule_block(endpoint->out, &scan_params, sizeof(struct init_scan_params), NULL, NULL); - scan_freq_min = MAX(MIN_FREQ, freqs[0]); - scan_freq_max = MIN(MAX_FREQ, freqs[1]); - scan_freq_step = freqs[2]; + scan_freq_min = MAX(MIN_FREQ, scan_params.min_freq_hz); + scan_freq_max = MIN(MAX_FREQ, scan_params.max_freq_hz); + scan_freq_step = scan_params.step_freq_hz; scan_freq = scan_freq_min; set_freq(scan_freq); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index a759fb3a..81f91ec7 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -67,6 +67,8 @@ typedef enum { HACKRF_VENDOR_REQUEST_SET_TXVGA_GAIN = 21, HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23, HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, + // USB_WCID_VENDOR_REQ = 25 + HACKRF_VENDOR_REQUEST_INIT_SCAN = 26, } hackrf_vendor_request; typedef enum { @@ -1695,6 +1697,44 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) return p->bandwidth_hz; } +struct init_scan_params { + uint64_t min_freq_hz; + uint64_t max_freq_hz; + uint64_t step_freq_hz; +}; + +int ADDCALL hackrf_init_scan(hackrf_device* device, + const uint64_t min_freq_hz, const uint64_t max_freq_hz, + const uint64_t step_freq_hz) +{ + struct init_scan_params params; + uint8_t length; + int result; + + params.min_freq_hz = TO_LE(min_freq_hz); + params.max_freq_hz = TO_LE(max_freq_hz); + params.step_freq_hz = TO_LE(step_freq_hz); + length = sizeof(struct init_scan_params); + + result = libusb_control_transfer( + device->usb_device, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + HACKRF_VENDOR_REQUEST_INIT_SCAN, + 0, + 0, + (unsigned char*)¶ms, + length, + 0 + ); + + if (result < length) + { + return HACKRF_ERROR_LIBUSB; + } else { + return HACKRF_SUCCESS; + } +} + #ifdef __cplusplus } // __cplusplus defined. #endif diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 7ac0530f..48c192c7 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -196,6 +196,10 @@ extern ADDAPI const char* ADDCALL hackrf_filter_path_name(const enum rf_path_fil extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw_round_down_lt(const uint32_t bandwidth_hz); /* Compute best default value depending on sample rate (auto filter) */ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz); +/* Start scan mode */ +extern ADDAPI int ADDCALL hackrf_init_scan(hackrf_device* device, + const uint64_t min_freq_hz, const uint64_t max_freq_hz, + const uint64_t step_freq_hz); #ifdef __cplusplus } // __cplusplus defined. From d19b4efa2e96ee793da7109a804e619254ea4649 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Mon, 25 Jul 2016 22:57:13 +0100 Subject: [PATCH 024/103] Only transfer one block per re-tune --- firmware/hackrf_usb/usb_api_scan.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 9b160dec..60e4b7c6 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -77,13 +77,14 @@ void scan_mode(void) { if ( usb_bulk_buffer_offset >= 16384 && phase == 1 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x0000], - 0x4000, - NULL, NULL - ); + if (blocks_queued == 2) + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x0000], + 0x4000, + NULL, NULL + ); phase = 0; blocks_queued++; } @@ -92,13 +93,14 @@ void scan_mode(void) { if ( usb_bulk_buffer_offset < 16384 && phase == 0 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x4000], - 0x4000, - NULL, NULL - ); + if (blocks_queued == 2) + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x4000], + 0x4000, + NULL, NULL + ); phase = 1; blocks_queued++; } From 8c96d9cf326c9477795150053742faa3298f5ee5 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 26 Jul 2016 15:29:13 +0100 Subject: [PATCH 025/103] Change granularity of scan mode to MHz --- firmware/hackrf_usb/usb_api_scan.c | 42 ++++++++++++++---------------- host/libhackrf/src/hackrf.c | 16 ++++++------ host/libhackrf/src/hackrf.h | 4 +-- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 60e4b7c6..d5377198 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -30,19 +30,17 @@ #define MIN(x,y) ((x)<(y)?(x):(y)) #define MAX(x,y) ((x)>(y)?(x):(y)) -#define MIN_FREQ 1000000 -#define MAX_FREQ 6000000000 +#define FREQ_GRANULARITY 1000000 +#define MIN_FREQ 1 +#define MAX_FREQ 6000 volatile bool start_scan_mode = false; static uint64_t scan_freq; -static uint64_t scan_freq_min; -static uint64_t scan_freq_max; -static uint64_t scan_freq_step; struct init_scan_params { - uint64_t min_freq_hz; - uint64_t max_freq_hz; - uint64_t step_freq_hz; + uint16_t min_freq_mhz; + uint16_t max_freq_mhz; + uint16_t step_freq_mhz; }; struct init_scan_params scan_params; @@ -51,17 +49,17 @@ usb_request_status_t usb_vendor_request_init_scan( { if ((stage == USB_TRANSFER_STAGE_SETUP) && (endpoint->setup.length == 24)) { - // DGS set scan frequencies here - //freq_min = bytes_to_uint64(); - usb_transfer_schedule_block(endpoint->out, &scan_params, sizeof(struct init_scan_params), + + usb_transfer_schedule_block(endpoint->out, &scan_params, + sizeof(struct init_scan_params), NULL, NULL); - - scan_freq_min = MAX(MIN_FREQ, scan_params.min_freq_hz); - scan_freq_max = MIN(MAX_FREQ, scan_params.max_freq_hz); - scan_freq_step = scan_params.step_freq_hz; - - scan_freq = scan_freq_min; - set_freq(scan_freq); + + /* Limit to min/max frequency without warning (possible FIXME) */ + scan_params.min_freq_mhz = MAX(MIN_FREQ, scan_params.min_freq_mhz); + scan_params.max_freq_mhz = MIN(MAX_FREQ, scan_params.max_freq_mhz); + + scan_freq = scan_params.min_freq_mhz; + set_freq(scan_freq*FREQ_GRANULARITY); start_scan_mode = true; usb_transfer_schedule_ack(endpoint->in); } @@ -106,11 +104,11 @@ void scan_mode(void) { } if (blocks_queued > 2) { - scan_freq += scan_freq_step; - if (scan_freq > scan_freq_max) { - scan_freq = scan_freq_min; + scan_freq += scan_params.step_freq_mhz; + if (scan_freq > scan_params.max_freq_mhz) { + scan_freq = scan_params.min_freq_mhz; } - set_freq(scan_freq); + set_freq(scan_freq*FREQ_GRANULARITY); blocks_queued = 0; } } diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 81f91ec7..b16763bc 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1698,22 +1698,22 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) } struct init_scan_params { - uint64_t min_freq_hz; - uint64_t max_freq_hz; - uint64_t step_freq_hz; + uint16_t min_freq_mhz; + uint16_t max_freq_mhz; + uint16_t step_freq_mhz; }; int ADDCALL hackrf_init_scan(hackrf_device* device, - const uint64_t min_freq_hz, const uint64_t max_freq_hz, - const uint64_t step_freq_hz) + const uint16_t min_freq_mhz, const uint16_t max_freq_mhz, + const uint16_t step_freq_mhz) { struct init_scan_params params; uint8_t length; int result; - params.min_freq_hz = TO_LE(min_freq_hz); - params.max_freq_hz = TO_LE(max_freq_hz); - params.step_freq_hz = TO_LE(step_freq_hz); + params.min_freq_mhz = TO_LE(min_freq_mhz); + params.max_freq_mhz = TO_LE(max_freq_mhz); + params.step_freq_mhz = TO_LE(step_freq_mhz); length = sizeof(struct init_scan_params); result = libusb_control_transfer( diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 48c192c7..fb0a4853 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -198,8 +198,8 @@ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw_round_down_lt(c extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz); /* Start scan mode */ extern ADDAPI int ADDCALL hackrf_init_scan(hackrf_device* device, - const uint64_t min_freq_hz, const uint64_t max_freq_hz, - const uint64_t step_freq_hz); + const uint16_t min_freq_mhz, const uint16_t max_freq_mhz, + const uint16_t step_freq_mhz); #ifdef __cplusplus } // __cplusplus defined. From 0245204ad9130d50924b5aa175337dd0b6fa2074 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 26 Jul 2016 19:13:36 +0100 Subject: [PATCH 026/103] Add initial hackrf_scan skeleton --- host/hackrf-tools/src/CMakeLists.txt | 4 + host/hackrf-tools/src/hackrf_scan.c | 528 +++++++++++++++++++++++++++ 2 files changed, 532 insertions(+) create mode 100644 host/hackrf-tools/src/hackrf_scan.c diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index 373e36b4..a3a56e4c 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -50,6 +50,9 @@ install(TARGETS hackrf_cpldjtag RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) add_executable(hackrf_info hackrf_info.c) install(TARGETS hackrf_info RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) +add_executable(hackrf_scan hackrf_scan.c) +install(TARGETS hackrf_scan RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) + if(NOT libhackrf_SOURCE_DIR) include_directories(${LIBHACKRF_INCLUDE_DIR}) LIST(APPEND TOOLS_LINK_LIBS ${LIBHACKRF_LIBRARIES}) @@ -69,3 +72,4 @@ target_link_libraries(hackrf_rffc5071 ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_spiflash ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_cpldjtag ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_info ${TOOLS_LINK_LIBS}) +target_link_libraries(hackrf_scan ${TOOLS_LINK_LIBS}) diff --git a/host/hackrf-tools/src/hackrf_scan.c b/host/hackrf-tools/src/hackrf_scan.c new file mode 100644 index 00000000..45c6c0ee --- /dev/null +++ b/host/hackrf-tools/src/hackrf_scan.c @@ -0,0 +1,528 @@ +/* + * Copyright 2016 Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifndef bool +typedef int bool; +#define true 1 +#define false 0 +#endif + +#ifdef _WIN32 +#include + +#ifdef _MSC_VER + +#ifdef _WIN64 +typedef int64_t ssize_t; +#else +typedef int32_t ssize_t; +#endif + +#define strtoull _strtoui64 +#define snprintf _snprintf + +int gettimeofday(struct timeval *tv, void* ignored) { + FILETIME ft; + unsigned __int64 tmp = 0; + if (NULL != tv) { + GetSystemTimeAsFileTime(&ft); + tmp |= ft.dwHighDateTime; + tmp <<= 32; + tmp |= ft.dwLowDateTime; + tmp /= 10; + tmp -= 11644473600000000Ui64; + tv->tv_sec = (long)(tmp / 1000000UL); + tv->tv_usec = (long)(tmp % 1000000UL); + } + return 0; +} + +#endif +#endif + +#if defined(__GNUC__) +#include +#include +#endif + +#include + +#define FD_BUFFER_SIZE (8*1024) + +#define FREQ_ONE_MHZ (1000000ull) + +#define FREQ_MIN_HZ (0ull) /* 0 Hz */ +#define FREQ_MAX_HZ (7250000000ull) /* 7250MHz */ + +#define DEFAULT_SAMPLE_RATE_HZ (20000000) /* 20MHz default sample rate */ +#define DEFAULT_BASEBAND_FILTER_BANDWIDTH (15000000) /* 5MHz default */ + +#if defined _WIN32 + #define sleep(a) Sleep( (a*1000) ) +#endif + +#define U64TOA_MAX_DIGIT (31) +typedef struct +{ + char data[U64TOA_MAX_DIGIT+1]; +} t_u64toa; + +t_u64toa ascii_u64_data1; +t_u64toa ascii_u64_data2; + +static float +TimevalDiff(const struct timeval *a, const struct timeval *b) +{ + return (a->tv_sec - b->tv_sec) + 1e-6f * (a->tv_usec - b->tv_usec); +} + +int parse_u64(char* s, uint64_t* const value) { + uint_fast8_t base = 10; + char* s_end; + uint64_t u64_value; + + if( strlen(s) > 2 ) { + if( s[0] == '0' ) { + if( (s[1] == 'x') || (s[1] == 'X') ) { + base = 16; + s += 2; + } else if( (s[1] == 'b') || (s[1] == 'B') ) { + base = 2; + s += 2; + } + } + } + + s_end = s; + u64_value = strtoull(s, &s_end, base); + if( (s != s_end) && (*s_end == 0) ) { + *value = u64_value; + return HACKRF_SUCCESS; + } else { + return HACKRF_ERROR_INVALID_PARAM; + } +} + +int parse_u32(char* s, uint32_t* const value) { + uint_fast8_t base = 10; + char* s_end; + uint64_t ulong_value; + + if( strlen(s) > 2 ) { + if( s[0] == '0' ) { + if( (s[1] == 'x') || (s[1] == 'X') ) { + base = 16; + s += 2; + } else if( (s[1] == 'b') || (s[1] == 'B') ) { + base = 2; + s += 2; + } + } + } + + s_end = s; + ulong_value = strtoul(s, &s_end, base); + if( (s != s_end) && (*s_end == 0) ) { + *value = (uint32_t)ulong_value; + return HACKRF_SUCCESS; + } else { + return HACKRF_ERROR_INVALID_PARAM; + } +} + + +static char *stringrev(char *str) +{ + char *p1, *p2; + + if(! str || ! *str) + return str; + + for(p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) + { + *p1 ^= *p2; + *p2 ^= *p1; + *p1 ^= *p2; + } + return str; +} + +char* u64toa(uint64_t val, t_u64toa* str) +{ + #define BASE (10ull) /* Base10 by default */ + uint64_t sum; + int pos; + int digit; + int max_len; + char* res; + + sum = val; + max_len = U64TOA_MAX_DIGIT; + pos = 0; + + do + { + digit = (sum % BASE); + str->data[pos] = digit + '0'; + pos++; + + sum /= BASE; + }while( (sum>0) && (pos < max_len) ); + + if( (pos == max_len) && (sum>0) ) + return NULL; + + str->data[pos] = '\0'; + res = stringrev(str->data); + + return res; +} + +volatile bool do_exit = false; + +FILE* fd = NULL; +volatile uint32_t byte_count = 0; + +struct timeval time_start; +struct timeval t_start; + +bool amp = false; +uint32_t amp_enable; + +bool antenna = false; +uint32_t antenna_enable; + +bool sample_rate = false; +uint32_t sample_rate_hz; + +int rx_callback(hackrf_transfer* transfer) { + /* This is where we need to do interesting things with the samples + * FFT + * Throw away unused bins + * write output to pipe + */ + ssize_t bytes_to_write; + ssize_t bytes_written; + + if( fd != NULL ) + { + byte_count += transfer->valid_length; + bytes_to_write = transfer->valid_length; + + bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); + if (bytes_written != bytes_to_write) { + return -1; + } else { + return 0; + } + } else { + return -1; + } +} + +static void usage() { + printf("Usage:\n"); + printf("\t[-d serial_number] # Serial number of desired HackRF.\n"); + printf("\t[-a amp_enable] # RX/TX RF amplifier 1=Enable, 0=Disable.\n"); + printf("\t[-p antenna_enable] # Antenna port power, 1=Enable, 0=Disable.\n"); + printf("\t[-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps\n"); + printf("\t[-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps\n"); + printf("\t[-x gain_db] # TX VGA (IF) gain, 0-47dB, 1dB steps\n"); +} + +static hackrf_device* device = NULL; + +#ifdef _MSC_VER +BOOL WINAPI +sighandler(int signum) { + if (CTRL_C_EVENT == signum) { + fprintf(stdout, "Caught signal %d\n", signum); + do_exit = true; + return TRUE; + } + return FALSE; +} +#else +void sigint_callback_handler(int signum) { + fprintf(stdout, "Caught signal %d\n", signum); + do_exit = true; +} +#endif + +#define PATH_FILE_MAX_LEN (FILENAME_MAX) +#define DATE_TIME_MAX_LEN (32) + +int main(int argc, char** argv) { + int opt; + const char* path = "/dev/null"; + const char* serial_number = NULL; + int result; + int exit_code = EXIT_SUCCESS; + struct timeval t_end; + float time_diff; + unsigned int lna_gain=8, vga_gain=20, txvga_gain=0; + + while( (opt = getopt(argc, argv, "a:p:l:g:x:d:")) != EOF ) + { + result = HACKRF_SUCCESS; + switch( opt ) + { + case 'd': + serial_number = optarg; + break; + + case 'a': + amp = true; + result = parse_u32(optarg, &_enable); + break; + + case 'p': + antenna = true; + result = parse_u32(optarg, &antenna_enable); + break; + + case 'l': + result = parse_u32(optarg, &lna_gain); + break; + + case 'g': + result = parse_u32(optarg, &vga_gain); + break; + + case 'x': + result = parse_u32(optarg, &txvga_gain); + break; + + default: + printf("unknown argument '-%c %s'\n", opt, optarg); + usage(); + return EXIT_FAILURE; + } + + if( result != HACKRF_SUCCESS ) { + printf("argument error: '-%c %s' %s (%d)\n", opt, optarg, hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + } + + if (lna_gain % 8) + printf("warning: lna_gain (-l) must be a multiple of 8\n"); + + if (vga_gain % 2) + printf("warning: vga_gain (-g) must be a multiple of 2\n"); + + if( amp ) { + if( amp_enable > 1 ) { + printf("argument error: amp_enable shall be 0 or 1.\n"); + usage(); + return EXIT_FAILURE; + } + } + + if (antenna) { + if (antenna_enable > 1) { + printf("argument error: antenna_enable shall be 0 or 1.\n"); + usage(); + return EXIT_FAILURE; + } + } + + result = hackrf_init(); + if( result != HACKRF_SUCCESS ) { + printf("hackrf_init() failed: %s (%d)\n", hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + + result = hackrf_open_by_serial(serial_number, &device); + if( result != HACKRF_SUCCESS ) { + printf("hackrf_open() failed: %s (%d)\n", hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + + fd = fopen(path, "wb"); + if( fd == NULL ) { + printf("Failed to open file: %s\n", path); + return EXIT_FAILURE; + } + /* Change fd buffer to have bigger one to store or read data on/to HDD */ + result = setvbuf(fd , NULL , _IOFBF , FD_BUFFER_SIZE); + if( result != 0 ) { + printf("setvbuf() failed: %d\n", result); + usage(); + return EXIT_FAILURE; + } + +#ifdef _MSC_VER + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#else + signal(SIGINT, &sigint_callback_handler); + signal(SIGILL, &sigint_callback_handler); + signal(SIGFPE, &sigint_callback_handler); + signal(SIGSEGV, &sigint_callback_handler); + signal(SIGTERM, &sigint_callback_handler); + signal(SIGABRT, &sigint_callback_handler); +#endif + printf("call hackrf_sample_rate_set(%.03f MHz)\n", + ((float)DEFAULT_SAMPLE_RATE_HZ/(float)FREQ_ONE_MHZ)); + result = hackrf_set_sample_rate_manual(device, DEFAULT_SAMPLE_RATE_HZ, 1); + if( result != HACKRF_SUCCESS ) { + printf("hackrf_sample_rate_set() failed: %s (%d)\n", + hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + + printf("call hackrf_baseband_filter_bandwidth_set(%.03f MHz)\n", + ((float)DEFAULT_BASEBAND_FILTER_BANDWIDTH/(float)FREQ_ONE_MHZ)); + result = hackrf_set_baseband_filter_bandwidth(device, DEFAULT_BASEBAND_FILTER_BANDWIDTH); + if( result != HACKRF_SUCCESS ) { + printf("hackrf_baseband_filter_bandwidth_set() failed: %s (%d)\n", + hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + + result = hackrf_set_vga_gain(device, vga_gain); + result |= hackrf_set_lna_gain(device, lna_gain); + result |= hackrf_start_rx(device, rx_callback, NULL); + if (result != HACKRF_SUCCESS) { + printf("hackrf_start_?x() failed: %s (%d)\n", hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + + /* DGS FIXME: allow upper and lower frequencies to be set */ + result = hackrf_init_scan(device, 50, 6000, 10); + if( result != HACKRF_SUCCESS ) { + printf("hackrf_init_scan() failed: %s (%d)\n", + hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + + if (amp) { + printf("call hackrf_set_amp_enable(%u)\n", amp_enable); + result = hackrf_set_amp_enable(device, (uint8_t)amp_enable); + if (result != HACKRF_SUCCESS) { + printf("hackrf_set_amp_enable() failed: %s (%d)\n", + hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + } + + if (antenna) { + printf("call hackrf_set_antenna_enable(%u)\n", antenna_enable); + result = hackrf_set_antenna_enable(device, (uint8_t)antenna_enable); + if (result != HACKRF_SUCCESS) { + printf("hackrf_set_antenna_enable() failed: %s (%d)\n", + hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + } + + gettimeofday(&t_start, NULL); + gettimeofday(&time_start, NULL); + + printf("Stop with Ctrl-C\n"); + while((hackrf_is_streaming(device) == HACKRF_TRUE) && (do_exit == false)) { + uint32_t byte_count_now; + struct timeval time_now; + float time_difference, rate; + sleep(1); + + gettimeofday(&time_now, NULL); + + byte_count_now = byte_count; + byte_count = 0; + + time_difference = TimevalDiff(&time_now, &time_start); + rate = (float)byte_count_now / time_difference; + printf("%4.1f MiB / %5.3f sec = %4.1f MiB/second\n", + (byte_count_now / 1e6f), time_difference, (rate / 1e6f) ); + + time_start = time_now; + + if (byte_count_now == 0) { + exit_code = EXIT_FAILURE; + printf("\nCouldn't transfer any bytes for one second.\n"); + break; + } + } + + result = hackrf_is_streaming(device); + if (do_exit) { + printf("\nUser cancel, exiting...\n"); + } else { + printf("\nExiting... hackrf_is_streaming() result: %s (%d)\n", + hackrf_error_name(result), result); + } + + gettimeofday(&t_end, NULL); + time_diff = TimevalDiff(&t_end, &t_start); + printf("Total time: %5.5f s\n", time_diff); + + if(device != NULL) { + result = hackrf_stop_rx(device); + if(result != HACKRF_SUCCESS) { + printf("hackrf_stop_rx() failed: %s (%d)\n", + hackrf_error_name(result), result); + } else { + printf("hackrf_stop_rx() done\n"); + } + + result = hackrf_close(device); + if(result != HACKRF_SUCCESS) { + printf("hackrf_close() failed: %s (%d)\n", + hackrf_error_name(result), result); + } else { + printf("hackrf_close() done\n"); + } + + hackrf_exit(); + printf("hackrf_exit() done\n"); + } + + if(fd != NULL) { + fclose(fd); + fd = NULL; + printf("fclose(fd) done\n"); + } + printf("exit\n"); + return exit_code; +} From 9b375a17eab86978bda6a3883474026452d7405f Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Tue, 26 Jul 2016 21:05:21 +0100 Subject: [PATCH 027/103] Fix init_scan request length --- firmware/hackrf_usb/usb_api_scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index d5377198..1cba69d8 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -48,7 +48,7 @@ usb_request_status_t usb_vendor_request_init_scan( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if ((stage == USB_TRANSFER_STAGE_SETUP) && - (endpoint->setup.length == 24)) { + (endpoint->setup.length == 6)) { usb_transfer_schedule_block(endpoint->out, &scan_params, sizeof(struct init_scan_params), From c96156476f44227e2547f3f7171db72afe01ca9b Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Tue, 26 Jul 2016 21:51:00 +0100 Subject: [PATCH 028/103] Switch all output from stdout to stderr to allow for piping samples --- host/hackrf-tools/src/hackrf_scan.c | 84 ++++++++++++++--------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_scan.c b/host/hackrf-tools/src/hackrf_scan.c index 45c6c0ee..20884665 100644 --- a/host/hackrf-tools/src/hackrf_scan.c +++ b/host/hackrf-tools/src/hackrf_scan.c @@ -252,13 +252,13 @@ int rx_callback(hackrf_transfer* transfer) { } static void usage() { - printf("Usage:\n"); - printf("\t[-d serial_number] # Serial number of desired HackRF.\n"); - printf("\t[-a amp_enable] # RX/TX RF amplifier 1=Enable, 0=Disable.\n"); - printf("\t[-p antenna_enable] # Antenna port power, 1=Enable, 0=Disable.\n"); - printf("\t[-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps\n"); - printf("\t[-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps\n"); - printf("\t[-x gain_db] # TX VGA (IF) gain, 0-47dB, 1dB steps\n"); + fprintf(stderr, "Usage:\n"); + fprintf(stderr, "\t[-d serial_number] # Serial number of desired HackRF.\n"); + fprintf(stderr, "\t[-a amp_enable] # RX/TX RF amplifier 1=Enable, 0=Disable.\n"); + fprintf(stderr, "\t[-p antenna_enable] # Antenna port power, 1=Enable, 0=Disable.\n"); + 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"); } static hackrf_device* device = NULL; @@ -267,7 +267,7 @@ static hackrf_device* device = NULL; BOOL WINAPI sighandler(int signum) { if (CTRL_C_EVENT == signum) { - fprintf(stdout, "Caught signal %d\n", signum); + fprintf(stderr, "Caught signal %d\n", signum); do_exit = true; return TRUE; } @@ -275,7 +275,7 @@ sighandler(int signum) { } #else void sigint_callback_handler(int signum) { - fprintf(stdout, "Caught signal %d\n", signum); + fprintf(stderr, "Caught signal %d\n", signum); do_exit = true; } #endif @@ -325,27 +325,27 @@ int main(int argc, char** argv) { break; default: - printf("unknown argument '-%c %s'\n", opt, optarg); + fprintf(stderr, "unknown argument '-%c %s'\n", opt, optarg); usage(); return EXIT_FAILURE; } if( result != HACKRF_SUCCESS ) { - printf("argument error: '-%c %s' %s (%d)\n", opt, optarg, hackrf_error_name(result), result); + fprintf(stderr, "argument error: '-%c %s' %s (%d)\n", opt, optarg, hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } } if (lna_gain % 8) - printf("warning: lna_gain (-l) must be a multiple of 8\n"); + fprintf(stderr, "warning: lna_gain (-l) must be a multiple of 8\n"); if (vga_gain % 2) - printf("warning: vga_gain (-g) must be a multiple of 2\n"); + fprintf(stderr, "warning: vga_gain (-g) must be a multiple of 2\n"); if( amp ) { if( amp_enable > 1 ) { - printf("argument error: amp_enable shall be 0 or 1.\n"); + fprintf(stderr, "argument error: amp_enable shall be 0 or 1.\n"); usage(); return EXIT_FAILURE; } @@ -353,7 +353,7 @@ int main(int argc, char** argv) { if (antenna) { if (antenna_enable > 1) { - printf("argument error: antenna_enable shall be 0 or 1.\n"); + fprintf(stderr, "argument error: antenna_enable shall be 0 or 1.\n"); usage(); return EXIT_FAILURE; } @@ -361,27 +361,27 @@ int main(int argc, char** argv) { result = hackrf_init(); if( result != HACKRF_SUCCESS ) { - printf("hackrf_init() failed: %s (%d)\n", hackrf_error_name(result), result); + fprintf(stderr, "hackrf_init() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } result = hackrf_open_by_serial(serial_number, &device); if( result != HACKRF_SUCCESS ) { - printf("hackrf_open() failed: %s (%d)\n", hackrf_error_name(result), result); + fprintf(stderr, "hackrf_open() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } fd = fopen(path, "wb"); if( fd == NULL ) { - printf("Failed to open file: %s\n", path); + fprintf(stderr, "Failed to open file: %s\n", path); return EXIT_FAILURE; } /* Change fd buffer to have bigger one to store or read data on/to HDD */ result = setvbuf(fd , NULL , _IOFBF , FD_BUFFER_SIZE); if( result != 0 ) { - printf("setvbuf() failed: %d\n", result); + fprintf(stderr, "setvbuf() failed: %d\n", result); usage(); return EXIT_FAILURE; } @@ -396,21 +396,21 @@ int main(int argc, char** argv) { signal(SIGTERM, &sigint_callback_handler); signal(SIGABRT, &sigint_callback_handler); #endif - printf("call hackrf_sample_rate_set(%.03f MHz)\n", + fprintf(stderr, "call hackrf_sample_rate_set(%.03f MHz)\n", ((float)DEFAULT_SAMPLE_RATE_HZ/(float)FREQ_ONE_MHZ)); result = hackrf_set_sample_rate_manual(device, DEFAULT_SAMPLE_RATE_HZ, 1); if( result != HACKRF_SUCCESS ) { - printf("hackrf_sample_rate_set() failed: %s (%d)\n", + fprintf(stderr, "hackrf_sample_rate_set() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } - printf("call hackrf_baseband_filter_bandwidth_set(%.03f MHz)\n", + fprintf(stderr, "call hackrf_baseband_filter_bandwidth_set(%.03f MHz)\n", ((float)DEFAULT_BASEBAND_FILTER_BANDWIDTH/(float)FREQ_ONE_MHZ)); result = hackrf_set_baseband_filter_bandwidth(device, DEFAULT_BASEBAND_FILTER_BANDWIDTH); if( result != HACKRF_SUCCESS ) { - printf("hackrf_baseband_filter_bandwidth_set() failed: %s (%d)\n", + fprintf(stderr, "hackrf_baseband_filter_bandwidth_set() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; @@ -420,7 +420,7 @@ int main(int argc, char** argv) { result |= hackrf_set_lna_gain(device, lna_gain); result |= hackrf_start_rx(device, rx_callback, NULL); if (result != HACKRF_SUCCESS) { - printf("hackrf_start_?x() failed: %s (%d)\n", hackrf_error_name(result), result); + fprintf(stderr, "hackrf_start_?x() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } @@ -428,17 +428,17 @@ int main(int argc, char** argv) { /* DGS FIXME: allow upper and lower frequencies to be set */ result = hackrf_init_scan(device, 50, 6000, 10); if( result != HACKRF_SUCCESS ) { - printf("hackrf_init_scan() failed: %s (%d)\n", + fprintf(stderr, "hackrf_init_scan() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } if (amp) { - printf("call hackrf_set_amp_enable(%u)\n", amp_enable); + fprintf(stderr, "call hackrf_set_amp_enable(%u)\n", amp_enable); result = hackrf_set_amp_enable(device, (uint8_t)amp_enable); if (result != HACKRF_SUCCESS) { - printf("hackrf_set_amp_enable() failed: %s (%d)\n", + fprintf(stderr, "hackrf_set_amp_enable() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; @@ -446,10 +446,10 @@ int main(int argc, char** argv) { } if (antenna) { - printf("call hackrf_set_antenna_enable(%u)\n", antenna_enable); + fprintf(stderr, "call hackrf_set_antenna_enable(%u)\n", antenna_enable); result = hackrf_set_antenna_enable(device, (uint8_t)antenna_enable); if (result != HACKRF_SUCCESS) { - printf("hackrf_set_antenna_enable() failed: %s (%d)\n", + fprintf(stderr, "hackrf_set_antenna_enable() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; @@ -459,7 +459,7 @@ int main(int argc, char** argv) { gettimeofday(&t_start, NULL); gettimeofday(&time_start, NULL); - printf("Stop with Ctrl-C\n"); + fprintf(stderr, "Stop with Ctrl-C\n"); while((hackrf_is_streaming(device) == HACKRF_TRUE) && (do_exit == false)) { uint32_t byte_count_now; struct timeval time_now; @@ -473,56 +473,56 @@ int main(int argc, char** argv) { time_difference = TimevalDiff(&time_now, &time_start); rate = (float)byte_count_now / time_difference; - printf("%4.1f MiB / %5.3f sec = %4.1f MiB/second\n", + fprintf(stderr, "%4.1f MiB / %5.3f sec = %4.1f MiB/second\n", (byte_count_now / 1e6f), time_difference, (rate / 1e6f) ); time_start = time_now; if (byte_count_now == 0) { exit_code = EXIT_FAILURE; - printf("\nCouldn't transfer any bytes for one second.\n"); + fprintf(stderr, "\nCouldn't transfer any bytes for one second.\n"); break; } } result = hackrf_is_streaming(device); if (do_exit) { - printf("\nUser cancel, exiting...\n"); + fprintf(stderr, "\nUser cancel, exiting...\n"); } else { - printf("\nExiting... hackrf_is_streaming() result: %s (%d)\n", + fprintf(stderr, "\nExiting... hackrf_is_streaming() result: %s (%d)\n", hackrf_error_name(result), result); } gettimeofday(&t_end, NULL); time_diff = TimevalDiff(&t_end, &t_start); - printf("Total time: %5.5f s\n", time_diff); + fprintf(stderr, "Total time: %5.5f s\n", time_diff); if(device != NULL) { result = hackrf_stop_rx(device); if(result != HACKRF_SUCCESS) { - printf("hackrf_stop_rx() failed: %s (%d)\n", + fprintf(stderr, "hackrf_stop_rx() failed: %s (%d)\n", hackrf_error_name(result), result); } else { - printf("hackrf_stop_rx() done\n"); + fprintf(stderr, "hackrf_stop_rx() done\n"); } result = hackrf_close(device); if(result != HACKRF_SUCCESS) { - printf("hackrf_close() failed: %s (%d)\n", + fprintf(stderr, "hackrf_close() failed: %s (%d)\n", hackrf_error_name(result), result); } else { - printf("hackrf_close() done\n"); + fprintf(stderr, "hackrf_close() done\n"); } hackrf_exit(); - printf("hackrf_exit() done\n"); + fprintf(stderr, "hackrf_exit() done\n"); } if(fd != NULL) { fclose(fd); fd = NULL; - printf("fclose(fd) done\n"); + fprintf(stderr, "fclose(fd) done\n"); } - printf("exit\n"); + fprintf(stderr, "exit\n"); return exit_code; } From 805e8c02e9dee13df6a9162235591223564a29b8 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Wed, 27 Jul 2016 00:34:53 +0100 Subject: [PATCH 029/103] Revert "Only transfer one block per re-tune" This reverts commit 3614cd3050d4cbbde651dae57fc35d689b18934f. --- firmware/hackrf_usb/usb_api_scan.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 1cba69d8..f4abc02f 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -75,14 +75,13 @@ void scan_mode(void) { if ( usb_bulk_buffer_offset >= 16384 && phase == 1 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - if (blocks_queued == 2) - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x0000], - 0x4000, - NULL, NULL - ); + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x0000], + 0x4000, + NULL, NULL + ); phase = 0; blocks_queued++; } @@ -91,14 +90,13 @@ void scan_mode(void) { if ( usb_bulk_buffer_offset < 16384 && phase == 0 && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - if (blocks_queued == 2) - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x4000], - 0x4000, - NULL, NULL - ); + usb_transfer_schedule_block( + (transceiver_mode() == TRANSCEIVER_MODE_RX) + ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, + &usb_bulk_buffer[0x4000], + 0x4000, + NULL, NULL + ); phase = 1; blocks_queued++; } From ccc424e21fa801f85bcc6ac97eb4a3f4be3f5e63 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Wed, 27 Jul 2016 00:42:29 +0100 Subject: [PATCH 030/103] Cleanup scan_mode usb transfer logic --- firmware/hackrf_usb/usb_api_scan.c | 39 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index f4abc02f..7d079391 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -70,43 +70,42 @@ void scan_mode(void) { unsigned int blocks_queued = 0; unsigned int phase = 0; + uint8_t *buffer; + bool transfer = false; + while(transceiver_mode() != TRANSCEIVER_MODE_OFF) { // Set up IN transfer of buffer 0. - if ( usb_bulk_buffer_offset >= 16384 - && phase == 1 - && transceiver_mode() != TRANSCEIVER_MODE_OFF) { - usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x0000], - 0x4000, - NULL, NULL - ); + if ( usb_bulk_buffer_offset >= 16384 && phase == 1) { + transfer = true; + buffer = &usb_bulk_buffer[0x0000]; phase = 0; blocks_queued++; } // Set up IN transfer of buffer 1. - if ( usb_bulk_buffer_offset < 16384 - && phase == 0 - && transceiver_mode() != TRANSCEIVER_MODE_OFF) { + if ( usb_bulk_buffer_offset < 16384 && phase == 0) { + transfer = true; + buffer = &usb_bulk_buffer[0x4000]; + phase = 1; + blocks_queued++; + } + + if (transfer) { usb_transfer_schedule_block( - (transceiver_mode() == TRANSCEIVER_MODE_RX) - ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - &usb_bulk_buffer[0x4000], + &usb_endpoint_bulk_in, + buffer, 0x4000, NULL, NULL ); - phase = 1; - blocks_queued++; + transfer = false; } if (blocks_queued > 2) { scan_freq += scan_params.step_freq_mhz; if (scan_freq > scan_params.max_freq_mhz) { scan_freq = scan_params.min_freq_mhz; - } - set_freq(scan_freq*FREQ_GRANULARITY); + } + set_freq(scan_freq*FREQ_GRANULARITY); blocks_queued = 0; } } From a303097c3167127ec7412df865229223d71f7bc4 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Wed, 27 Jul 2016 01:46:11 +0100 Subject: [PATCH 031/103] Add magic & scan_freq to the start of each transfer --- firmware/hackrf_usb/usb_api_scan.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 7d079391..789bbd53 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -91,6 +91,8 @@ void scan_mode(void) { } if (transfer) { + *(uint16_t*)buffer = 0x7F7F; + *(uint16_t*)(buffer+2) = scan_freq; usb_transfer_schedule_block( &usb_endpoint_bulk_in, buffer, From 8c08d99879e7410d661548b3792abbcdc81341c0 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Wed, 27 Jul 2016 01:52:50 +0100 Subject: [PATCH 032/103] Wait for scan_params to actually arrive before starting scan mode --- firmware/hackrf_usb/usb_api_scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_scan.c index 789bbd53..1ad25526 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_scan.c @@ -53,7 +53,7 @@ usb_request_status_t usb_vendor_request_init_scan( usb_transfer_schedule_block(endpoint->out, &scan_params, sizeof(struct init_scan_params), NULL, NULL); - + } else if (stage == USB_TRANSFER_STAGE_DATA) { /* Limit to min/max frequency without warning (possible FIXME) */ scan_params.min_freq_mhz = MAX(MIN_FREQ, scan_params.min_freq_mhz); scan_params.max_freq_mhz = MIN(MAX_FREQ, scan_params.max_freq_mhz); From 57e0924e0dc71674fef487a426a4742ba2fc5de1 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Wed, 27 Jul 2016 07:24:59 +0100 Subject: [PATCH 033/103] Rename scan to sweep --- firmware/hackrf_usb/CMakeLists.txt | 2 +- firmware/hackrf_usb/hackrf_usb.c | 10 ++--- .../{usb_api_scan.c => usb_api_sweep.c} | 38 +++++++++---------- .../{usb_api_scan.h => usb_api_sweep.h} | 6 +-- host/hackrf-tools/src/CMakeLists.txt | 6 +-- .../src/{hackrf_scan.c => hackrf_sweep.c} | 0 6 files changed, 31 insertions(+), 31 deletions(-) rename firmware/hackrf_usb/{usb_api_scan.c => usb_api_sweep.c} (74%) rename firmware/hackrf_usb/{usb_api_scan.h => usb_api_sweep.h} (90%) rename host/hackrf-tools/src/{hackrf_scan.c => hackrf_sweep.c} (100%) diff --git a/firmware/hackrf_usb/CMakeLists.txt b/firmware/hackrf_usb/CMakeLists.txt index 8db83f7f..c9c9a9d4 100644 --- a/firmware/hackrf_usb/CMakeLists.txt +++ b/firmware/hackrf_usb/CMakeLists.txt @@ -42,7 +42,7 @@ set(SRC_M4 usb_api_register.c usb_api_spiflash.c usb_api_transceiver.c - usb_api_scan.c + usb_api_sweep.c "${PATH_HACKRF_FIRMWARE_COMMON}/usb_queue.c" "${PATH_HACKRF_FIRMWARE_COMMON}/fault_handler.c" "${PATH_HACKRF_FIRMWARE_COMMON}/cpld_jtag.c" diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 25dff4ee..05d3975f 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -40,7 +40,7 @@ #include "usb_api_cpld.h" #include "usb_api_register.h" #include "usb_api_spiflash.h" -#include "usb_api_scan.h" +#include "usb_api_sweep.h" #include "usb_api_transceiver.h" #include "usb_bulk_buffer.h" @@ -76,7 +76,7 @@ static const usb_request_handler_fn vendor_request_handler[] = { #endif usb_vendor_request_set_freq_explicit, usb_vendor_request_read_wcid, // USB_WCID_VENDOR_REQ - usb_vendor_request_init_scan, + usb_vendor_request_init_sweep, }; static const uint32_t vendor_request_handler_count = @@ -182,9 +182,9 @@ int main(void) { if (start_cpld_update) cpld_update(); - // Check whether we need to initiate scan mode - if (start_scan_mode) - scan_mode(); + // Check whether we need to initiate sweep mode + if (start_sweep_mode) + sweep_mode(); // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 diff --git a/firmware/hackrf_usb/usb_api_scan.c b/firmware/hackrf_usb/usb_api_sweep.c similarity index 74% rename from firmware/hackrf_usb/usb_api_scan.c rename to firmware/hackrf_usb/usb_api_sweep.c index 1ad25526..1a7ad97c 100644 --- a/firmware/hackrf_usb/usb_api_scan.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -19,7 +19,7 @@ * Boston, MA 02110-1301, USA. */ -#include "usb_api_scan.h" +#include "usb_api_sweep.h" #include "usb_queue.h" #include #include @@ -34,39 +34,39 @@ #define MIN_FREQ 1 #define MAX_FREQ 6000 -volatile bool start_scan_mode = false; -static uint64_t scan_freq; +volatile bool start_sweep_mode = false; +static uint64_t sweep_freq; -struct init_scan_params { +struct init_sweep_params { uint16_t min_freq_mhz; uint16_t max_freq_mhz; uint16_t step_freq_mhz; }; -struct init_scan_params scan_params; +struct init_sweep_params sweep_params; -usb_request_status_t usb_vendor_request_init_scan( +usb_request_status_t usb_vendor_request_init_sweep( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if ((stage == USB_TRANSFER_STAGE_SETUP) && (endpoint->setup.length == 6)) { - usb_transfer_schedule_block(endpoint->out, &scan_params, - sizeof(struct init_scan_params), + usb_transfer_schedule_block(endpoint->out, &sweep_params, + sizeof(struct init_sweep_params), NULL, NULL); } else if (stage == USB_TRANSFER_STAGE_DATA) { /* Limit to min/max frequency without warning (possible FIXME) */ - scan_params.min_freq_mhz = MAX(MIN_FREQ, scan_params.min_freq_mhz); - scan_params.max_freq_mhz = MIN(MAX_FREQ, scan_params.max_freq_mhz); + sweep_params.min_freq_mhz = MAX(MIN_FREQ, sweep_params.min_freq_mhz); + sweep_params.max_freq_mhz = MIN(MAX_FREQ, sweep_params.max_freq_mhz); - scan_freq = scan_params.min_freq_mhz; - set_freq(scan_freq*FREQ_GRANULARITY); - start_scan_mode = true; + sweep_freq = sweep_params.min_freq_mhz; + set_freq(sweep_freq*FREQ_GRANULARITY); + start_sweep_mode = true; usb_transfer_schedule_ack(endpoint->in); } return USB_REQUEST_STATUS_OK; } -void scan_mode(void) { +void sweep_mode(void) { unsigned int blocks_queued = 0; unsigned int phase = 0; @@ -92,7 +92,7 @@ void scan_mode(void) { if (transfer) { *(uint16_t*)buffer = 0x7F7F; - *(uint16_t*)(buffer+2) = scan_freq; + *(uint16_t*)(buffer+2) = sweep_freq; usb_transfer_schedule_block( &usb_endpoint_bulk_in, buffer, @@ -103,11 +103,11 @@ void scan_mode(void) { } if (blocks_queued > 2) { - scan_freq += scan_params.step_freq_mhz; - if (scan_freq > scan_params.max_freq_mhz) { - scan_freq = scan_params.min_freq_mhz; + sweep_freq += sweep_params.step_freq_mhz; + if (sweep_freq > sweep_params.max_freq_mhz) { + sweep_freq = sweep_params.min_freq_mhz; } - set_freq(scan_freq*FREQ_GRANULARITY); + set_freq(sweep_freq*FREQ_GRANULARITY); blocks_queued = 0; } } diff --git a/firmware/hackrf_usb/usb_api_scan.h b/firmware/hackrf_usb/usb_api_sweep.h similarity index 90% rename from firmware/hackrf_usb/usb_api_scan.h rename to firmware/hackrf_usb/usb_api_sweep.h index be066612..828647cd 100644 --- a/firmware/hackrf_usb/usb_api_scan.h +++ b/firmware/hackrf_usb/usb_api_sweep.h @@ -26,11 +26,11 @@ #include #include -extern volatile bool start_scan_mode; +extern volatile bool start_sweep_mode; -usb_request_status_t usb_vendor_request_init_scan( +usb_request_status_t usb_vendor_request_init_sweep( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); -void scan_mode(void); +void sweep_mode(void); #endif /* __USB_API_SPCAN_H__ */ diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index a3a56e4c..6f925cde 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -50,8 +50,8 @@ install(TARGETS hackrf_cpldjtag RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) add_executable(hackrf_info hackrf_info.c) install(TARGETS hackrf_info RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) -add_executable(hackrf_scan hackrf_scan.c) -install(TARGETS hackrf_scan RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) +add_executable(hackrf_sweep hackrf_sweep.c) +install(TARGETS hackrf_sweep RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) if(NOT libhackrf_SOURCE_DIR) include_directories(${LIBHACKRF_INCLUDE_DIR}) @@ -72,4 +72,4 @@ target_link_libraries(hackrf_rffc5071 ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_spiflash ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_cpldjtag ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_info ${TOOLS_LINK_LIBS}) -target_link_libraries(hackrf_scan ${TOOLS_LINK_LIBS}) +target_link_libraries(hackrf_sweep ${TOOLS_LINK_LIBS}) diff --git a/host/hackrf-tools/src/hackrf_scan.c b/host/hackrf-tools/src/hackrf_sweep.c similarity index 100% rename from host/hackrf-tools/src/hackrf_scan.c rename to host/hackrf-tools/src/hackrf_sweep.c From 86bde9f4c224f35bb1f858bff88cb476789a5fea Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Wed, 27 Jul 2016 07:42:07 +0100 Subject: [PATCH 034/103] Remove unused helper functions from hackrf_sweep --- host/hackrf-tools/src/hackrf_sweep.c | 91 +--------------------------- 1 file changed, 1 insertion(+), 90 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 20884665..90f87f51 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -92,48 +92,10 @@ int gettimeofday(struct timeval *tv, void* ignored) { #define sleep(a) Sleep( (a*1000) ) #endif -#define U64TOA_MAX_DIGIT (31) -typedef struct -{ - char data[U64TOA_MAX_DIGIT+1]; -} t_u64toa; - -t_u64toa ascii_u64_data1; -t_u64toa ascii_u64_data2; - -static float -TimevalDiff(const struct timeval *a, const struct timeval *b) -{ +static float TimevalDiff(const struct timeval *a, const struct timeval *b) { return (a->tv_sec - b->tv_sec) + 1e-6f * (a->tv_usec - b->tv_usec); } -int parse_u64(char* s, uint64_t* const value) { - uint_fast8_t base = 10; - char* s_end; - uint64_t u64_value; - - if( strlen(s) > 2 ) { - if( s[0] == '0' ) { - if( (s[1] == 'x') || (s[1] == 'X') ) { - base = 16; - s += 2; - } else if( (s[1] == 'b') || (s[1] == 'B') ) { - base = 2; - s += 2; - } - } - } - - s_end = s; - u64_value = strtoull(s, &s_end, base); - if( (s != s_end) && (*s_end == 0) ) { - *value = u64_value; - return HACKRF_SUCCESS; - } else { - return HACKRF_ERROR_INVALID_PARAM; - } -} - int parse_u32(char* s, uint32_t* const value) { uint_fast8_t base = 10; char* s_end; @@ -161,54 +123,6 @@ int parse_u32(char* s, uint32_t* const value) { } } - -static char *stringrev(char *str) -{ - char *p1, *p2; - - if(! str || ! *str) - return str; - - for(p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) - { - *p1 ^= *p2; - *p2 ^= *p1; - *p1 ^= *p2; - } - return str; -} - -char* u64toa(uint64_t val, t_u64toa* str) -{ - #define BASE (10ull) /* Base10 by default */ - uint64_t sum; - int pos; - int digit; - int max_len; - char* res; - - sum = val; - max_len = U64TOA_MAX_DIGIT; - pos = 0; - - do - { - digit = (sum % BASE); - str->data[pos] = digit + '0'; - pos++; - - sum /= BASE; - }while( (sum>0) && (pos < max_len) ); - - if( (pos == max_len) && (sum>0) ) - return NULL; - - str->data[pos] = '\0'; - res = stringrev(str->data); - - return res; -} - volatile bool do_exit = false; FILE* fd = NULL; @@ -280,9 +194,6 @@ void sigint_callback_handler(int signum) { } #endif -#define PATH_FILE_MAX_LEN (FILENAME_MAX) -#define DATE_TIME_MAX_LEN (32) - int main(int argc, char** argv) { int opt; const char* path = "/dev/null"; From dc0b5a5798145bf9ef0d1343c0eaba802b287caa Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Wed, 27 Jul 2016 07:59:10 +0100 Subject: [PATCH 035/103] Fix missed scan -> sweep changes --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- host/libhackrf/src/hackrf.c | 12 ++++++------ host/libhackrf/src/hackrf.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 90f87f51..e2cab8d6 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -337,7 +337,7 @@ int main(int argc, char** argv) { } /* DGS FIXME: allow upper and lower frequencies to be set */ - result = hackrf_init_scan(device, 50, 6000, 10); + result = hackrf_init_sweep(device, 50, 6000, 10); if( result != HACKRF_SUCCESS ) { fprintf(stderr, "hackrf_init_scan() failed: %s (%d)\n", hackrf_error_name(result), result); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index b16763bc..41f36fee 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -68,7 +68,7 @@ typedef enum { HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23, HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, // USB_WCID_VENDOR_REQ = 25 - HACKRF_VENDOR_REQUEST_INIT_SCAN = 26, + HACKRF_VENDOR_REQUEST_INIT_SWEEP = 26, } hackrf_vendor_request; typedef enum { @@ -1697,29 +1697,29 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) return p->bandwidth_hz; } -struct init_scan_params { +struct init_sweep_params { uint16_t min_freq_mhz; uint16_t max_freq_mhz; uint16_t step_freq_mhz; }; -int ADDCALL hackrf_init_scan(hackrf_device* device, +int ADDCALL hackrf_init_sweep(hackrf_device* device, const uint16_t min_freq_mhz, const uint16_t max_freq_mhz, const uint16_t step_freq_mhz) { - struct init_scan_params params; + struct init_sweep_params params; uint8_t length; int result; params.min_freq_mhz = TO_LE(min_freq_mhz); params.max_freq_mhz = TO_LE(max_freq_mhz); params.step_freq_mhz = TO_LE(step_freq_mhz); - length = sizeof(struct init_scan_params); + length = sizeof(struct init_sweep_params); result = libusb_control_transfer( device->usb_device, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, - HACKRF_VENDOR_REQUEST_INIT_SCAN, + HACKRF_VENDOR_REQUEST_INIT_SWEEP, 0, 0, (unsigned char*)¶ms, diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index fb0a4853..9fe11abb 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -197,7 +197,7 @@ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw_round_down_lt(c /* Compute best default value depending on sample rate (auto filter) */ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz); /* Start scan mode */ -extern ADDAPI int ADDCALL hackrf_init_scan(hackrf_device* device, +extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device, const uint16_t min_freq_mhz, const uint16_t max_freq_mhz, const uint16_t step_freq_mhz); From 6db1849b7465b1c250c8b9c9ed4d401657e3322d Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 28 Jul 2016 17:08:26 +0100 Subject: [PATCH 036/103] Add some fftw magic to proceedings --- host/cmake/modules/FindFFTW.cmake | 22 +++++++++++++++++ host/hackrf-tools/src/CMakeLists.txt | 1 + host/hackrf-tools/src/hackrf_sweep.c | 37 ++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 host/cmake/modules/FindFFTW.cmake diff --git a/host/cmake/modules/FindFFTW.cmake b/host/cmake/modules/FindFFTW.cmake new file mode 100644 index 00000000..00c3401c --- /dev/null +++ b/host/cmake/modules/FindFFTW.cmake @@ -0,0 +1,22 @@ +# - Find FFTW +# Find the native FFTW includes and library +# +# FFTW_INCLUDES - where to find fftw3.h +# FFTW_LIBRARIES - List of libraries when using FFTW. +# FFTW_FOUND - True if FFTW found. + +if (FFTW_INCLUDES) + # Already in cache, be silent + set (FFTW_FIND_QUIETLY TRUE) +endif (FFTW_INCLUDES) + +find_path (FFTW_INCLUDES fftw3.h) + +find_library (FFTW_LIBRARIES NAMES fftw3) + +# handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if +# all listed variables are TRUE +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (FFTW DEFAULT_MSG FFTW_LIBRARIES FFTW_INCLUDES) + +mark_as_advanced (FFTW_LIBRARIES FFTW_INCLUDES) diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index 6f925cde..1873165c 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -64,6 +64,7 @@ if(MSVC) LIST(APPEND TOOLS_LINK_LIBS libgetopt_static) endif() +LIST(APPEND TOOLS_LINK_LIBS m fftw3f) target_link_libraries(hackrf_max2837 ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_si5351c ${TOOLS_LINK_LIBS}) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index e2cab8d6..a71c2a9c 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #ifndef bool typedef int bool; @@ -137,8 +139,11 @@ uint32_t amp_enable; bool antenna = false; uint32_t antenna_enable; -bool sample_rate = false; -uint32_t sample_rate_hz; +int fftSize; +fftwf_complex *fftwIn = NULL; +fftwf_complex *fftwOut = NULL; +fftwf_plan fftwPlan = NULL; +double* pwr; int rx_callback(hackrf_transfer* transfer) { /* This is where we need to do interesting things with the samples @@ -148,11 +153,33 @@ int rx_callback(hackrf_transfer* transfer) { */ ssize_t bytes_to_write; ssize_t bytes_written; + uint16_t* buf_short, frequency; + int i, j; if( fd != NULL ) { byte_count += transfer->valid_length; bytes_to_write = transfer->valid_length; + buf_short = (uint16_t*) transfer->buffer; + for(j=0; j<16; j++) { + if(buf_short[0] == 0x7F7F) { + frequency = buf_short[1]; + fprintf(stderr, "Received sweep buffer(%dMHz)\n", frequency); + } + /* copy to fftwIn as floats */ + buf_short = buf_short + 2; + for(i=0; i<2046; i+=2) { + fftwIn[i][0] = (float) buf_short[i]; + fftwIn[i][1] = (float) buf_short[i+1]; + } + buf_short = buf_short + 8190; + fftwf_execute(fftwPlan); + for (i=0; i < fftSize; i++) { + pwr[i] += pow(fftwOut[i][0], 2) + pow(fftwOut[i][1], 2); + fprintf(stderr, "%f\n", pwr[i]); + } + fprintf(stderr, "\n"); + } bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); if (bytes_written != bytes_to_write) { @@ -269,6 +296,12 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } } + + fftSize = 2048; + fftwIn = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); + fftwOut = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); + fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE); + pwr = (double*)fftwf_malloc(sizeof(double) * fftSize); result = hackrf_init(); if( result != HACKRF_SUCCESS ) { From c73a1d56a7a3b6341206adda9c037146941009b8 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 29 Jul 2016 02:31:08 +0100 Subject: [PATCH 037/103] Calculate log power --- host/hackrf-tools/src/hackrf_sweep.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index a71c2a9c..7cae4c84 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -1,5 +1,6 @@ /* * Copyright 2016 Dominic Spill + * Copyright 2016 Mike Walters * * This file is part of HackRF. * @@ -143,7 +144,15 @@ int fftSize; fftwf_complex *fftwIn = NULL; fftwf_complex *fftwOut = NULL; fftwf_plan fftwPlan = NULL; -double* pwr; +float* pwr; + +float logPower(fftwf_complex in, float scale) +{ + float re = in[0] * scale; + float im = in[1] * scale; + float magsq = re * re + im * im; + return log2f(magsq) * 10.0f / log2(10.0f); +} int rx_callback(hackrf_transfer* transfer) { /* This is where we need to do interesting things with the samples @@ -175,7 +184,7 @@ int rx_callback(hackrf_transfer* transfer) { buf_short = buf_short + 8190; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { - pwr[i] += pow(fftwOut[i][0], 2) + pow(fftwOut[i][1], 2); + pwr[i] += logPower(fftwOut[i], 1.0f / fftSize); fprintf(stderr, "%f\n", pwr[i]); } fprintf(stderr, "\n"); @@ -301,7 +310,7 @@ int main(int argc, char** argv) { fftwIn = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwOut = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE); - pwr = (double*)fftwf_malloc(sizeof(double) * fftSize); + pwr = (float*)fftwf_malloc(sizeof(float) * fftSize); result = hackrf_init(); if( result != HACKRF_SUCCESS ) { From cb53e60a0dba33927cbe17e1350d82b50e143e9c Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 29 Jul 2016 02:31:16 +0100 Subject: [PATCH 038/103] Don't increment power --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 7cae4c84..a0c3a9ee 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -184,7 +184,7 @@ int rx_callback(hackrf_transfer* transfer) { buf_short = buf_short + 8190; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { - pwr[i] += logPower(fftwOut[i], 1.0f / fftSize); + pwr[i] = logPower(fftwOut[i], 1.0f / fftSize); fprintf(stderr, "%f\n", pwr[i]); } fprintf(stderr, "\n"); From a15bff3acf13e673fc49253081266dfe61906eb4 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 29 Jul 2016 02:40:27 +0100 Subject: [PATCH 039/103] Scale input samples --- host/hackrf-tools/src/hackrf_sweep.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index a0c3a9ee..21f94199 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -177,9 +177,9 @@ int rx_callback(hackrf_transfer* transfer) { } /* copy to fftwIn as floats */ buf_short = buf_short + 2; - for(i=0; i<2046; i+=2) { - fftwIn[i][0] = (float) buf_short[i]; - fftwIn[i][1] = (float) buf_short[i+1]; + for(i=0; i < fftSize; i+=2) { + fftwIn[i][0] = buf_short[i] / 128.0f; + fftwIn[i][1] = buf_short[i+1] / 128.0f; } buf_short = buf_short + 8190; fftwf_execute(fftwPlan); From 27b8f674dad7ab3dbdfc36e68bf82139df1ac556 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 29 Jul 2016 02:40:41 +0100 Subject: [PATCH 040/103] Fix input copy loop --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 21f94199..0a6331c5 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -177,7 +177,7 @@ int rx_callback(hackrf_transfer* transfer) { } /* copy to fftwIn as floats */ buf_short = buf_short + 2; - for(i=0; i < fftSize; i+=2) { + for(i=0; i < fftSize; i++) { fftwIn[i][0] = buf_short[i] / 128.0f; fftwIn[i][1] = buf_short[i+1] / 128.0f; } From 1bd4c9a846be02ccabe4eb1f0cd9554d970ebd2c Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 29 Jul 2016 03:21:56 +0100 Subject: [PATCH 041/103] Rearrange fftw output --- host/hackrf-tools/src/hackrf_sweep.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 0a6331c5..59368521 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -184,8 +184,11 @@ int rx_callback(hackrf_transfer* transfer) { buf_short = buf_short + 8190; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { - pwr[i] = logPower(fftwOut[i], 1.0f / fftSize); - fprintf(stderr, "%f\n", pwr[i]); + // Start from the middle of the FFTW array and wrap + // to rearrange the data + int k = i ^ (fftSize >> 1); + pwr[i] = logPower(fftwOut[k], 1.0f / fftSize); + fprintf(stderr, "%f\n", pwr[i]); } fprintf(stderr, "\n"); } From cf64ccc058caee10f2f789e4137ac7a842a5e220 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Fri, 29 Jul 2016 03:49:22 +0100 Subject: [PATCH 042/103] Fix up datatypes --- host/hackrf-tools/src/hackrf_sweep.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 59368521..2e76696b 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -162,26 +162,27 @@ int rx_callback(hackrf_transfer* transfer) { */ ssize_t bytes_to_write; ssize_t bytes_written; - uint16_t* buf_short, frequency; + int8_t* buf; + uint16_t frequency; int i, j; if( fd != NULL ) { byte_count += transfer->valid_length; bytes_to_write = transfer->valid_length; - buf_short = (uint16_t*) transfer->buffer; + buf = (int8_t*) transfer->buffer; for(j=0; j<16; j++) { - if(buf_short[0] == 0x7F7F) { - frequency = buf_short[1]; - fprintf(stderr, "Received sweep buffer(%dMHz)\n", frequency); + if(buf[0] == 0x7F && buf[1] == 0x7F) { + frequency = *(uint16_t*)&buf[2]; + fprintf(stderr, "Received sweep buffer(%uMHz)\n", frequency); } /* copy to fftwIn as floats */ - buf_short = buf_short + 2; + buf += 4; for(i=0; i < fftSize; i++) { - fftwIn[i][0] = buf_short[i] / 128.0f; - fftwIn[i][1] = buf_short[i+1] / 128.0f; + fftwIn[i][0] = buf[i*2] / 128.0f; + fftwIn[i][1] = buf[i*2+1] / 128.0f; } - buf_short = buf_short + 8190; + buf = buf + 8190; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { // Start from the middle of the FFTW array and wrap From d9b26c5ffa8d75e32e32fd89598b11387b43a769 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 06:24:57 +0100 Subject: [PATCH 043/103] Smaller FFT size --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 2e76696b..623c1366 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -310,7 +310,7 @@ int main(int argc, char** argv) { } } - fftSize = 2048; + fftSize = 32; fftwIn = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwOut = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE); From 316d7be6c298b68e915ed49f3e4498525ccac669 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 06:25:13 +0100 Subject: [PATCH 044/103] Write power values to stdout --- host/hackrf-tools/src/hackrf_sweep.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 623c1366..53eeba79 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -163,7 +163,7 @@ int rx_callback(hackrf_transfer* transfer) { ssize_t bytes_to_write; ssize_t bytes_written; int8_t* buf; - uint16_t frequency; + float frequency; int i, j; if( fd != NULL ) @@ -174,7 +174,6 @@ int rx_callback(hackrf_transfer* transfer) { for(j=0; j<16; j++) { if(buf[0] == 0x7F && buf[1] == 0x7F) { frequency = *(uint16_t*)&buf[2]; - fprintf(stderr, "Received sweep buffer(%uMHz)\n", frequency); } /* copy to fftwIn as floats */ buf += 4; @@ -189,9 +188,9 @@ int rx_callback(hackrf_transfer* transfer) { // to rearrange the data int k = i ^ (fftSize >> 1); pwr[i] = logPower(fftwOut[k], 1.0f / fftSize); - fprintf(stderr, "%f\n", pwr[i]); } - fprintf(stderr, "\n"); + fwrite(&frequency, sizeof(float), 1, stdout); + fwrite(pwr, sizeof(float), fftSize, stdout); } bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); From 3dc6742be2c8d40c8f2739d71fa3b438da6af72f Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 08:02:48 +0100 Subject: [PATCH 045/103] Fix messed up buffer skip --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 53eeba79..0ef96929 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -181,7 +181,7 @@ int rx_callback(hackrf_transfer* transfer) { fftwIn[i][0] = buf[i*2] / 128.0f; fftwIn[i][1] = buf[i*2+1] / 128.0f; } - buf = buf + 8190; + buf = buf + 16380; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { // Start from the middle of the FFTW array and wrap From 62d06659f89f0f043d5f41fbdabab7f5e9cb4717 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 10:57:09 +0100 Subject: [PATCH 046/103] FFT size tweak again --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 0ef96929..295256f3 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -309,7 +309,7 @@ int main(int argc, char** argv) { } } - fftSize = 32; + fftSize = 64; fftwIn = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwOut = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE); From 8e21d5cba0efcf06ccf5e4d387a0bea0e06e6689 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 10:57:32 +0100 Subject: [PATCH 047/103] Skip first block after retune --- firmware/hackrf_usb/usb_api_sweep.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 1a7ad97c..6ae5a2e9 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -93,12 +93,13 @@ 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 > 1) + usb_transfer_schedule_block( + &usb_endpoint_bulk_in, + buffer, + 0x4000, + NULL, NULL + ); transfer = false; } From df6a7986cf28aabcecf52b6e921f4d5a1218328f Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 10:58:25 +0100 Subject: [PATCH 048/103] DC offset hacks --- host/hackrf-tools/src/hackrf_sweep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 295256f3..14d2b2dc 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -178,8 +178,8 @@ int rx_callback(hackrf_transfer* transfer) { /* copy to fftwIn as floats */ buf += 4; for(i=0; i < fftSize; i++) { - fftwIn[i][0] = buf[i*2] / 128.0f; - fftwIn[i][1] = buf[i*2+1] / 128.0f; + fftwIn[i][0] = buf[i*2] / 128.0f + 0.001f; + fftwIn[i][1] = buf[i*2+1] / 128.0f - 0.0067f; } buf = buf + 16380; fftwf_execute(fftwPlan); From 7935fc973f42a0275f202a4ad6f2c26047a2e39f Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 14:50:49 +0100 Subject: [PATCH 049/103] Add -f argument for sweep freq range --- host/hackrf-tools/src/hackrf_sweep.c | 40 ++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 14d2b2dc..1058b67f 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -126,6 +126,25 @@ int parse_u32(char* s, uint32_t* const value) { } } +int parse_u32_range(char* s, uint32_t* const value_min, uint32_t* const value_max) { + int result; + + char *sep = strchr(s, ':'); + if (!sep) + return HACKRF_ERROR_INVALID_PARAM; + + *sep = 0; + + result = parse_u32(s, value_min); + if (result != HACKRF_SUCCESS) + return result; + result = parse_u32(sep + 1, value_max); + if (result != HACKRF_SUCCESS); + return result; + + return HACKRF_SUCCESS; +} + volatile bool do_exit = false; FILE* fd = NULL; @@ -140,6 +159,10 @@ uint32_t amp_enable; bool antenna = false; uint32_t antenna_enable; +bool freq_range = false; +uint32_t freq_min; +uint32_t freq_max; + int fftSize; fftwf_complex *fftwIn = NULL; fftwf_complex *fftwOut = NULL; @@ -208,6 +231,7 @@ static void usage() { fprintf(stderr, "Usage:\n"); fprintf(stderr, "\t[-d serial_number] # Serial number of desired HackRF.\n"); fprintf(stderr, "\t[-a amp_enable] # RX/TX RF amplifier 1=Enable, 0=Disable.\n"); + fprintf(stderr, "\t[-f freq_min:freq_max # Specify minimum & maximum sweep frequencies (MHz).\n"); fprintf(stderr, "\t[-p antenna_enable] # Antenna port power, 1=Enable, 0=Disable.\n"); 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"); @@ -243,7 +267,7 @@ int main(int argc, char** argv) { float time_diff; unsigned int lna_gain=8, vga_gain=20, txvga_gain=0; - while( (opt = getopt(argc, argv, "a:p:l:g:x:d:")) != EOF ) + while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) @@ -257,6 +281,12 @@ int main(int argc, char** argv) { result = parse_u32(optarg, &_enable); break; + case 'f': + freq_range = true; + result = parse_u32_range(optarg, &freq_min, &freq_max); + fprintf(stderr, "Scanning %uMHz to %uMHz\n", freq_min, freq_max); + break; + case 'p': antenna = true; result = parse_u32(optarg, &antenna_enable); @@ -308,6 +338,12 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } } + + if (!freq_range) { + fprintf(stderr, "argument error: must specify sweep frequency range (-f).\n"); + usage(); + return EXIT_FAILURE; + } fftSize = 64; fftwIn = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); @@ -382,7 +418,7 @@ int main(int argc, char** argv) { } /* DGS FIXME: allow upper and lower frequencies to be set */ - result = hackrf_init_sweep(device, 50, 6000, 10); + result = hackrf_init_sweep(device, freq_min, freq_max, 20); if( result != HACKRF_SUCCESS ) { fprintf(stderr, "hackrf_init_scan() failed: %s (%d)\n", hackrf_error_name(result), result); From b6a7972916d1e5ccc932d854fa3588572c359337 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 14:56:15 +0100 Subject: [PATCH 050/103] Add extra fs/4 hops to overlap band-edges and DC spikes --- firmware/hackrf_usb/usb_api_sweep.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 6ae5a2e9..62f16af0 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -36,6 +36,7 @@ volatile bool start_sweep_mode = false; static uint64_t sweep_freq; +bool odd = true; struct init_sweep_params { uint16_t min_freq_mhz; @@ -104,8 +105,14 @@ void sweep_mode(void) { } if (blocks_queued > 2) { - sweep_freq += sweep_params.step_freq_mhz; + if (odd) + sweep_freq += sweep_params.step_freq_mhz / 4; + else + sweep_freq += 3 * (sweep_params.step_freq_mhz / 4); + odd = !odd; + if (sweep_freq > sweep_params.max_freq_mhz) { + odd = true; sweep_freq = sweep_params.min_freq_mhz; } set_freq(sweep_freq*FREQ_GRANULARITY); From d09e83e42316d5be595113c8bd3392ca88688a15 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 17:56:25 +0100 Subject: [PATCH 051/103] Revert "DC offset hacks" This reverts commit 96f680016f81b480bb2a66ec937be29185b26224. --- host/hackrf-tools/src/hackrf_sweep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 1058b67f..1b597a2e 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -201,8 +201,8 @@ int rx_callback(hackrf_transfer* transfer) { /* copy to fftwIn as floats */ buf += 4; for(i=0; i < fftSize; i++) { - fftwIn[i][0] = buf[i*2] / 128.0f + 0.001f; - fftwIn[i][1] = buf[i*2+1] / 128.0f - 0.0067f; + fftwIn[i][0] = buf[i*2] / 128.0f; + fftwIn[i][1] = buf[i*2+1] / 128.0f; } buf = buf + 16380; fftwf_execute(fftwPlan); From a5a1c8ce70e73fcf344d9930839ab577ef481003 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 18:43:08 +0100 Subject: [PATCH 052/103] Apply window --- host/hackrf-tools/src/hackrf_sweep.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 1b597a2e..2ab1670f 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -168,6 +168,7 @@ fftwf_complex *fftwIn = NULL; fftwf_complex *fftwOut = NULL; fftwf_plan fftwPlan = NULL; float* pwr; +float* window; float logPower(fftwf_complex in, float scale) { @@ -201,8 +202,8 @@ int rx_callback(hackrf_transfer* transfer) { /* copy to fftwIn as floats */ buf += 4; for(i=0; i < fftSize; i++) { - fftwIn[i][0] = buf[i*2] / 128.0f; - fftwIn[i][1] = buf[i*2+1] / 128.0f; + fftwIn[i][0] = buf[i*2] * window[i] * 1.0f / 128.0f; + fftwIn[i][1] = buf[i*2+1] * window[i] * 1.0f / 128.0f; } buf = buf + 16380; fftwf_execute(fftwPlan); @@ -350,6 +351,11 @@ int main(int argc, char** argv) { fftwOut = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex) * fftSize); fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE); pwr = (float*)fftwf_malloc(sizeof(float) * fftSize); + window = (float*)fftwf_malloc(sizeof(float) * fftSize); + int i; + for (i = 0; i < fftSize; i++) { + window[i] = 0.5f * (1.0f - cos(2 * M_PI * i / (fftSize - 1))); + } result = hackrf_init(); if( result != HACKRF_SUCCESS ) { From 39c15c93a97ad6bb7beec5246eefcc9b4f7985e8 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 18:43:33 +0100 Subject: [PATCH 053/103] Increase default gains --- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 2ab1670f..d504f530 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -266,7 +266,7 @@ int main(int argc, char** argv) { int exit_code = EXIT_SUCCESS; struct timeval t_end; float time_diff; - unsigned int lna_gain=8, vga_gain=20, txvga_gain=0; + unsigned int lna_gain=20, vga_gain=20, txvga_gain=0; while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:")) != EOF ) { From 02eda1fd92ee0cdc428ed9baad00d6a0aae3efa5 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sat, 30 Jul 2016 18:43:43 +0100 Subject: [PATCH 054/103] Take samples from the end of the buffer --- host/hackrf-tools/src/hackrf_sweep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index d504f530..e5f95a53 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -200,12 +200,12 @@ int rx_callback(hackrf_transfer* transfer) { frequency = *(uint16_t*)&buf[2]; } /* copy to fftwIn as floats */ - buf += 4; + buf += 16384 - (fftSize * 2); for(i=0; i < fftSize; i++) { fftwIn[i][0] = buf[i*2] * window[i] * 1.0f / 128.0f; fftwIn[i][1] = buf[i*2+1] * window[i] * 1.0f / 128.0f; } - buf = buf + 16380; + buf += fftSize * 2; fftwf_execute(fftwPlan); for (i=0; i < fftSize; i++) { // Start from the middle of the FFTW array and wrap From 2d88fe4de33232760ab37ebd3fd3dc76d5f61b5d Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sun, 31 Jul 2016 12:27:16 +0100 Subject: [PATCH 055/103] Reset enter_scan_mode to avoid going straight back into scan_mode --- firmware/hackrf_usb/hackrf_usb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 05d3975f..ba31908a 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -183,8 +183,10 @@ int main(void) { cpld_update(); // Check whether we need to initiate sweep mode - if (start_sweep_mode) + if (start_sweep_mode) { + start_sweep_mode = false; sweep_mode(); + } // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 From c127cdc0a477f3be0d4657801d6b946cdf87c5da Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 8 Sep 2016 17:10:39 +0100 Subject: [PATCH 056/103] Frequency list PoC --- firmware/hackrf_usb/usb_api_sweep.c | 40 +++++++++------------------- host/hackrf-tools/src/hackrf_sweep.c | 36 ++++++++++++++++--------- host/libhackrf/src/hackrf.c | 25 +++++------------ host/libhackrf/src/hackrf.h | 4 +-- 4 files changed, 44 insertions(+), 61 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 62f16af0..d2ee8ec5 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -33,33 +33,23 @@ #define FREQ_GRANULARITY 1000000 #define MIN_FREQ 1 #define MAX_FREQ 6000 +#define MAX_FREQ_COUNT 500 volatile bool start_sweep_mode = false; static uint64_t sweep_freq; bool odd = true; - -struct init_sweep_params { - uint16_t min_freq_mhz; - uint16_t max_freq_mhz; - uint16_t step_freq_mhz; -}; -struct init_sweep_params sweep_params; +static uint16_t frequencies[MAX_FREQ_COUNT]; +static uint16_t frequency_count = 0; usb_request_status_t usb_vendor_request_init_sweep( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { - if ((stage == USB_TRANSFER_STAGE_SETUP) && - (endpoint->setup.length == 6)) { - - usb_transfer_schedule_block(endpoint->out, &sweep_params, - sizeof(struct init_sweep_params), - NULL, NULL); + if (stage == USB_TRANSFER_STAGE_SETUP) { + frequency_count = endpoint->setup.length; + usb_transfer_schedule_block(endpoint->out, &frequencies, + endpoint->setup.length, NULL, NULL); } else if (stage == USB_TRANSFER_STAGE_DATA) { - /* Limit to min/max frequency without warning (possible FIXME) */ - sweep_params.min_freq_mhz = MAX(MIN_FREQ, sweep_params.min_freq_mhz); - sweep_params.max_freq_mhz = MIN(MAX_FREQ, sweep_params.max_freq_mhz); - - sweep_freq = sweep_params.min_freq_mhz; + sweep_freq = frequencies[0]; set_freq(sweep_freq*FREQ_GRANULARITY); start_sweep_mode = true; usb_transfer_schedule_ack(endpoint->in); @@ -70,6 +60,7 @@ usb_request_status_t usb_vendor_request_init_sweep( void sweep_mode(void) { unsigned int blocks_queued = 0; unsigned int phase = 0; + unsigned int ifreq = 0; uint8_t *buffer; bool transfer = false; @@ -105,16 +96,9 @@ void sweep_mode(void) { } if (blocks_queued > 2) { - if (odd) - sweep_freq += sweep_params.step_freq_mhz / 4; - else - sweep_freq += 3 * (sweep_params.step_freq_mhz / 4); - odd = !odd; - - if (sweep_freq > sweep_params.max_freq_mhz) { - odd = true; - sweep_freq = sweep_params.min_freq_mhz; - } + if(++ifreq >= frequency_count) + ifreq = 0; + sweep_freq = frequencies[ifreq]; set_freq(sweep_freq*FREQ_GRANULARITY); blocks_queued = 0; } diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index e5f95a53..014c2d18 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -91,6 +91,9 @@ int gettimeofday(struct timeval *tv, void* ignored) { #define DEFAULT_SAMPLE_RATE_HZ (20000000) /* 20MHz default sample rate */ #define DEFAULT_BASEBAND_FILTER_BANDWIDTH (15000000) /* 5MHz default */ +#define FREQ_STEP (DEFAULT_SAMPLE_RATE_HZ / FREQ_ONE_MHZ) +#define MAX_FREQ_COUNT 500 + #if defined _WIN32 #define sleep(a) Sleep( (a*1000) ) #endif @@ -139,7 +142,7 @@ int parse_u32_range(char* s, uint32_t* const value_min, uint32_t* const value_ma if (result != HACKRF_SUCCESS) return result; result = parse_u32(sep + 1, value_max); - if (result != HACKRF_SUCCESS); + if (result != HACKRF_SUCCESS) return result; return HACKRF_SUCCESS; @@ -159,7 +162,6 @@ uint32_t amp_enable; bool antenna = false; uint32_t antenna_enable; -bool freq_range = false; uint32_t freq_min; uint32_t freq_max; @@ -259,17 +261,17 @@ void sigint_callback_handler(int signum) { #endif int main(int argc, char** argv) { - int opt; + int opt, i, result, ifreq = 0; + bool odd; const char* path = "/dev/null"; const char* serial_number = NULL; - int result; int exit_code = EXIT_SUCCESS; struct timeval t_end; float time_diff; - unsigned int lna_gain=20, vga_gain=20, txvga_gain=0; - - while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:")) != EOF ) - { + unsigned int lna_gain=16, vga_gain=20, txvga_gain=0; + uint16_t frequencies[MAX_FREQ_COUNT]; + + while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) { @@ -283,9 +285,18 @@ int main(int argc, char** argv) { break; case 'f': - freq_range = true; result = parse_u32_range(optarg, &freq_min, &freq_max); fprintf(stderr, "Scanning %uMHz to %uMHz\n", freq_min, freq_max); + frequencies[ifreq++] = freq_min; + odd = true; + while(frequencies[ifreq-1] <= freq_max) { + if (odd) + frequencies[ifreq] = frequencies[ifreq-1] + FREQ_STEP / 4; + else + frequencies[ifreq] = frequencies[ifreq-1] + 3*(FREQ_STEP/4); + ifreq++; + odd = !odd; + } break; case 'p': @@ -340,7 +351,7 @@ int main(int argc, char** argv) { } } - if (!freq_range) { + if (ifreq == 0) { fprintf(stderr, "argument error: must specify sweep frequency range (-f).\n"); usage(); return EXIT_FAILURE; @@ -352,7 +363,6 @@ int main(int argc, char** argv) { fftwPlan = fftwf_plan_dft_1d(fftSize, fftwIn, fftwOut, FFTW_FORWARD, FFTW_MEASURE); pwr = (float*)fftwf_malloc(sizeof(float) * fftSize); window = (float*)fftwf_malloc(sizeof(float) * fftSize); - int i; for (i = 0; i < fftSize; i++) { window[i] = 0.5f * (1.0f - cos(2 * M_PI * i / (fftSize - 1))); } @@ -424,9 +434,9 @@ int main(int argc, char** argv) { } /* DGS FIXME: allow upper and lower frequencies to be set */ - result = hackrf_init_sweep(device, freq_min, freq_max, 20); + result = hackrf_init_sweep(device, frequencies, ifreq); if( result != HACKRF_SUCCESS ) { - fprintf(stderr, "hackrf_init_scan() failed: %s (%d)\n", + fprintf(stderr, "hackrf_init_sweep() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 41f36fee..59f0f2c6 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1697,24 +1697,14 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) return p->bandwidth_hz; } -struct init_sweep_params { - uint16_t min_freq_mhz; - uint16_t max_freq_mhz; - uint16_t step_freq_mhz; -}; - int ADDCALL hackrf_init_sweep(hackrf_device* device, - const uint16_t min_freq_mhz, const uint16_t max_freq_mhz, - const uint16_t step_freq_mhz) + uint16_t* frequency_list, + int length) { - struct init_sweep_params params; - uint8_t length; - int result; + int result, i; - params.min_freq_mhz = TO_LE(min_freq_mhz); - params.max_freq_mhz = TO_LE(max_freq_mhz); - params.step_freq_mhz = TO_LE(step_freq_mhz); - length = sizeof(struct init_sweep_params); + for(i=0; iusb_device, @@ -1722,13 +1712,12 @@ int ADDCALL hackrf_init_sweep(hackrf_device* device, HACKRF_VENDOR_REQUEST_INIT_SWEEP, 0, 0, - (unsigned char*)¶ms, + (unsigned char*)frequency_list, length, 0 ); - if (result < length) - { + if (result < length) { return HACKRF_ERROR_LIBUSB; } else { return HACKRF_SUCCESS; diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 9fe11abb..54ad7092 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -198,8 +198,8 @@ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw_round_down_lt(c extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz); /* Start scan mode */ extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device, - const uint16_t min_freq_mhz, const uint16_t max_freq_mhz, - const uint16_t step_freq_mhz); + uint16_t* frequency_list, + int length); #ifdef __cplusplus } // __cplusplus defined. From f7cd712ff9324a19ae9040fd527ffb5b93b606eb Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sun, 11 Sep 2016 15:52:29 +0100 Subject: [PATCH 057/103] Fix up frequency list size --- firmware/hackrf_usb/usb_api_sweep.c | 2 +- host/libhackrf/src/hackrf.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index d2ee8ec5..1b4e40dc 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -45,7 +45,7 @@ usb_request_status_t usb_vendor_request_init_sweep( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if (stage == USB_TRANSFER_STAGE_SETUP) { - frequency_count = endpoint->setup.length; + frequency_count = endpoint->setup.length / sizeof(uint16_t); usb_transfer_schedule_block(endpoint->out, &frequencies, endpoint->setup.length, NULL, NULL); } else if (stage == USB_TRANSFER_STAGE_DATA) { diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 59f0f2c6..539fd0a7 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1702,6 +1702,7 @@ int ADDCALL hackrf_init_sweep(hackrf_device* device, int length) { int result, i; + int size = length * sizeof(frequency_list[0]); for(i=0; i Date: Thu, 15 Sep 2016 08:34:07 -0600 Subject: [PATCH 058/103] Extend frequency array to allow 6GHz sweeping --- firmware/hackrf_usb/usb_api_sweep.c | 2 +- host/hackrf-tools/src/hackrf_sweep.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 1b4e40dc..88a065d1 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -33,7 +33,7 @@ #define FREQ_GRANULARITY 1000000 #define MIN_FREQ 1 #define MAX_FREQ 6000 -#define MAX_FREQ_COUNT 500 +#define MAX_FREQ_COUNT 1000 volatile bool start_sweep_mode = false; static uint64_t sweep_freq; diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 014c2d18..dda62c1d 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -92,7 +92,7 @@ int gettimeofday(struct timeval *tv, void* ignored) { #define DEFAULT_BASEBAND_FILTER_BANDWIDTH (15000000) /* 5MHz default */ #define FREQ_STEP (DEFAULT_SAMPLE_RATE_HZ / FREQ_ONE_MHZ) -#define MAX_FREQ_COUNT 500 +#define MAX_FREQ_COUNT 1000 #if defined _WIN32 #define sleep(a) Sleep( (a*1000) ) From a95d1ac027621048cad8104ac6fa618086c6d077 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Sun, 18 Sep 2016 22:36:31 -0600 Subject: [PATCH 059/103] Add dwell time argument to hackrf sweep - untested because I'm not able to fire up my HackRF right now --- firmware/hackrf_usb/usb_api_sweep.c | 6 +++++- host/hackrf-tools/CMakeLists.txt | 2 +- host/hackrf-tools/src/hackrf_sweep.c | 18 +++++++++++++++--- host/libhackrf/src/hackrf.c | 6 +++--- host/libhackrf/src/hackrf.h | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 88a065d1..434b7fdc 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -40,11 +40,15 @@ static uint64_t sweep_freq; bool odd = true; static uint16_t frequencies[MAX_FREQ_COUNT]; static uint16_t frequency_count = 0; +static uint32_t dwell_blocks = 0; usb_request_status_t usb_vendor_request_init_sweep( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { + uint32_t dwell_time; if (stage == USB_TRANSFER_STAGE_SETUP) { + dwell_time = (endpoint->setup.index << 16) | endpoint->setup.value; + dwell_blocks = dwell_time / 0x4000; frequency_count = endpoint->setup.length / sizeof(uint16_t); usb_transfer_schedule_block(endpoint->out, &frequencies, endpoint->setup.length, NULL, NULL); @@ -95,7 +99,7 @@ void sweep_mode(void) { transfer = false; } - if (blocks_queued > 2) { + if (blocks_queued >= dwell_blocks) { if(++ifreq >= frequency_count) ifreq = 0; sweep_freq = frequencies[ifreq]; diff --git a/host/hackrf-tools/CMakeLists.txt b/host/hackrf-tools/CMakeLists.txt index cc7ff9be..82ea47d8 100644 --- a/host/hackrf-tools/CMakeLists.txt +++ b/host/hackrf-tools/CMakeLists.txt @@ -24,7 +24,7 @@ cmake_minimum_required(VERSION 2.8) project(hackrf-tools C) set(MAJOR_VERSION 0) -set(MINOR_VERSION 4) +set(MINOR_VERSION 5) set(PACKAGE hackrf-tools) set(VERSION_STRING ${MAJOR_VERSION}.${MINOR_VERSION}) set(VERSION ${VERSION_STRING}) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index dda62c1d..59127e7d 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -94,6 +94,8 @@ int gettimeofday(struct timeval *tv, void* ignored) { #define FREQ_STEP (DEFAULT_SAMPLE_RATE_HZ / FREQ_ONE_MHZ) #define MAX_FREQ_COUNT 1000 +#define DEFAULT_DWELL_TIME 0x4000 + #if defined _WIN32 #define sleep(a) Sleep( (a*1000) ) #endif @@ -239,6 +241,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[-s dwell_time] # Dwell time in samples, 0-%lu\n", (uint64_t)1<<32); } static hackrf_device* device = NULL; @@ -270,8 +273,9 @@ int main(int argc, char** argv) { float time_diff; unsigned int lna_gain=16, vga_gain=20, txvga_gain=0; uint16_t frequencies[MAX_FREQ_COUNT]; + uint32_t dwell_time = DEFAULT_DWELL_TIME; - while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:")) != EOF ) { + while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:s:")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) { @@ -316,6 +320,10 @@ int main(int argc, char** argv) { result = parse_u32(optarg, &txvga_gain); break; + case 's': + result = parse_u32(optarg, &dwell_time); + break; + default: fprintf(stderr, "unknown argument '-%c %s'\n", opt, optarg); usage(); @@ -335,6 +343,11 @@ int main(int argc, char** argv) { if (vga_gain % 2) fprintf(stderr, "warning: vga_gain (-g) must be a multiple of 2\n"); + if (dwell_time % 0x4000) { + fprintf(stderr, "warning: dwell_time (-s) must be a multiple of 16384\n"); + return EXIT_FAILURE; + } + if( amp ) { if( amp_enable > 1 ) { fprintf(stderr, "argument error: amp_enable shall be 0 or 1.\n"); @@ -433,8 +446,7 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - /* DGS FIXME: allow upper and lower frequencies to be set */ - result = hackrf_init_sweep(device, frequencies, ifreq); + result = hackrf_init_sweep(device, frequencies, ifreq, dwell_time); if( result != HACKRF_SUCCESS ) { fprintf(stderr, "hackrf_init_sweep() failed: %s (%d)\n", hackrf_error_name(result), result); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 539fd0a7..fffb04e5 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1699,7 +1699,7 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) int ADDCALL hackrf_init_sweep(hackrf_device* device, uint16_t* frequency_list, - int length) + int length, uint32_t dwell_time) { int result, i; int size = length * sizeof(frequency_list[0]); @@ -1711,8 +1711,8 @@ int ADDCALL hackrf_init_sweep(hackrf_device* device, device->usb_device, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, HACKRF_VENDOR_REQUEST_INIT_SWEEP, - 0, - 0, + dwell_time & 0xff, + (dwell_time >> 16) & 0xff, (unsigned char*)frequency_list, size, 0 diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 54ad7092..a318f6ed 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -199,7 +199,7 @@ extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t /* Start scan mode */ extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device, uint16_t* frequency_list, - int length); + int length, uint32_t dwell_time); #ifdef __cplusplus } // __cplusplus defined. From 146445483511ec6662e358c862afe3d0ba36d4b3 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Sun, 2 Oct 2016 19:17:03 +0100 Subject: [PATCH 060/103] Change dwell_time to num_samples --- host/hackrf-tools/src/hackrf_sweep.c | 16 ++++++++-------- host/libhackrf/src/hackrf.c | 8 +++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 59127e7d..13fe9f78 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -94,7 +94,7 @@ int gettimeofday(struct timeval *tv, void* ignored) { #define FREQ_STEP (DEFAULT_SAMPLE_RATE_HZ / FREQ_ONE_MHZ) #define MAX_FREQ_COUNT 1000 -#define DEFAULT_DWELL_TIME 0x4000 +#define DEFAULT_SAMPLE_COUNT 0x4000 #if defined _WIN32 #define sleep(a) Sleep( (a*1000) ) @@ -241,7 +241,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[-s dwell_time] # Dwell time in samples, 0-%lu\n", (uint64_t)1<<32); + fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 0-%lu\n", (uint64_t)1<<32); } static hackrf_device* device = NULL; @@ -273,7 +273,7 @@ int main(int argc, char** argv) { float time_diff; unsigned int lna_gain=16, vga_gain=20, txvga_gain=0; uint16_t frequencies[MAX_FREQ_COUNT]; - uint32_t dwell_time = DEFAULT_DWELL_TIME; + uint32_t num_samples = DEFAULT_SAMPLE_COUNT; while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:s:")) != EOF ) { result = HACKRF_SUCCESS; @@ -320,8 +320,8 @@ int main(int argc, char** argv) { result = parse_u32(optarg, &txvga_gain); break; - case 's': - result = parse_u32(optarg, &dwell_time); + case 'n': + result = parse_u32(optarg, &num_samples); break; default: @@ -343,8 +343,8 @@ int main(int argc, char** argv) { if (vga_gain % 2) fprintf(stderr, "warning: vga_gain (-g) must be a multiple of 2\n"); - if (dwell_time % 0x4000) { - fprintf(stderr, "warning: dwell_time (-s) must be a multiple of 16384\n"); + if (num_samples % 0x4000) { + fprintf(stderr, "warning: num_samples (-s) must be a multiple of 16384\n"); return EXIT_FAILURE; } @@ -446,7 +446,7 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - result = hackrf_init_sweep(device, frequencies, ifreq, dwell_time); + result = hackrf_init_sweep(device, frequencies, ifreq, num_samples); if( result != HACKRF_SUCCESS ) { fprintf(stderr, "hackrf_init_sweep() failed: %s (%d)\n", hackrf_error_name(result), result); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index fffb04e5..65bec61c 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1697,9 +1697,7 @@ uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz) return p->bandwidth_hz; } -int ADDCALL hackrf_init_sweep(hackrf_device* device, - uint16_t* frequency_list, - int length, uint32_t dwell_time) +int ADDCALL hackrf_init_sweep(hackrf_device* device, uint16_t* frequency_list, int length, uint32_t dwell_time) { int result, i; int size = length * sizeof(frequency_list[0]); @@ -1711,8 +1709,8 @@ int ADDCALL hackrf_init_sweep(hackrf_device* device, device->usb_device, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, HACKRF_VENDOR_REQUEST_INIT_SWEEP, - dwell_time & 0xff, - (dwell_time >> 16) & 0xff, + dwell_time & 0xffff, + (dwell_time >> 16) & 0xffff, (unsigned char*)frequency_list, size, 0 From 6639ab3e0966cd6a09c6e50016a16e8c43fee213 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Mon, 3 Oct 2016 12:34:38 +0100 Subject: [PATCH 061/103] Fix argument parsing for num_samples --- host/hackrf-tools/src/hackrf_sweep.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 13fe9f78..220c1d2c 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -194,8 +194,7 @@ int rx_callback(hackrf_transfer* transfer) { float frequency; int i, j; - if( fd != NULL ) - { + if( fd != NULL ) { byte_count += transfer->valid_length; bytes_to_write = transfer->valid_length; buf = (int8_t*) transfer->buffer; @@ -275,7 +274,7 @@ int main(int argc, char** argv) { uint16_t frequencies[MAX_FREQ_COUNT]; uint32_t num_samples = DEFAULT_SAMPLE_COUNT; - while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:s:")) != EOF ) { + while( (opt = getopt(argc, argv, "a:f:p:l:g:x:d:n:")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) { From 6b831d31cc15c323ba035183ff425b3980a9378c Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Mon, 3 Oct 2016 12:39:30 +0100 Subject: [PATCH 062/103] Stop dropping buffers in firmware and allow the host to make the decision. --- firmware/hackrf_usb/usb_api_sweep.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 434b7fdc..581faacc 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -89,13 +89,12 @@ void sweep_mode(void) { if (transfer) { *(uint16_t*)buffer = 0x7F7F; *(uint16_t*)(buffer+2) = sweep_freq; - if (blocks_queued > 1) - usb_transfer_schedule_block( - &usb_endpoint_bulk_in, - buffer, - 0x4000, - NULL, NULL - ); + usb_transfer_schedule_block( + &usb_endpoint_bulk_in, + buffer, + 0x4000, + NULL, NULL + ); transfer = false; } From 4b4cd181d8c74c081ec84f89661266288209899d Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Tue, 3 Jan 2017 22:25:32 +0200 Subject: [PATCH 063/103] Sync ready --- firmware/common/streaming.c | 4 +++- firmware/hackrf_usb/hackrf_usb.c | 32 ++++++++++++-------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/firmware/common/streaming.c b/firmware/common/streaming.c index 07db7b64..94f3f09a 100644 --- a/firmware/common/streaming.c +++ b/firmware/common/streaming.c @@ -25,6 +25,8 @@ #include #include +#include "hackrf_core.h" + void baseband_streaming_enable(sgpio_config_t* const sgpio_config) { nvic_set_priority(NVIC_SGPIO_IRQ, 0); nvic_enable_irq(NVIC_SGPIO_IRQ); @@ -37,4 +39,4 @@ void baseband_streaming_disable(sgpio_config_t* const sgpio_config) { sgpio_cpld_stream_disable(sgpio_config); nvic_disable_irq(NVIC_SGPIO_IRQ); -} \ No newline at end of file +} diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 7485b1f1..c97a8025 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -50,8 +50,6 @@ static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { baseband_streaming_disable(&sgpio_config); - disable_sync - usb_endpoint_disable(&usb_endpoint_bulk_in); usb_endpoint_disable(&usb_endpoint_bulk_out); @@ -74,14 +72,15 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { led_off(LED3); rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_OFF); vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; + + hw_sync_stop(); } if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { si5351c_activate_best_clock_source(&clock_gen); - wait_for_sync - - baseband_streaming_enable(&sgpio_config); + hw_sync_stop(); + hw_sync_syn(); } } @@ -253,28 +252,23 @@ int main(void) { rf_path_init(&rf_path); - bool synced = false; - int hw_sync_count = 0; - unsigned int phase = 0; - led_off(LED3); - hw_sync_syn(); while(true) { // Check whether we need to initiate a CPLD update if (start_cpld_update) cpld_update(); -// if(!synced) { - if(hw_sync_ready()) { - synced = true; - hw_sync_ack(); - led_on(LED3); - } -// } + while(true) { + if(hw_sync_ready()) { + hw_sync_ack(); + led_on(LED3); - //int gpio_sync_in_flag = gpio_get(gpio_sync_in); + baseband_streaming_enable(&sgpio_config); + break; + } + } // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 @@ -283,7 +277,6 @@ int main(void) { usb_transfer_schedule_block( (transceiver_mode() == TRANSCEIVER_MODE_RX) ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - //synced ? &usb_bulk_buffer[0x0000] : &usb_dummy_buffer[0x0000], &usb_bulk_buffer[0x0000], 0x4000, NULL, NULL @@ -298,7 +291,6 @@ int main(void) { usb_transfer_schedule_block( (transceiver_mode() == TRANSCEIVER_MODE_RX) ? &usb_endpoint_bulk_in : &usb_endpoint_bulk_out, - //synced ? &usb_bulk_buffer[0x4000] : &usb_dummy_buffer[0x4000], &usb_bulk_buffer[0x4000], 0x4000, NULL, NULL From ddb19a86fefebb7ce880604ec1bab6fda3083007 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Sun, 22 Jan 2017 22:28:11 +0200 Subject: [PATCH 064/103] Add vendor request for enabling/disabling gpio-based sync --- .gitignore | 1 + firmware/common/hackrf_core.h | 5 +++ firmware/hackrf_usb/hackrf_usb.c | 43 +++++++++++++++++------ firmware/hackrf_usb/usb_api_transceiver.h | 2 ++ host/hackrf-tools/src/hackrf_transfer.c | 22 +++++++++++- host/libhackrf/src/hackrf.c | 26 ++++++++++++++ host/libhackrf/src/hackrf.h | 3 ++ 7 files changed, 91 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 320f0b71..0c016b75 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.hex *.srec host/build/ +host/**/build # Operating system spew .DS_Store diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 78ccde41..16607e92 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -225,6 +225,11 @@ typedef enum { TRANSCEIVER_MODE_CPLD_UPDATE = 4 } transceiver_mode_t; +typedef enum { + HW_SYNC_MODE_OFF = 0, + HW_SYNC_MODE_ON = 1, +} hw_sync_mode_t; + void delay(uint32_t duration); /* TODO: Hide these configurations */ diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index c97a8025..99639633 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -46,6 +46,11 @@ #include "usb_bulk_buffer.h" static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; +static volatile hw_sync_mode_t _hw_sync_mode = HW_SYNC_MODE_OFF; + +void set_hw_sync_mode(const hw_sync_mode_t new_hw_sync_mode) { + _hw_sync_mode = new_hw_sync_mode; +} void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { baseband_streaming_disable(&sgpio_config); @@ -76,11 +81,16 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { hw_sync_stop(); } + hw_sync_stop(); + if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { si5351c_activate_best_clock_source(&clock_gen); - hw_sync_stop(); - hw_sync_syn(); + if( _hw_sync_mode != HW_SYNC_MODE_OFF) { + hw_sync_syn(); + } else { + baseband_streaming_enable(&sgpio_config); + } } } @@ -88,6 +98,19 @@ transceiver_mode_t transceiver_mode(void) { return _transceiver_mode; } +usb_request_status_t usb_vendor_request_set_hw_sync_mode( + usb_endpoint_t* const endpoint, + const usb_transfer_stage_t stage +) { + if( stage == USB_TRANSFER_STAGE_SETUP ) { + set_hw_sync_mode(endpoint->setup.value); + usb_transfer_schedule_ack(endpoint->in); + return USB_REQUEST_STATUS_OK; + } else { + return USB_REQUEST_STATUS_OK; + } +} + usb_request_status_t usb_vendor_request_set_transceiver_mode( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage @@ -144,6 +167,7 @@ static const usb_request_handler_fn vendor_request_handler[] = { #endif usb_vendor_request_set_freq_explicit, usb_vendor_request_read_wcid, // USB_WCID_VENDOR_REQ + usb_vendor_request_set_hw_sync_mode, }; static const uint32_t vendor_request_handler_count = @@ -260,15 +284,14 @@ int main(void) { cpld_update(); - while(true) { - if(hw_sync_ready()) { - hw_sync_ack(); - led_on(LED3); + if( _hw_sync_mode != HW_SYNC_MODE_OFF) { + while(!hw_sync_ready()) { } + hw_sync_ack(); + led_on(LED3); + + baseband_streaming_enable(&sgpio_config); + } - baseband_streaming_enable(&sgpio_config); - break; - } - } // Set up IN transfer of buffer 0. if ( usb_bulk_buffer_offset >= 16384 diff --git a/firmware/hackrf_usb/usb_api_transceiver.h b/firmware/hackrf_usb/usb_api_transceiver.h index 24244025..00c7fe44 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.h +++ b/firmware/hackrf_usb/usb_api_transceiver.h @@ -52,5 +52,7 @@ usb_request_status_t usb_vendor_request_set_antenna_enable( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); usb_request_status_t usb_vendor_request_set_freq_explicit( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); +usb_request_status_t usb_vendor_request_set_hw_sync_mode( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); #endif/*__USB_API_TRANSCEIVER_H__*/ diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index f38f7ba9..c08889cd 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -114,6 +114,11 @@ typedef enum { TRANSCEIVER_MODE_SS = 3, } transceiver_mode_t; +typedef enum { + HW_SYNC_MODE_OFF = 0, + HW_SYNC_MODE_ON = 1, +} hw_sync_mode_t; + /* WAVE or RIFF WAVE file format containing IQ 2x8bits data for HackRF compatible with SDR# Wav IQ file */ typedef struct { @@ -303,6 +308,8 @@ volatile uint32_t byte_count = 0; bool signalsource = false; uint32_t amplitude = 0; +bool hw_sync = false; + bool receive = false; bool receive_wav = false; @@ -463,6 +470,7 @@ static void usage() { printf("\t[-R] # Repeat TX mode (default is off) \n"); printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" ); printf("\t[-C ppm] # Set Internal crystal clock error in ppm.\n"); + printf("\t[-H] # Synchronise USB transfer using GPIO pins.\n"); } static hackrf_device* device = NULL; @@ -506,11 +514,14 @@ int main(int argc, char** argv) { float time_diff; unsigned int lna_gain=8, vga_gain=20, txvga_gain=0; - while( (opt = getopt(argc, argv, "wr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:C:R")) != EOF ) + while( (opt = getopt(argc, argv, "Hwr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:C:R")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) { + case 'H': + hw_sync = true; + break; case 'w': receive_wav = true; break; @@ -917,6 +928,15 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } + fprintf(stderr, "call hackrf_set_hw_sync_mode(%d)\n", + hw_sync); + result = hackrf_set_hw_sync_mode(device, hw_sync ? HW_SYNC_MODE_ON : HW_SYNC_MODE_OFF); + if( result != HACKRF_SUCCESS ) { + fprintf(stderr, "hackrf_set_hw_sync_mode() failed: %s (%d)\n", hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } + if( transceiver_mode == TRANSCEIVER_MODE_RX ) { result = hackrf_set_vga_gain(device, vga_gain); result |= hackrf_set_lna_gain(device, lna_gain); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 30789e25..cb96d88f 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -67,6 +67,7 @@ typedef enum { HACKRF_VENDOR_REQUEST_SET_TXVGA_GAIN = 21, HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23, HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, + HACKRF_VENDOR_REQUEST_SET_HW_SYNC_MODE = 26, } hackrf_vendor_request; typedef enum { @@ -82,6 +83,11 @@ typedef enum { TRANSCEIVER_MODE_CPLD_UPDATE = 4, } hackrf_transceiver_mode; +typedef enum { + HACKRF_HW_SYNC_MODE_OFF = 0, + HACKRF_HW_SYNC_MODE_ON = 1, +} hackrf_hw_sync_mode; + struct hackrf_device { libusb_device_handle* usb_device; struct libusb_transfer** transfers; @@ -1548,6 +1554,26 @@ int ADDCALL hackrf_close(hackrf_device* device) return result1; } +int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value) { + int result = libusb_control_transfer( + device->usb_device, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + HACKRF_VENDOR_REQUEST_SET_HW_SYNC_MODE, + value, + 0, + NULL, + 0, + 0 + ); + + if( result != 0 ) + { + return HACKRF_ERROR_LIBUSB; + } else { + return HACKRF_SUCCESS; + } +} + const char* ADDCALL hackrf_error_name(enum hackrf_error errcode) { switch(errcode) diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 7ac0530f..26327622 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -187,6 +187,9 @@ extern ADDAPI int ADDCALL hackrf_set_txvga_gain(hackrf_device* device, uint32_t /* antenna port power control */ extern ADDAPI int ADDCALL hackrf_set_antenna_enable(hackrf_device* device, const uint8_t value); +/* set hardware sync mode */ +extern ADDAPI int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value); + extern ADDAPI const char* ADDCALL hackrf_error_name(enum hackrf_error errcode); extern ADDAPI const char* ADDCALL hackrf_board_id_name(enum hackrf_board_id board_id); extern ADDAPI const char* ADDCALL hackrf_usb_board_id_name(enum hackrf_usb_board_id usb_board_id); From 8e4850d36eb9161811f543b2a0768cb1541ef87f Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 19 Jan 2017 16:12:05 -0700 Subject: [PATCH 065/103] Add HackRF tool to change operacake ports --- firmware/hackrf_usb/usb_api_operacake.c | 6 +- host/hackrf-tools/src/CMakeLists.txt | 4 + host/hackrf-tools/src/hackrf_operacake.c | 158 +++++++++++++++++++++++ 3 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 host/hackrf-tools/src/hackrf_operacake.c diff --git a/firmware/hackrf_usb/usb_api_operacake.c b/firmware/hackrf_usb/usb_api_operacake.c index 0f46b677..d9e5affa 100644 --- a/firmware/hackrf_usb/usb_api_operacake.c +++ b/firmware/hackrf_usb/usb_api_operacake.c @@ -38,9 +38,9 @@ usb_request_status_t usb_vendor_request_operacake_set_ports( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { uint8_t address, port_a, port_b; - address = endpoint->setup.index & 0xFF; - port_a = endpoint->setup.value & 0xFF; - port_b = (endpoint->setup.value >> 8) & 0xFF; + address = endpoint->setup.value & 0xFF; + port_a = endpoint->setup.index & 0xFF; + port_b = (endpoint->setup.index >> 8) & 0xFF; if (stage == USB_TRANSFER_STAGE_SETUP) { operacake_set_ports(address, port_a, port_b); usb_transfer_schedule_ack(endpoint->in); diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index 373e36b4..58fa23c5 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -50,6 +50,9 @@ install(TARGETS hackrf_cpldjtag RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) add_executable(hackrf_info hackrf_info.c) install(TARGETS hackrf_info RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) +add_executable(hackrf_operacake hackrf_operacake.c) +install(TARGETS hackrf_operacake RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) + if(NOT libhackrf_SOURCE_DIR) include_directories(${LIBHACKRF_INCLUDE_DIR}) LIST(APPEND TOOLS_LINK_LIBS ${LIBHACKRF_LIBRARIES}) @@ -69,3 +72,4 @@ target_link_libraries(hackrf_rffc5071 ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_spiflash ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_cpldjtag ${TOOLS_LINK_LIBS}) target_link_libraries(hackrf_info ${TOOLS_LINK_LIBS}) +target_link_libraries(hackrf_operacake ${TOOLS_LINK_LIBS}) diff --git a/host/hackrf-tools/src/hackrf_operacake.c b/host/hackrf-tools/src/hackrf_operacake.c new file mode 100644 index 00000000..086af5cb --- /dev/null +++ b/host/hackrf-tools/src/hackrf_operacake.c @@ -0,0 +1,158 @@ +/* + * Copyright 2016 Dominic Spill + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include +#include + +#ifndef bool +typedef int bool; +#define true 1 +#define false 0 +#endif + +static void usage() { + printf("\nUsage:\n"); + printf("\t-s, --serial : specify a particular device by serial number\n"); + printf("\t-d, --device : specify a particular device by number\n"); + printf("\t-o, --address : specify a particular operacake by address [default: 0x00]\n"); + printf("\t-a : set port A connection\n"); + printf("\t-b : set port B connection\n"); + printf("\t-v: verbose, list available operacake boards\n"); +} + +static struct option long_options[] = { + { "device", no_argument, 0, 'd' }, + { "serial", no_argument, 0, 's' }, + { "address", no_argument, 0, 'o' }, + { 0, 0, 0, 0 }, +}; + +int parse_int(char* const s, uint16_t* const value) { + char* s_end = s; + const long long_value = strtol(s, &s_end, 10); + if( (s != s_end) && (*s_end == 0) ) { + *value = (uint16_t)long_value; + return HACKRF_SUCCESS; + } else { + return HACKRF_ERROR_INVALID_PARAM; + } +} + +int main(int argc, char** argv) { + int opt; + const char* serial_number = NULL; + int device_index = 0; + int operacake_address = 0; + int port_a = 0; + int port_b = 0; + int verbose = 0; + uint8_t operacakes[8]; + int i = 0; + hackrf_device* device = NULL; + int option_index = 0; + + int result = hackrf_init(); + if( result ) { + printf("hackrf_init() failed: %s (%d)\n", hackrf_error_name(result), result); + return -1; + } + + while( (opt = getopt_long(argc, argv, "d:s:o:a:b:v", long_options, &option_index)) != EOF ) { + switch( opt ) { + case 'd': + device_index = atoi(optarg); + break; + + case 's': + serial_number = optarg; + break; + + case 'o': + operacake_address = atoi(optarg); + break; + + case 'a': + port_a = atoi(optarg); + break; + + case 'b': + port_b = atoi(optarg); + break; + + case 'v': + verbose = 1; + break; + + default: + usage(); + } + + if( result != HACKRF_SUCCESS ) { + printf("argument error: %s (%d)\n", hackrf_error_name(result), result); + break; + } + } + + if(serial_number != NULL) { + result = hackrf_open_by_serial(serial_number, &device); + } else { + hackrf_device_list_t* device_list = hackrf_device_list(); + if(device_list->devicecount <= 0) { + result = HACKRF_ERROR_NOT_FOUND; + } else { + result = hackrf_device_list_open(device_list, device_index, &device); + } + } + + if( result ) { + printf("hackrf_open() failed: %s (%d)\n", hackrf_error_name(result), result); + return -1; + } + + if(verbose) { + hackrf_get_operacake_boards(device, operacakes); + printf("Operacakes found:\n"); + for(i=0; i<8; i++) { + if(operacakes[i] !=0) + printf("%d\n", operacakes[i]); + } + printf("\n"); + } + + result = hackrf_set_operacake_ports(device, operacake_address, port_a, port_b); + if( result ) { + printf("hackrf_set_operacake_ports() failed: %s (%d)\n", hackrf_error_name(result), result); + return -1; + } + + result = hackrf_close(device); + if( result ) { + printf("hackrf_close() failed: %s (%d)\n", hackrf_error_name(result), result); + return -1; + } + + hackrf_exit(); + + return 0; +} From 18f014e11f143b424aa3e8d9988335519f241318 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Mon, 23 Jan 2017 16:11:47 -0700 Subject: [PATCH 066/103] Remove duplicate hackrf_operacake definition --- host/hackrf-tools/src/CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index 0896990a..a006c6ac 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -37,12 +37,9 @@ SET(TOOLS hackrf_spiflash hackrf_cpldjtag hackrf_info - hackrf_operacake + hackrf_operacake ) -add_executable(hackrf_operacake hackrf_operacake.c) -install(TARGETS hackrf_operacake RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) - if(NOT libhackrf_SOURCE_DIR) include_directories(${LIBHACKRF_INCLUDE_DIR}) LIST(APPEND TOOLS_LINK_LIBS ${LIBHACKRF_LIBRARIES}) From 7e7ce3dff1a97190ca54f1f6387faa5fe327cd7a Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Mon, 23 Jan 2017 16:31:32 -0700 Subject: [PATCH 067/103] removed pre-libhackrf python host code --- host/python/max2837_dump.py | 53 ---------------------------- host/python/set_transceiver_mode.py | 54 ----------------------------- 2 files changed, 107 deletions(-) delete mode 100755 host/python/max2837_dump.py delete mode 100755 host/python/set_transceiver_mode.py diff --git a/host/python/max2837_dump.py b/host/python/max2837_dump.py deleted file mode 100755 index 6624737b..00000000 --- a/host/python/max2837_dump.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2012 Jared Boone -# -# This file is part of HackRF. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -import usb -import struct -import sys - -device = usb.core.find(idVendor=0x1d50, idProduct=0x604b) -if device: - print 'Find: HackRF Jawbreaker' -else: - device = usb.core.find(idVendor=0x1d50, idProduct=0x6089) - if device: - print 'Find: HackRF One' - else: - device = usb.core.find(idVendor=0x1d50, idProduct=0xcc15) - if device: - print 'Find: rad1o' - else: - print 'Not find any HackRF device.' - sys.exit() -device.set_configuration() - -def read_max2837_register(register_number): - return struct.unpack(' Date: Mon, 23 Jan 2017 17:52:27 -0700 Subject: [PATCH 068/103] Remove duplicate hackrf_sweep definition --- host/hackrf-tools/src/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index 692e843f..6450623f 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -41,9 +41,6 @@ SET(TOOLS hackrf_sweep ) -add_executable(hackrf_sweep hackrf_sweep.c) -install(TARGETS hackrf_sweep RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) - if(NOT libhackrf_SOURCE_DIR) include_directories(${LIBHACKRF_INCLUDE_DIR}) LIST(APPEND TOOLS_LINK_LIBS ${LIBHACKRF_LIBRARIES}) From 66f2c0fa1c1c53273537d18aefc8eb0d747f92c5 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Mon, 23 Jan 2017 18:10:49 -0700 Subject: [PATCH 069/103] Check for FFTW3 before building as it is required for hackrf_sweep --- host/hackrf-tools/src/CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index 120cbb22..e4e2389a 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -23,10 +23,13 @@ set(INSTALL_DEFAULT_BINDIR "bin" CACHE STRING "Appended to CMAKE_INSTALL_PREFIX") +INCLUDE(FindPkgConfig) +pkg_check_modules(FFTW REQUIRED fftw3f) + if(MSVC) -add_library(libgetopt_static STATIC - ../getopt/getopt.c -) + add_library(libgetopt_static STATIC + ../getopt/getopt.c + ) endif() SET(TOOLS @@ -40,9 +43,6 @@ SET(TOOLS hackrf_sweep ) -add_executable(hackrf_sweep hackrf_sweep.c) -install(TARGETS hackrf_sweep RUNTIME DESTINATION ${INSTALL_DEFAULT_BINDIR}) - if(NOT libhackrf_SOURCE_DIR) include_directories(${LIBHACKRF_INCLUDE_DIR}) LIST(APPEND TOOLS_LINK_LIBS ${LIBHACKRF_LIBRARIES}) From ca58a55df67354b98935f928d4b1d545c12362c7 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Mon, 23 Jan 2017 18:15:59 -0700 Subject: [PATCH 070/103] Add fftw3 to travis build --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ccdbafd6..0cfb57bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,3 +39,4 @@ addons: apt: packages: - libusb-1.0-0-dev + - libfftw3-dev From b3c56f58e6f325b46922b2b50ee080ce46fbc430 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Mon, 23 Jan 2017 21:57:24 -0700 Subject: [PATCH 071/103] added fftw for osx to travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0cfb57bc..17b790a8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ before_script: before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libusb; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libusb fftw; fi script: - mkdir host/build From 8b51f21c372e2ba785b04cf36b7f5d4ba2f644a3 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Mon, 23 Jan 2017 22:11:35 -0700 Subject: [PATCH 072/103] Added fftw dependency to README for host build on Linux. It should be added for Windows too, but I am not qualified to do so properly. --- host/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/README.md b/host/README.md index 6b7f8bb4..2b9363c7 100644 --- a/host/README.md +++ b/host/README.md @@ -5,7 +5,7 @@ produce a low cost, open source software radio platform. ###Prerequisites for Linux (Debian/Ubuntu): -`sudo apt-get install build-essential cmake libusb-1.0-0-dev pkg-config` +`sudo apt-get install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev` ###Build host software on Linux: From 533b5a4150ab17486f95f562f46abd60b0500a19 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Tue, 24 Jan 2017 22:09:03 +0200 Subject: [PATCH 073/103] Remove dummy buffer --- firmware/hackrf_usb/hackrf_usb.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 99639633..b85d05db 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -238,16 +238,6 @@ void usb_set_descriptor_by_serial_number(void) } int main(void) { - uint8_t usb_dummy_buffer[32768]; - for(int i = 0; i < 0x4000; i += 2) { - usb_dummy_buffer[i] = 0xff; - usb_dummy_buffer[i + 1] = 0x0; - } - for(int i = 0x4000; i < 0x8000; i += 2) { - usb_dummy_buffer[i] = 0xff; - usb_dummy_buffer[i + 1] = 0x0; - } - pin_setup(); enable_1v8_power(); #ifdef HACKRF_ONE From fdeaa92b7e7fdd78c25f6f16e04027b435eeaa70 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 24 Jan 2017 15:44:15 -0700 Subject: [PATCH 074/103] Replace python one liner with script to build dfu files --- firmware/dfu.py | 7 +++++++ firmware/hackrf-common.cmake | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 firmware/dfu.py diff --git a/firmware/dfu.py b/firmware/dfu.py new file mode 100644 index 00000000..97ead047 --- /dev/null +++ b/firmware/dfu.py @@ -0,0 +1,7 @@ +import os.path +import struct + +with open("_header.bin", "wb") as f: + x = struct.pack(' _header.bin + COMMAND python ../../dfu.py COMMAND cat _header.bin _tmp.dfu >${PROJECT_NAME}.dfu - COMMAND rm -f _tmp.dfu _header.bin + #COMMAND rm -f _tmp.dfu _header.bin ) add_custom_target( From 14efd8ba5851bcd41071584ef57152175e0fe361 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Tue, 24 Jan 2017 16:37:53 -0700 Subject: [PATCH 075/103] updated GCC toolchain URL in firmware README --- firmware/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/README b/firmware/README index 6ded0231..07fb628d 100644 --- a/firmware/README +++ b/firmware/README @@ -6,7 +6,7 @@ projects. The cpld directory contains HDL source for the CPLD. The firmware is set up for compilation with the GCC toolchain available here: -https://launchpad.net/gcc-arm-embedded +https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads Required dependency: From 1ad2577f5567c3b986d8c5355adedf23870cc49b Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 24 Jan 2017 17:21:42 -0700 Subject: [PATCH 076/103] Reinstate commands to clean up after DFU process --- firmware/hackrf-common.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index f9cc9176..f8c35b33 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -196,7 +196,7 @@ macro(DeclareTargets) COMMAND ${DFU_COMMAND} COMMAND python ../../dfu.py COMMAND cat _header.bin _tmp.dfu >${PROJECT_NAME}.dfu - #COMMAND rm -f _tmp.dfu _header.bin + COMMAND rm -f _tmp.dfu _header.bin ) add_custom_target( From 2ebb8a4c5311cf49fd526c601d3693bcdddfa112 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Tue, 24 Jan 2017 19:45:19 -0700 Subject: [PATCH 077/103] Avoided osx build problem by using literal string instead of format string. Fixed minor bug in warning text. --- host/hackrf-tools/src/hackrf_sweep.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index 220c1d2c..a1460735 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -240,7 +240,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-%lu\n", (uint64_t)1<<32); + fprintf(stderr, "\t[-n num_samples] # Number of samples per frequency, 0-4294967296\n"); } static hackrf_device* device = NULL; @@ -343,7 +343,7 @@ int main(int argc, char** argv) { fprintf(stderr, "warning: vga_gain (-g) must be a multiple of 2\n"); if (num_samples % 0x4000) { - fprintf(stderr, "warning: num_samples (-s) must be a multiple of 16384\n"); + fprintf(stderr, "warning: num_samples (-n) must be a multiple of 16384\n"); return EXIT_FAILURE; } From e8157a4ef2dbd24d1513e7e6a4ddffe55ab7dea6 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Wed, 25 Jan 2017 01:51:53 -0700 Subject: [PATCH 078/103] Build firmware as part of Travis-ci build --- .travis.yml | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 17b790a8..157def85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ language: c cache: apt sudo: false +dist: trusty os: - linux @@ -10,33 +11,44 @@ os: compiler: - gcc -# - clang + - clang + +matrix: + exclude: + - os: osx + compiler: gcc + - os: linux + compiler: clang before_script: -# - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q1-update/+download/gcc-arm-none-eabi-5_3-2016q1-20160330-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 -# - tar -xvf /tmp/gcc-arm.tar.bz2 -# - export PATH=$PWD/gcc-arm-none-eabi-5_3-2016q1/bin:$PATH - export CFLAGS="-Wall -Wextra -Werror" before_install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libusb fftw; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew tap PX4/homebrew-px4; brew update; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libusb fftw gcc-arm-none-eabi dfu-util; fi + # For virtualenv(?) reasons we can't apt-get install python-yaml + - pip install PyYAML script: - mkdir host/build - cd host/build - cmake .. - make -# - cd ../../firmware/hackrf_usb -# - mkdir build -# - cd build -# - export CC="arm-none-eabi-gcc" -# - export CXX="arm-none-eabi-g++" -# - cmake .. -# - make + - cd ../../firmware/libopencm3 + - make + - cd ../hackrf_usb + - mkdir build + - cd build + - cmake .. + - make addons: apt: + sources: + - debian-sid packages: - libusb-1.0-0-dev - libfftw3-dev + - gcc-arm-none-eabi + - libnewlib-arm-none-eabi + - dfu-util From ba4ffbb1e42f392750a7e2578828d8b0c50b17ac Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Wed, 25 Jan 2017 15:32:25 -0700 Subject: [PATCH 079/103] hackrf_transfer: made -n option compatible with -R (repeat TX mode). -n limits the total number of samples transferred via USB. This fixes issue #192. --- host/hackrf-tools/src/hackrf_transfer.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index d3630825..ed4bc6ad 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -423,15 +423,17 @@ int tx_callback(hackrf_transfer* transfer) { bytes_to_xfer -= bytes_to_read; } bytes_read = fread(transfer->buffer, 1, bytes_to_read, fd); - if ((bytes_read != bytes_to_read) - || (limit_num_samples && (bytes_to_xfer == 0))) { + if (limit_num_samples && (bytes_to_xfer == 0)) { + return -1; + } + if (bytes_read != bytes_to_read) { if (repeat) { printf("Input file end reached. Rewind to beginning.\n"); rewind(fd); fread(transfer->buffer + bytes_read, 1, bytes_to_read - bytes_read, fd); return 0; } else { - return -1; // not loopback mode, EOF + return -1; /* not repeat mode, end of file */ } } else { From 95c9ac6ffa1ccf697404bb9b66cd4e9171634e73 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Wed, 25 Jan 2017 16:32:20 -0700 Subject: [PATCH 080/103] Support files larger than 2147483647 bytes on 32-bit platforms. Fixes issue #152. --- host/hackrf-tools/src/hackrf_sweep.c | 2 ++ host/hackrf-tools/src/hackrf_transfer.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/host/hackrf-tools/src/hackrf_sweep.c b/host/hackrf-tools/src/hackrf_sweep.c index a1460735..da700fa2 100644 --- a/host/hackrf-tools/src/hackrf_sweep.c +++ b/host/hackrf-tools/src/hackrf_sweep.c @@ -35,6 +35,8 @@ #include #include +#define _FILE_OFFSET_BITS 64 + #ifndef bool typedef int bool; #define true 1 diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index ed4bc6ad..f44a0e25 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -34,6 +34,8 @@ #include #include +#define _FILE_OFFSET_BITS 64 + #ifndef bool typedef int bool; #define true 1 From a6b9f8f96dab3f74b8971ecb92c1ee5e1827c9e6 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 15:24:55 -0700 Subject: [PATCH 081/103] fixed operacake indentation warning in firmware --- firmware/common/operacake.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index ec7df4ba..eecf298f 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -130,13 +130,14 @@ uint8_t operacake_set_ports(uint8_t address, uint8_t PA, uint8_t PB) { return 1; } - if(PA > OPERACAKE_PA4) + if(PA > OPERACAKE_PA4) { side = OPERACAKE_CROSSOVER; - else + } else { side = OPERACAKE_SAMESIDE; + } - pa = port_to_pins(PA); - pb = port_to_pins(PB); + pa = port_to_pins(PA); + pb = port_to_pins(PB); reg = (OPERACAKE_GPIO_DISABLE | side | pa | pb | OPERACAKE_EN_LEDS); From 439ddaaa40b657ce1de4203e0b314c35c5234de0 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 17:00:41 -0700 Subject: [PATCH 082/103] Support compiling with Visual Studio --- host/hackrf-tools/src/CMakeLists.txt | 8 +- host/hackrf-tools/src/hackrf_transfer.c | 116 +++++++++++++----------- host/libhackrf/src/hackrf.c | 7 +- host/libhackrf/src/hackrf.h | 4 +- 4 files changed, 73 insertions(+), 62 deletions(-) diff --git a/host/hackrf-tools/src/CMakeLists.txt b/host/hackrf-tools/src/CMakeLists.txt index b30e492c..d8f602c1 100644 --- a/host/hackrf-tools/src/CMakeLists.txt +++ b/host/hackrf-tools/src/CMakeLists.txt @@ -24,12 +24,15 @@ set(INSTALL_DEFAULT_BINDIR "bin" CACHE STRING "Appended to CMAKE_INSTALL_PREFIX") INCLUDE(FindPkgConfig) -pkg_check_modules(FFTW REQUIRED fftw3f) if(MSVC) add_library(libgetopt_static STATIC ../getopt/getopt.c ) +else() + pkg_check_modules(FFTW REQUIRED fftw3f) + LIST(APPEND TOOLS hackrf_sweep) + LIST(APPEND TOOLS_LINK_LIBS m fftw3f) endif() SET(TOOLS @@ -41,7 +44,6 @@ SET(TOOLS hackrf_cpldjtag hackrf_info hackrf_operacake - hackrf_sweep ) if(NOT libhackrf_SOURCE_DIR) @@ -55,8 +57,6 @@ if(MSVC) LIST(APPEND TOOLS_LINK_LIBS libgetopt_static) endif() -LIST(APPEND TOOLS_LINK_LIBS m fftw3f) - foreach(tool ${TOOLS}) add_executable(${tool} ${tool}.c) target_link_libraries(${tool} ${TOOLS_LINK_LIBS}) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index f44a0e25..ee27fd6c 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -379,26 +379,28 @@ int rx_callback(hackrf_transfer* transfer) { } } if (stream_size>0){ - if ((stream_size-1+stream_head-stream_tail)%stream_size buffer,bytes_to_write); - }else{ - memcpy(stream_buf+stream_tail,transfer->buffer,(stream_size-stream_tail)); - memcpy(stream_buf,transfer->buffer+(stream_size-stream_tail),bytes_to_write-(stream_size-stream_tail)); - }; - __atomic_store_n(&stream_tail,(stream_tail+bytes_to_write)%stream_size,__ATOMIC_RELEASE); +#ifndef _WIN32 + if ((stream_size-1+stream_head-stream_tail)%stream_size buffer,bytes_to_write); + } else { + memcpy(stream_buf+stream_tail,transfer->buffer,(stream_size-stream_tail)); + memcpy(stream_buf,transfer->buffer+(stream_size-stream_tail),bytes_to_write-(stream_size-stream_tail)); + }; + __atomic_store_n(&stream_tail,(stream_tail+bytes_to_write)%stream_size,__ATOMIC_RELEASE); } +#endif return 0; - }else{ - bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); - if ((bytes_written != bytes_to_write) - || (limit_num_samples && (bytes_to_xfer == 0))) { - return -1; } else { - return 0; - } + bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); + if ((bytes_written != bytes_to_write) + || (limit_num_samples && (bytes_to_xfer == 0))) { + return -1; + } else { + return 0; + } } } else { return -1; @@ -490,7 +492,10 @@ static void usage() { printf("\t[-s sample_rate_hz] # Sample rate in Hz (4/8/10/12.5/16/20MHz, default %sMHz).\n", u64toa((DEFAULT_SAMPLE_RATE_HZ/FREQ_ONE_MHZ),&ascii_u64_data1)); printf("\t[-n num_samples] # Number of samples to transfer (default is unlimited).\n"); +#ifndef _WIN32 +/* The required atomic load/store functions aren't available when using C with MSVC */ printf("\t[-S buf_size] # Enable receive streaming with buffer size buf_size.\n"); +#endif printf("\t[-c amplitude] # CW signal source mode, amplitude 0-127 (DC value to DAC).\n"); printf("\t[-R] # Repeat TX mode (default is off) \n"); printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" ); @@ -1041,48 +1046,49 @@ int main(int argc, char** argv) { uint32_t byte_count_now; struct timeval time_now; float time_difference, rate; - if (stream_size>0){ - if(stream_head==stream_tail){ - usleep(10000); // queue empty - }else{ - ssize_t len; - ssize_t bytes_written; - uint32_t _st= __atomic_load_n(&stream_tail,__ATOMIC_ACQUIRE); - if(stream_head<_st) - len=_st-stream_head; - else - len=stream_size-stream_head; - bytes_written = fwrite(stream_buf+stream_head, 1, len, fd); - if (len != bytes_written){ - printf("write failed"); - do_exit=true; - }; - stream_head=(stream_head+len)%stream_size; + if (stream_size>0) { +#ifndef _WIN32 + if(stream_head==stream_tail) { + usleep(10000); // queue empty + } else { + ssize_t len; + ssize_t bytes_written; + uint32_t _st= __atomic_load_n(&stream_tail,__ATOMIC_ACQUIRE); + if(stream_head<_st) + len=_st-stream_head; + else + len=stream_size-stream_head; + bytes_written = fwrite(stream_buf+stream_head, 1, len, fd); + if (len != bytes_written) { + printf("write failed"); + do_exit=true; + }; + stream_head=(stream_head+len)%stream_size; } - if(stream_drop>0){ - uint32_t drops= __atomic_exchange_n (&stream_drop,0,__ATOMIC_SEQ_CST); - printf("dropped frames: [%d]\n",drops); + if(stream_drop>0) { + uint32_t drops= __atomic_exchange_n (&stream_drop,0,__ATOMIC_SEQ_CST); + printf("dropped frames: [%d]\n",drops); } - }else{ - sleep(1); - - gettimeofday(&time_now, NULL); - - byte_count_now = byte_count; - byte_count = 0; - - time_difference = TimevalDiff(&time_now, &time_start); - rate = (float)byte_count_now / time_difference; - fprintf(stderr, "%4.1f MiB / %5.3f sec = %4.1f MiB/second\n", - (byte_count_now / 1e6f), time_difference, (rate / 1e6f) ); +#endif + } else { + sleep(1); + gettimeofday(&time_now, NULL); + + byte_count_now = byte_count; + byte_count = 0; + + time_difference = TimevalDiff(&time_now, &time_start); + rate = (float)byte_count_now / time_difference; + fprintf(stderr, "%4.1f MiB / %5.3f sec = %4.1f MiB/second\n", + (byte_count_now / 1e6f), time_difference, (rate / 1e6f) ); - time_start = time_now; + time_start = time_now; - if (byte_count_now == 0) { - exit_code = EXIT_FAILURE; - fprintf(stderr, "\nCouldn't transfer any bytes for one second.\n"); - break; - } + if (byte_count_now == 0) { + exit_code = EXIT_FAILURE; + fprintf(stderr, "\nCouldn't transfer any bytes for one second.\n"); + break; + } } } diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 59b7eee3..b308cda6 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -26,6 +26,11 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI #include #include + +#ifdef _WIN32 +/* Avoid redefinition of timespec from time.h (included by libusb.h) */ +#define HAVE_STRUCT_TIMESPEC 1 +#endif #include #ifndef bool @@ -396,7 +401,7 @@ hackrf_device_list_t* ADDCALL hackrf_device_list() serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); if( serial_number_length == 32 ) { serial_number[32] = 0; - list->serial_numbers[idx] = strndup(serial_number, serial_number_length); + list->serial_numbers[idx] = strdup(serial_number); } libusb_close(usb_device); diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 296be3d8..3db40f5c 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -216,8 +216,8 @@ extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device, int length, uint32_t dwell_time); /* Operacake functions */ -int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards); -int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, +extern ADDAPI int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards); +extern ADDAPI int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, uint8_t address, uint8_t port_a, uint8_t port_b); From a23f4676c63ac254183ad6fe9c4f82b61d1062e2 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 18:15:40 -0700 Subject: [PATCH 083/103] Initial appveyor config --- appveyor.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..d118996b --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,27 @@ +os: Visual Studio 2015 +clone_depth: 1 + +configuration: + - Release + - Debug + +install: + - appveyor DownloadFile "https://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Flibusb%2Ffiles%2Flibusb-1.0%2Flibusb-1.0.21%2F&ts=1485478643&use_mirror=cytranet" -FileName "C:\libusb.7z" + - 7z x -y "C:\libusb.7z" -o "C:\libusb" + - appveyor DownloadFile "ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip" -FileName "C:\pthreads-w32-release.zip" + - 7z x -y "C:\pthreads-w32-release.zip" -o "C:\pthreads" + - appveyor DownloadFile "http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip" -FileName "C:\pkg-config_win32.zip" + - 7z x -y "C:\pkg-config_win32.zip" -o "C:\pkg-config" + + +build_script: + - mkdir c:\projects\hackrf\host\build + - cd c:\projects\hackrf\host\build + - cmake -G "Visual Studio 14 2015" \ + -DLIBUSB_LIBRARIES="C:\\libusb\\MS64\\dll\\libusb-1.0.lib" \ + -DLIBUSB_INCLUDE_DIRS="C:\\libusb\\include\\libusb-1.0" \ + -DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads\Pre-built.2\include \ + -DTHREADS_PTHREADS_WIN32_LIBRARY=c:\pthreads\Pre-built.2\lib\x64\pthreadVC2.lib \ + -DPKG_CONFIG_EXECUTABLE="C:\\pkg-config\\bin\\pkg-config.exe" \ + .. + - msbuild .\ALL_BUILD.vcxproj /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" From f433b60d4c8ed46552b95339f092f5a31687d212 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 18:18:33 -0700 Subject: [PATCH 084/103] Fix 7zip command line args --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d118996b..1167d8f0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,11 +7,11 @@ configuration: install: - appveyor DownloadFile "https://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Flibusb%2Ffiles%2Flibusb-1.0%2Flibusb-1.0.21%2F&ts=1485478643&use_mirror=cytranet" -FileName "C:\libusb.7z" - - 7z x -y "C:\libusb.7z" -o "C:\libusb" + - 7z x -y "C:\libusb.7z" -o"C:\libusb" - appveyor DownloadFile "ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip" -FileName "C:\pthreads-w32-release.zip" - - 7z x -y "C:\pthreads-w32-release.zip" -o "C:\pthreads" + - 7z x -y "C:\pthreads-w32-release.zip" -o"C:\pthreads" - appveyor DownloadFile "http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip" -FileName "C:\pkg-config_win32.zip" - - 7z x -y "C:\pkg-config_win32.zip" -o "C:\pkg-config" + - 7z x -y "C:\pkg-config_win32.zip" -o"C:\pkg-config" build_script: From b453b915329840e6af1f307d089e9991e0d7fe09 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 18:21:18 -0700 Subject: [PATCH 085/103] Use http rather than ftp to download dependencies --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 1167d8f0..664bba4d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,7 +8,7 @@ configuration: install: - appveyor DownloadFile "https://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Flibusb%2Ffiles%2Flibusb-1.0%2Flibusb-1.0.21%2F&ts=1485478643&use_mirror=cytranet" -FileName "C:\libusb.7z" - 7z x -y "C:\libusb.7z" -o"C:\libusb" - - appveyor DownloadFile "ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip" -FileName "C:\pthreads-w32-release.zip" + - appveyor DownloadFile "http://mirrors.kernel.org/sourceware/pthreads-win32/pthreads-w32-2-9-1-release.zip" -FileName "C:\pthreads-w32-release.zip" - 7z x -y "C:\pthreads-w32-release.zip" -o"C:\pthreads" - appveyor DownloadFile "http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip" -FileName "C:\pkg-config_win32.zip" - 7z x -y "C:\pkg-config_win32.zip" -o"C:\pkg-config" From e5811b752c41cd65b4f72c45f5cdb99709292a69 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 18:27:34 -0700 Subject: [PATCH 086/103] Correct libusb include dir argument to cmake --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 664bba4d..f0f73939 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ build_script: - cd c:\projects\hackrf\host\build - cmake -G "Visual Studio 14 2015" \ -DLIBUSB_LIBRARIES="C:\\libusb\\MS64\\dll\\libusb-1.0.lib" \ - -DLIBUSB_INCLUDE_DIRS="C:\\libusb\\include\\libusb-1.0" \ + -DLIBUSB_INCLUDE_DIR="C:\\libusb\\include\\libusb-1.0" \ -DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads\Pre-built.2\include \ -DTHREADS_PTHREADS_WIN32_LIBRARY=c:\pthreads\Pre-built.2\lib\x64\pthreadVC2.lib \ -DPKG_CONFIG_EXECUTABLE="C:\\pkg-config\\bin\\pkg-config.exe" \ From fbf78f48cb7cbde6e7ae6970c05a46434004e4b3 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 18:32:30 -0700 Subject: [PATCH 087/103] Remove unnecessary escaping --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f0f73939..030cddaa 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,10 +18,10 @@ build_script: - mkdir c:\projects\hackrf\host\build - cd c:\projects\hackrf\host\build - cmake -G "Visual Studio 14 2015" \ - -DLIBUSB_LIBRARIES="C:\\libusb\\MS64\\dll\\libusb-1.0.lib" \ - -DLIBUSB_INCLUDE_DIR="C:\\libusb\\include\\libusb-1.0" \ + -DLIBUSB_LIBRARIES="C:\libusb\MS64\dll\libusb-1.0.lib" \ + -DLIBUSB_INCLUDE_DIR="C:\libusb\include\libusb-1.0" \ -DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads\Pre-built.2\include \ -DTHREADS_PTHREADS_WIN32_LIBRARY=c:\pthreads\Pre-built.2\lib\x64\pthreadVC2.lib \ - -DPKG_CONFIG_EXECUTABLE="C:\\pkg-config\\bin\\pkg-config.exe" \ + -DPKG_CONFIG_EXECUTABLE="C:\pkg-config\bin\pkg-config.exe" \ .. - msbuild .\ALL_BUILD.vcxproj /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" From a5f8cdf7cadf5655153084f34a2cdbf3d3da8760 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Thu, 26 Jan 2017 18:38:33 -0700 Subject: [PATCH 088/103] Build Win64 version --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 030cddaa..4869b2a0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -17,7 +17,7 @@ install: build_script: - mkdir c:\projects\hackrf\host\build - cd c:\projects\hackrf\host\build - - cmake -G "Visual Studio 14 2015" \ + - cmake -G "Visual Studio 14 2015 Win64" \ -DLIBUSB_LIBRARIES="C:\libusb\MS64\dll\libusb-1.0.lib" \ -DLIBUSB_INCLUDE_DIR="C:\libusb\include\libusb-1.0" \ -DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads\Pre-built.2\include \ From f388a3f9d9168860b544dd753efc1dedd2ae50f4 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 18:26:46 -0700 Subject: [PATCH 089/103] For anti-aliasing, the baseband filter bandwidth is automatically set to the widest available setting that is no more than 75% of the sample rate. This happens every time the sample rate is set. If you want to override the baseband filter selection, you must do so after setting the sample rate. --- host/libhackrf/src/hackrf.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index b308cda6..1ff55195 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -1109,6 +1109,11 @@ typedef struct { } set_fracrate_params_t; +/* + * You should probably use hackrf_set_sample_rate() below instead of this + * function. They both result in automatic baseband filter selection as + * described below. + */ int ADDCALL hackrf_set_sample_rate_manual(hackrf_device* device, const uint32_t freq_hz, uint32_t divider) { @@ -1135,10 +1140,17 @@ int ADDCALL hackrf_set_sample_rate_manual(hackrf_device* device, { return HACKRF_ERROR_LIBUSB; } else { - return HACKRF_SUCCESS; + return hackrf_set_baseband_filter_bandwidth(device, + hackrf_compute_baseband_filter_bw((uint32_t)(0.75*freq_hz/divider))); } } +/* + * For anti-aliasing, the baseband filter bandwidth is automatically set to the + * widest available setting that is no more than 75% of the sample rate. This + * happens every time the sample rate is set. If you want to override the + * baseband filter selection, you must do so after setting the sample rate. + */ int ADDCALL hackrf_set_sample_rate(hackrf_device* device, const double freq) { const int MAX_N = 32; From b3246972edac591f4f5dd2e77b4e6ca0ae4cbb81 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 18:57:53 -0700 Subject: [PATCH 090/103] use new libhackrf automatic baseband filter selection in hackrf_transfer --- host/hackrf-tools/src/hackrf_transfer.c | 46 ++++++++++++------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index ee27fd6c..d28759d4 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -498,7 +498,7 @@ static void usage() { #endif printf("\t[-c amplitude] # CW signal source mode, amplitude 0-127 (DC value to DAC).\n"); printf("\t[-R] # Repeat TX mode (default is off) \n"); - printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" ); + printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default <= 0.75 * sample_rate_hz.\n" ); printf("\t[-C ppm] # Set Internal crystal clock error in ppm.\n"); printf("\t[-H] # Synchronise USB transfer using GPIO pins.\n"); } @@ -798,24 +798,20 @@ int main(int argc, char** argv) { { /* Compute nearest freq for bw filter */ baseband_filter_bw_hz = hackrf_compute_baseband_filter_bw(baseband_filter_bw_hz); - }else - { - /* Compute default value depending on sample rate */ - baseband_filter_bw_hz = hackrf_compute_baseband_filter_bw_round_down_lt(sample_rate_hz); - } - if (baseband_filter_bw_hz > BASEBAND_FILTER_BW_MAX) { - fprintf(stderr, "argument error: baseband_filter_bw_hz must be less or equal to %u Hz/%.03f MHz\n", - BASEBAND_FILTER_BW_MAX, (float)(BASEBAND_FILTER_BW_MAX/FREQ_ONE_MHZ)); - usage(); - return EXIT_FAILURE; - } + if (baseband_filter_bw_hz > BASEBAND_FILTER_BW_MAX) { + fprintf(stderr, "argument error: baseband_filter_bw_hz must be less or equal to %u Hz/%.03f MHz\n", + BASEBAND_FILTER_BW_MAX, (float)(BASEBAND_FILTER_BW_MAX/FREQ_ONE_MHZ)); + usage(); + return EXIT_FAILURE; + } - if (baseband_filter_bw_hz < BASEBAND_FILTER_BW_MIN) { - fprintf(stderr, "argument error: baseband_filter_bw_hz must be greater or equal to %u Hz/%.03f MHz\n", - BASEBAND_FILTER_BW_MIN, (float)(BASEBAND_FILTER_BW_MIN/FREQ_ONE_MHZ)); - usage(); - return EXIT_FAILURE; + if (baseband_filter_bw_hz < BASEBAND_FILTER_BW_MIN) { + fprintf(stderr, "argument error: baseband_filter_bw_hz must be greater or equal to %u Hz/%.03f MHz\n", + BASEBAND_FILTER_BW_MIN, (float)(BASEBAND_FILTER_BW_MIN/FREQ_ONE_MHZ)); + usage(); + return EXIT_FAILURE; + } } if( (transmit == false) && (receive == receive_wav) ) @@ -954,13 +950,15 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - fprintf(stderr, "call hackrf_baseband_filter_bandwidth_set(%d Hz/%.03f MHz)\n", - baseband_filter_bw_hz, ((float)baseband_filter_bw_hz/(float)FREQ_ONE_MHZ)); - result = hackrf_set_baseband_filter_bandwidth(device, baseband_filter_bw_hz); - if( result != HACKRF_SUCCESS ) { - fprintf(stderr, "hackrf_baseband_filter_bandwidth_set() failed: %s (%d)\n", hackrf_error_name(result), result); - usage(); - return EXIT_FAILURE; + if( baseband_filter_bw ) { + fprintf(stderr, "call hackrf_baseband_filter_bandwidth_set(%d Hz/%.03f MHz)\n", + baseband_filter_bw_hz, ((float)baseband_filter_bw_hz/(float)FREQ_ONE_MHZ)); + result = hackrf_set_baseband_filter_bandwidth(device, baseband_filter_bw_hz); + if( result != HACKRF_SUCCESS ) { + fprintf(stderr, "hackrf_baseband_filter_bandwidth_set() failed: %s (%d)\n", hackrf_error_name(result), result); + usage(); + return EXIT_FAILURE; + } } fprintf(stderr, "call hackrf_set_hw_sync_mode(%d)\n", From 560b390f6c3fa3e4ee5085312331311879e6b762 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 19:03:39 -0700 Subject: [PATCH 091/103] use preferred hackrf_sample_rate_set() instead of older function in hackrf_transfer --- host/hackrf-tools/src/hackrf_transfer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index d28759d4..8ee5142a 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -942,10 +942,10 @@ int main(int argc, char** argv) { signal(SIGTERM, &sigint_callback_handler); signal(SIGABRT, &sigint_callback_handler); #endif - fprintf(stderr, "call hackrf_sample_rate_set(%u Hz/%.03f MHz)\n", sample_rate_hz,((float)sample_rate_hz/(float)FREQ_ONE_MHZ)); - result = hackrf_set_sample_rate_manual(device, sample_rate_hz, 1); + fprintf(stderr, "call hackrf_set_sample_rate(%u Hz/%.03f MHz)\n", sample_rate_hz,((float)sample_rate_hz/(float)FREQ_ONE_MHZ)); + result = hackrf_set_sample_rate(device, sample_rate_hz); if( result != HACKRF_SUCCESS ) { - fprintf(stderr, "hackrf_sample_rate_set() failed: %s (%d)\n", hackrf_error_name(result), result); + fprintf(stderr, "hackrf_set_sample_rate() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } From e3a3bffca58180adf49612bd600c9e7f705c4dbb Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 22:21:18 -0700 Subject: [PATCH 092/103] fixed bug in dfu.py that made it only work for hackrf_usb --- firmware/dfu.py | 3 ++- firmware/hackrf-common.cmake | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/firmware/dfu.py b/firmware/dfu.py index 97ead047..d8057505 100644 --- a/firmware/dfu.py +++ b/firmware/dfu.py @@ -1,7 +1,8 @@ import os.path import struct +import sys with open("_header.bin", "wb") as f: - x = struct.pack('${PROJECT_NAME}.dfu COMMAND rm -f _tmp.dfu _header.bin ) From 33eeb33c4be3a64496d022e311ddedf6c5d84d9e Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 23:29:38 -0700 Subject: [PATCH 093/103] have Travis-ci build all firmware, not just hackrf_usb --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 157def85..790f33f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ script: - make - cd ../../firmware/libopencm3 - make - - cd ../hackrf_usb + - cd .. - mkdir build - cd build - cmake .. From 4dae32fb1b74a35dc684d2cab0e2379f81e7a933 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 23:39:41 -0700 Subject: [PATCH 094/103] fixed unused variable warning in blinky --- firmware/blinky/blinky.c | 1 - 1 file changed, 1 deletion(-) diff --git a/firmware/blinky/blinky.c b/firmware/blinky/blinky.c index d3aeea0a..631ce907 100644 --- a/firmware/blinky/blinky.c +++ b/firmware/blinky/blinky.c @@ -23,7 +23,6 @@ int main(void) { - int i; pin_setup(); /* enable all power supplies */ From 6ddb7948e6139b9fd23bb9bc193a35a663967a64 Mon Sep 17 00:00:00 2001 From: Michael Ossmann Date: Thu, 26 Jan 2017 23:40:02 -0700 Subject: [PATCH 095/103] fixed indentation warning in sgpio-rx --- firmware/sgpio-rx/sgpio-rx.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/firmware/sgpio-rx/sgpio-rx.c b/firmware/sgpio-rx/sgpio-rx.c index 4922541e..4eec4133 100644 --- a/firmware/sgpio-rx/sgpio-rx.c +++ b/firmware/sgpio-rx/sgpio-rx.c @@ -46,20 +46,20 @@ void tx_test() { } void rx_test() { - volatile uint32_t buffer[4096]; - uint32_t i = 0; + volatile uint32_t buffer[4096]; + uint32_t i = 0; uint32_t magsq; int8_t sigi, sigq; - rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_RX); - sgpio_cpld_stream_enable(&sgpio_config); + rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_RX); + sgpio_cpld_stream_enable(&sgpio_config); led_on(LED2); - while(true) { - while(SGPIO_STATUS_1 == 0); + while(true) { + while(SGPIO_STATUS_1 == 0); led_on(LED1); - SGPIO_CLR_STATUS_1 = 1; - buffer[i & 4095] = SGPIO_REG_SS(SGPIO_SLICE_A); + SGPIO_CLR_STATUS_1 = 1; + buffer[i & 4095] = SGPIO_REG_SS(SGPIO_SLICE_A); /* find the magnitude squared */ sigi = buffer[i & 4095] & 0xff; @@ -72,7 +72,7 @@ void rx_test() { else led_off(LED3); i++; - } + } } int main(void) { @@ -86,7 +86,7 @@ int main(void) { enable_rf_power(); #endif cpu_clock_init(); - rf_path_init(&rf_path); + rf_path_init(&rf_path); set_freq(freq); From bb24dd5efe765ee657632cc5048bf60a8dc77d5f Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 11:52:29 -0700 Subject: [PATCH 096/103] Update readme.md to reflect current build instructions * udev rule * Visual Studio instructions * General clean up --- host/README.md | 107 ++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 59 deletions(-) diff --git a/host/README.md b/host/README.md index 2b9363c7..5efd28f6 100644 --- a/host/README.md +++ b/host/README.md @@ -4,34 +4,34 @@ produce a low cost, open source software radio platform. ##How to build the host software on Linux: ###Prerequisites for Linux (Debian/Ubuntu): - `sudo apt-get install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev` ###Build host software on Linux: +``` +mkdir host/build +cd host/build +cmake .. +make +sudo make install +sudo ldconfig +``` -`cd host` +By defualt this will attempt to install a udev rule to '/etc/udev/rules.d` to +provide the `usb` or `plugdev` group access to HackRF. If your setup requires +the udev rule to be installed elsewhere you can modify the path with +`-DUDEV_RULES_PATH=/path/to/udev`. -`mkdir build` - -`cd build` - -`cmake ../ -DINSTALL_UDEV_RULES=ON` - -`make` - -`sudo make install` - -`sudo ldconfig` +Note: The udev rule is not installed for by default for PyBOMBS installs as +they do not ususally get installed with root privileges. ##Clean CMake temporary files/dirs: - -`cd host/build` - -`rm -rf *` +``` +cd host/build +rm -rf * +``` ##How to build host software on Windows: - -###Prerequisites for cygwin or mingw: +###Prerequisites for cygwin, mingw, or Visual Studio: * cmake-2.8.12.1 or more see http://www.cmake.org/cmake/resources/software.html * libusbx-1.0.18 or more see http://sourceforge.net/projects/libusbx/files/latest/download?source=files @@ -43,56 +43,45 @@ produce a low cost, open source software radio platform. Ctrl C is not managed correctly and especially for hackrf_transfer the Ctrl C(abort) will not stop correctly and will corrupt the file. ###For Cygwin: - -`cd host` - -`mkdir build` - -`cd build` - -`cmake ../ -G "Unix Makefiles" -DCMAKE_LEGACY_CYGWIN_WIN32=1 -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/` - -`make` - -`make install` - +``` +mkdir host/build +cd host/build +cmake ../ -G "Unix Makefiles" -DCMAKE_LEGACY_CYGWIN_WIN32=1 -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ +make +make install +``` ###For MinGW: +``` +mkdir host/build +cd host/build +cmake ../ -G "MSYS Makefiles" -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ +make +make install +``` -`cd host` +###For Visual Studio 2015 x64 +``` +c:\hackrf\host\build> cmake ../ -G "Visual Studio 14 2015 Win64" \ +-DLIBUSB_INCLUDE_DIR=c:\libusb-1.0.18-win\include\libusb-1.0 \ +-DLIBUSB_LIBRARIES=c:\libusb-1.0.18-win\MS64\static\libusb-1.0.lib \ +-DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads-w32-2-9-1-release\Pre-built.2\include \ +-DTHREADS_PTHREADS_WIN32_LIBRARY=c:\pthreads-w32-2-9-1-release\Pre-built.2\lib\x64\pthreadVC2.lib +``` -`mkdir build` - -`cd build` - -Normal version: - -* -`cmake ../ -G "MSYS Makefiles" -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/` - -Debug version: - -* -`cmake ../ -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/` - -`make` - -`make install` - -###For Visual Studio 2012 x64 -`c:\hackrf\host\cmake>cmake ../ -G "Visual Studio 11 2012 Win64" -DLIBUSB_INCLUDE_DIR=c:\libusb-1.0.18-win\include\libusb-1.0 -DLIBUSB_LIBRARIES=c:\libusb-1.0.18-win\MS64\static\libusb-1.0.lib -DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads-w32-2-9-1-release\Pre-built.2\include -DTHREADS_PTHREADS_WIN32_LIBRARY=c:\pthreads-w32-2-9-1-release\Pre-built.2\lib\x64\pthreadVC2.lib` - -Solution file: `c:\hackrf\host\cmake\hackrf_all.sln` +Cmake will produce a solution file named `hackrf_all.sln` and a series of +project files which can be used with msbuild as follows: +`c:\hackrf\host\build> msbuild ALL_BUILD.vcxproj` ##How to build host the software on FreeBSD - You can use the binary package: `# pkg install hackrf` You can build and install from ports: -`# cd /usr/ports/comms/hackrf` -`# make install` - +``` +# cd /usr/ports/comms/hackrf +# make install +``` principal author: Michael Ossmann From 8efc85d39eb444370b29ef3f8a48f00dc8c68672 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 12:02:25 -0700 Subject: [PATCH 097/103] Remove out of date readme files. Up to date information can be found in host/README.md --- host/hackrf-tools/Readme.md | 34 ---------------------------------- host/libhackrf/Readme.md | 33 --------------------------------- 2 files changed, 67 deletions(-) delete mode 100644 host/hackrf-tools/Readme.md delete mode 100644 host/libhackrf/Readme.md diff --git a/host/hackrf-tools/Readme.md b/host/hackrf-tools/Readme.md deleted file mode 100644 index beb0c947..00000000 --- a/host/hackrf-tools/Readme.md +++ /dev/null @@ -1,34 +0,0 @@ -This repository contains hardware designs and software for HackRF, a project to -produce a low cost, open source software radio platform. - -![Jawbreaker](https://raw.github.com/mossmann/hackrf/master/doc/jawbreaker.jpeg) - -How to build host software on Windows: -prerequisite for cygwin or mingw: -* cmake-2.8.10.2 or more see http://www.cmake.org/cmake/resources/software.html -* libusbx-1.0.14 or more see http://sourceforge.net/projects/libusbx/files/latest/download?source=files -* Install Windows driver for HackRF hardware or use Zadig see http://sourceforge.net/projects/libwdi/files/zadig - - If you want to use Zadig select HackRF USB device and just install/replace it with WinUSB driver. -* Build libhackrf before to build this library, see host/libhackrf/Readme.md. - -For Cygwin: -cmake -G "Unix Makefiles" -DCMAKE_LEGACY_CYGWIN_WIN32=1 -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ -make -make install - -For Mingw: -#normal version -cmake -G "MSYS Makefiles" -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ -#debug version -cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ -make -make install - -How to build host software on Linux: -cmake ./ -make -make install - -principal author: Michael Ossmann - -http://greatscottgadgets.com/hackrf/ diff --git a/host/libhackrf/Readme.md b/host/libhackrf/Readme.md deleted file mode 100644 index 40321c82..00000000 --- a/host/libhackrf/Readme.md +++ /dev/null @@ -1,33 +0,0 @@ -This repository contains hardware designs and software for HackRF, a project to -produce a low cost, open source software radio platform. - -![Jawbreaker](https://raw.github.com/mossmann/hackrf/master/doc/jawbreaker.jpeg) - -How to build host software on Windows: -prerequisite for cygwin or mingw: -* cmake-2.8.10.2 or more see http://www.cmake.org/cmake/resources/software.html -* libusbx-1.0.14 or more see http://sourceforge.net/projects/libusbx/files/latest/download?source=files -* Install Windows driver for HackRF hardware or use Zadig see http://sourceforge.net/projects/libwdi/files/zadig - - If you want to use Zadig select HackRF USB device and just install/replace it with WinUSB driver. - -For Cygwin: -cmake -G "Unix Makefiles" -DCMAKE_LEGACY_CYGWIN_WIN32=1 -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ -make -make install - -For Mingw: -#normal version -cmake -G "MSYS Makefiles" -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ -#debug version -cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ -make -make install - -How to build host software on Linux: -cmake ./ -make -make install - -principal author: Michael Ossmann - -http://greatscottgadgets.com/hackrf/ From 63db12053dc06936139837ac4a1efe0788cc04b9 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 12:11:55 -0700 Subject: [PATCH 098/103] Jawbreaker firmware builds --- .travis.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 790f33f3..8476bf27 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,13 +34,17 @@ script: - cd host/build - cmake .. - make - - cd ../../firmware/libopencm3 + - cd ../.. + - mkdir firmware/build-hackrf-one + - mkdir firmware/build-jawbreaker + - cd firmware/libopencm3 - make - - cd .. - - mkdir build - - cd build + - cd ../build-hackrf-one - cmake .. - make + - cd ../build-jawbreaker + - cmake -DBOARD=JAWBREAKER .. + - make addons: apt: From cb06ce965636ec1612c1e655da98a367f87f0065 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 12:24:19 -0700 Subject: [PATCH 099/103] ifdef out HackRF One rf path pins for jawbreaker build --- firmware/common/hackrf_core.c | 8 +++++--- firmware/common/rf_path.c | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 6212c974..d71b9f53 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -99,9 +99,9 @@ static struct gpio_t gpio_sync_out_b = GPIO(3, 9); #endif /* RF LDO control */ -#ifdef JAWBREAKER -static struct gpio_t gpio_rf_ldo_enable = GPIO(2, 9); -#endif +// #ifdef JAWBREAKER +// static struct gpio_t gpio_rf_ldo_enable = GPIO(2, 9); +// #endif /* RF supply (VAA) control */ #ifdef HACKRF_ONE @@ -297,6 +297,7 @@ sgpio_config_t sgpio_config = { rf_path_t rf_path = { .switchctrl = 0, +#ifdef HACKRF_ONE .gpio_hp = &gpio_hp, .gpio_lp = &gpio_lp, .gpio_tx_mix_bp = &gpio_tx_mix_bp, @@ -310,6 +311,7 @@ rf_path_t rf_path = { .gpio_amp_bypass = &gpio_amp_bypass, .gpio_rx_amp = &gpio_rx_amp, .gpio_no_rx_amp_pwr = &gpio_no_rx_amp_pwr, +#endif }; jtag_gpio_t jtag_gpio_cpld = { diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 7db1101a..78860936 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -157,6 +157,7 @@ static void switchctrl_set_hackrf_one(rf_path_t* const rf_path, uint8_t ctrl) { static void switchctrl_set(rf_path_t* const rf_path, const uint8_t gpo) { #ifdef JAWBREAKER + (void) rf_path; /* silence unused param warning */ rffc5071_set_gpo(&rffc5072, gpo); #elif HACKRF_ONE switchctrl_set_hackrf_one(rf_path, gpo); @@ -205,6 +206,8 @@ void rf_path_pin_setup(rf_path_t* const rf_path) { * power and enable both amp bypass and mixer bypass. */ switchctrl_set(rf_path, SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_MIX_BYPASS); +#else + (void) rf_path; /* silence unused param warning */ #endif } From b047dd0cb44c6125698aebe0dc9bf1ddb7ea4350 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 15:03:53 -0700 Subject: [PATCH 100/103] Add software controlled reset --- firmware/hackrf_usb/hackrf_usb.c | 3 +- firmware/hackrf_usb/usb_api_board_info.c | 11 ++++++ firmware/hackrf_usb/usb_api_board_info.h | 2 + firmware/libopencm3 | 2 +- host/hackrf-tools/src/hackrf_spiflash.c | 50 ++++++++++++++++-------- host/libhackrf/src/hackrf.c | 20 ++++++++++ host/libhackrf/src/hackrf.h | 2 + 7 files changed, 72 insertions(+), 18 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index c82bf179..2e7cf8f9 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -80,7 +80,8 @@ static const usb_request_handler_fn vendor_request_handler[] = { usb_vendor_request_init_sweep, usb_vendor_request_operacake_get_boards, usb_vendor_request_operacake_set_ports, - usb_vendor_request_set_hw_sync_mode + usb_vendor_request_set_hw_sync_mode, + usb_vendor_request_reset }; static const uint32_t vendor_request_handler_count = diff --git a/firmware/hackrf_usb/usb_api_board_info.c b/firmware/hackrf_usb/usb_api_board_info.c index 7cad222f..ba2a6ddd 100644 --- a/firmware/hackrf_usb/usb_api_board_info.c +++ b/firmware/hackrf_usb/usb_api_board_info.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -91,3 +92,13 @@ usb_request_status_t usb_vendor_request_read_partid_serialno( } return USB_REQUEST_STATUS_OK; } + +usb_request_status_t usb_vendor_request_reset( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) +{ + if (stage == USB_TRANSFER_STAGE_SETUP) { + wwdt_reset(100000); + usb_transfer_schedule_ack(endpoint->in); + } + return USB_REQUEST_STATUS_OK; +} \ No newline at end of file diff --git a/firmware/hackrf_usb/usb_api_board_info.h b/firmware/hackrf_usb/usb_api_board_info.h index 90a76cb9..39824b8d 100644 --- a/firmware/hackrf_usb/usb_api_board_info.h +++ b/firmware/hackrf_usb/usb_api_board_info.h @@ -39,5 +39,7 @@ usb_request_status_t usb_vendor_request_read_version_string( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); usb_request_status_t usb_vendor_request_read_partid_serialno( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); +usb_request_status_t usb_vendor_request_reset( + usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage); #endif /* end of include guard: __USB_API_BOARD_INFO_H__ */ diff --git a/firmware/libopencm3 b/firmware/libopencm3 index 0ca89139..d3d6f3e7 160000 --- a/firmware/libopencm3 +++ b/firmware/libopencm3 @@ -1 +1 @@ -Subproject commit 0ca89139446586e743b842fb1074db0f2173f6dd +Subproject commit d3d6f3e74b34593d1b56175abe5b4cb72da4ec9d diff --git a/host/hackrf-tools/src/hackrf_spiflash.c b/host/hackrf-tools/src/hackrf_spiflash.c index 20a50d3f..bb5c53bb 100644 --- a/host/hackrf-tools/src/hackrf_spiflash.c +++ b/host/hackrf-tools/src/hackrf_spiflash.c @@ -91,6 +91,7 @@ static void usage() printf("\t-r : Read data into file.\n"); printf("\t-w : Write data from file.\n"); printf("\t-d : Serial number of device, if multiple devices\n"); + printf("\t-R: Reset HackRF after other operations.\n"); printf("\t-v: Verbose output.\n"); } @@ -112,8 +113,9 @@ int main(int argc, char** argv) bool read = false; bool write = false; bool verbose = false; + bool reset = false; - while ((opt = getopt_long(argc, argv, "a:l:r:w:d:v", long_options, + while ((opt = getopt_long(argc, argv, "a:l:r:w:d:vR", long_options, &option_index)) != EOF) { switch (opt) { case 'a': @@ -142,6 +144,10 @@ int main(int argc, char** argv) verbose = true; break; + case 'R': + reset = true; + break; + default: fprintf(stderr, "opt error: %d\n", opt); usage(); @@ -156,17 +162,17 @@ int main(int argc, char** argv) } } - if (write == read) { - if (write == true) { + if((write == read) && (write == reset)) { + if(write && read) { fprintf(stderr, "Read and write options are mutually exclusive.\n"); } else { - fprintf(stderr, "Specify either read or write option.\n"); + fprintf(stderr, "Specify either read, write, or reset option.\n"); } usage(); return EXIT_FAILURE; } - if (path == NULL) { + if((read || write) && (path == NULL)) { fprintf(stderr, "Specify a path to a file.\n"); usage(); return EXIT_FAILURE; @@ -214,7 +220,7 @@ int main(int argc, char** argv) } } - if (fd == NULL) { + if((read || write) && (fd == NULL)) { fprintf(stderr, "Failed to open file: %s\n", path); return EXIT_FAILURE; } @@ -233,8 +239,7 @@ int main(int argc, char** argv) return EXIT_FAILURE; } - if (read) - { + if(read) { ssize_t bytes_written; tmp_length = length; while (tmp_length) @@ -261,7 +266,9 @@ int main(int argc, char** argv) fd = NULL; return EXIT_FAILURE; } - } else { + } + + if(write) { ssize_t bytes_read = fread(data, 1, length, fd); if (bytes_read != length) { fprintf(stderr, "Failed read file (read %d bytes).\n", @@ -297,13 +304,24 @@ int main(int argc, char** argv) } } - result = hackrf_close(device); - if (result != HACKRF_SUCCESS) { - fprintf(stderr, "hackrf_close() failed: %s (%d)\n", - hackrf_error_name(result), result); - fclose(fd); - fd = NULL; - return EXIT_FAILURE; + if(reset) { + result = hackrf_reset(device); + if (result != HACKRF_SUCCESS) { + fprintf(stderr, "hackrf_reset() failed: %s (%d)\n", + hackrf_error_name(result), result); + fclose(fd); + fd = NULL; + return EXIT_FAILURE; + } + } else { + result = hackrf_close(device); + if (result != HACKRF_SUCCESS) { + fprintf(stderr, "hackrf_close() failed: %s (%d)\n", + hackrf_error_name(result), result); + fclose(fd); + fd = NULL; + return EXIT_FAILURE; + } } hackrf_exit(); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 1ff55195..30c604f2 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -77,6 +77,7 @@ typedef enum { HACKRF_VENDOR_REQUEST_OPERACAKE_GET_BOARDS = 27, HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS = 28, HACKRF_VENDOR_REQUEST_SET_HW_SYNC_MODE = 29, + HACKRF_VENDOR_REQUEST_RESET = 30, } hackrf_vendor_request; typedef enum { @@ -1829,6 +1830,25 @@ int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, } } +int ADDCALL hackrf_reset(hackrf_device* device) { + int result = libusb_control_transfer( + device->usb_device, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + HACKRF_VENDOR_REQUEST_RESET, + 0, + 0, + NULL, + 0, + 0 + ); + + if( result != 0 ) { + return HACKRF_ERROR_LIBUSB; + } else { + return HACKRF_SUCCESS; + } +} + #ifdef __cplusplus } // __cplusplus defined. #endif diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 3db40f5c..06826aad 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -222,6 +222,8 @@ extern ADDAPI int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, uint8_t port_a, uint8_t port_b); +extern ADDAPI int ADDCALL hackrf_reset(hackrf_device* device); + #ifdef __cplusplus } // __cplusplus defined. #endif From 7584fd211e18b2f9c04cb87d6a81ee4c77d6e592 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 15:26:37 -0700 Subject: [PATCH 101/103] Update submodule to include watchdog reset changes --- firmware/libopencm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/libopencm3 b/firmware/libopencm3 index 0ca89139..d3d6f3e7 160000 --- a/firmware/libopencm3 +++ b/firmware/libopencm3 @@ -1 +1 @@ -Subproject commit 0ca89139446586e743b842fb1074db0f2173f6dd +Subproject commit d3d6f3e74b34593d1b56175abe5b4cb72da4ec9d From 9e78ccb4e7505a6cdc4232a3875b4373bb922537 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 16:06:01 -0700 Subject: [PATCH 102/103] Correct argument parsing logic --- host/hackrf-tools/src/hackrf_spiflash.c | 24 ++++++++++++------------ host/hackrf-tools/src/hackrf_transfer.c | 4 ++++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_spiflash.c b/host/hackrf-tools/src/hackrf_spiflash.c index bb5c53bb..3304b5b3 100644 --- a/host/hackrf-tools/src/hackrf_spiflash.c +++ b/host/hackrf-tools/src/hackrf_spiflash.c @@ -148,8 +148,12 @@ int main(int argc, char** argv) reset = true; break; + case '?': + usage(); + return EXIT_FAILURE; + default: - fprintf(stderr, "opt error: %d\n", opt); + fprintf(stderr, "unknown argument '-%c %s'\n", opt, optarg); usage(); return EXIT_FAILURE; } @@ -162,28 +166,24 @@ int main(int argc, char** argv) } } - if((write == read) && (write == reset)) { - if(write && read) { - fprintf(stderr, "Read and write options are mutually exclusive.\n"); - } else { - fprintf(stderr, "Specify either read, write, or reset option.\n"); - } + if(write && read) { + fprintf(stderr, "Read and write options are mutually exclusive.\n"); usage(); return EXIT_FAILURE; } - - if((read || write) && (path == NULL)) { - fprintf(stderr, "Specify a path to a file.\n"); + + if(!(write || read || reset)) { + fprintf(stderr, "Specify either read, write, or reset option.\n"); usage(); return EXIT_FAILURE; - } + } if( write ) { fd = fopen(path, "rb"); if(fd == NULL) { - printf("Error to open file %s\n", path); + printf("Error opening file %s\n", path); return EXIT_FAILURE; } /* Get size of the file */ diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index 8ee5142a..a36166c6 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -673,6 +673,10 @@ int main(int argc, char** argv) { result = parse_u32(optarg, &crystal_correct_ppm); break; + case '?': + usage(); + return EXIT_FAILURE; + default: fprintf(stderr, "unknown argument '-%c %s'\n", opt, optarg); usage(); From da743b84ef98567c401faafba00740bb2d6af4ce Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Jan 2017 16:08:57 -0700 Subject: [PATCH 103/103] Safely call hackrf_close() after resetting the HackRF --- host/hackrf-tools/src/hackrf_spiflash.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_spiflash.c b/host/hackrf-tools/src/hackrf_spiflash.c index 3304b5b3..49cc2bf9 100644 --- a/host/hackrf-tools/src/hackrf_spiflash.c +++ b/host/hackrf-tools/src/hackrf_spiflash.c @@ -313,15 +313,15 @@ int main(int argc, char** argv) fd = NULL; return EXIT_FAILURE; } - } else { - result = hackrf_close(device); - if (result != HACKRF_SUCCESS) { - fprintf(stderr, "hackrf_close() failed: %s (%d)\n", - hackrf_error_name(result), result); - fclose(fd); - fd = NULL; - return EXIT_FAILURE; - } + } + + result = hackrf_close(device); + if (result != HACKRF_SUCCESS) { + fprintf(stderr, "hackrf_close() failed: %s (%d)\n", + hackrf_error_name(result), result); + fclose(fd); + fd = NULL; + return EXIT_FAILURE; } hackrf_exit();