From 47ea4326e963abca60c4b86c36cd373b19eec6bf Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Fri, 8 Jul 2016 23:36:03 +0200 Subject: [PATCH 01/10] 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 02/10] 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 b57b32afa5907fdab65d7bd6489ce60a8e526112 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Fri, 9 Dec 2016 23:36:46 +0200 Subject: [PATCH 03/10] 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 04/10] 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 05/10] 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 06/10] 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 25929965f5446733dd30e5f8e7d1d1ffc75073cc Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Thu, 15 Dec 2016 21:56:49 +0200 Subject: [PATCH 07/10] 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 4b4cd181d8c74c081ec84f89661266288209899d Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Tue, 3 Jan 2017 22:25:32 +0200 Subject: [PATCH 08/10] 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 09/10] 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 533b5a4150ab17486f95f562f46abd60b0500a19 Mon Sep 17 00:00:00 2001 From: Mike Davis Date: Tue, 24 Jan 2017 22:09:03 +0200 Subject: [PATCH 10/10] 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