From 190c3972f4a9c28028181e8bb156d1dc01681e77 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 20:18:25 -0700 Subject: [PATCH] Clock reference: Add UI hook. Simplify selection code. --- firmware/common/hackrf-ui.c | 2 ++ firmware/common/hackrf-ui.h | 2 ++ firmware/common/hackrf_core.c | 14 ++++++++------ firmware/common/ui_portapack.c | 4 ++++ firmware/common/ui_rad1o.c | 6 ++++++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/firmware/common/hackrf-ui.c b/firmware/common/hackrf-ui.c index bca2e86a..bb1a045d 100644 --- a/firmware/common/hackrf-ui.c +++ b/firmware/common/hackrf-ui.c @@ -41,6 +41,7 @@ void hackrf_ui_set_bb_tx_vga_gain_null(const uint32_t gain_db) { UNUSED(gain_db) void hackrf_ui_set_first_if_frequency_null(const uint64_t frequency) { UNUSED(frequency); } void hackrf_ui_set_filter_null(const rf_path_filter_t filter) { UNUSED(filter); } void hackrf_ui_set_antenna_bias_null(bool antenna_bias) { UNUSED(antenna_bias); } +void hackrf_ui_set_clock_source_null(clock_source_t source) { UNUSED(source); } /* Null UI function table, used if there's no hardware UI detected. Eliminates the * need to check for null UI before calling a function in the table. @@ -58,6 +59,7 @@ static const hackrf_ui_t hackrf_ui_null = { &hackrf_ui_set_first_if_frequency_null, &hackrf_ui_set_filter_null, &hackrf_ui_set_antenna_bias_null, + &hackrf_ui_set_clock_source_null, }; static const hackrf_ui_t* ui = NULL; diff --git a/firmware/common/hackrf-ui.h b/firmware/common/hackrf-ui.h index 3d4565db..5ac07ada 100644 --- a/firmware/common/hackrf-ui.h +++ b/firmware/common/hackrf-ui.h @@ -37,6 +37,7 @@ typedef void (*hackrf_ui_set_bb_tx_vga_gain_fn)(const uint32_t gain_db); typedef void (*hackrf_ui_set_first_if_frequency_fn)(const uint64_t frequency); typedef void (*hackrf_ui_set_filter_fn)(const rf_path_filter_t filter); typedef void (*hackrf_ui_set_antenna_bias_fn)(bool antenna_bias); +typedef void (*hackrf_ui_set_clock_source_fn)(clock_source_t source); typedef struct { hackrf_ui_init_fn init; @@ -51,6 +52,7 @@ typedef struct { hackrf_ui_set_first_if_frequency_fn set_first_if_frequency; hackrf_ui_set_filter_fn set_filter; hackrf_ui_set_antenna_bias_fn set_antenna_bias; + hackrf_ui_set_clock_source_fn set_clock_source; } hackrf_ui_t; /* TODO: Lame hack to know that PortaPack was detected. diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index ca1c3389..d7666322 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -725,10 +725,11 @@ clock_source_t activate_best_clock_source(void) } #endif + clock_source_t source = CLOCK_SOURCE_HACKRF; + /* Check for external clock input. */ if (si5351c_clkin_signal_valid(&clock_gen)) { - si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); - return CLOCK_SOURCE_EXTERNAL; + source = CLOCK_SOURCE_EXTERNAL; } else { #ifdef HACKRF_ONE /* Enable PortaPack reference oscillator (if present), and check for valid clock. */ @@ -736,17 +737,18 @@ clock_source_t activate_best_clock_source(void) portapack_reference_oscillator(true); delay(510000); /* loop iterations @ 204MHz for >10ms for oscillator to enable. */ if (si5351c_clkin_signal_valid(&clock_gen)) { - si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); - return CLOCK_SOURCE_PORTAPACK; + source = CLOCK_SOURCE_PORTAPACK; } else { portapack_reference_oscillator(false); } } #endif /* No external or PortaPack clock was found. Use HackRF Si5351C crystal. */ - si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); - return CLOCK_SOURCE_HACKRF; } + + si5351c_set_clock_source(&clock_gen, (source == CLOCK_SOURCE_HACKRF) ? PLL_SOURCE_XTAL : PLL_SOURCE_CLKIN); + hackrf_ui()->set_clock_source(source); + return source; } void ssp1_set_mode_max2837(void) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index 93be21bc..63bb5a79 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -502,6 +502,9 @@ static void portapack_ui_set_antenna_bias(bool antenna_bias) { (void)antenna_bias; } +static void portapack_ui_set_clock_source(clock_source_t source) { +} + const hackrf_ui_t portapack_hackrf_ui = { &portapack_ui_init, &portapack_ui_set_frequency, @@ -515,6 +518,7 @@ const hackrf_ui_t portapack_hackrf_ui = { &portapack_ui_set_first_if_frequency, &portapack_ui_set_filter, &portapack_ui_set_antenna_bias, + &portapack_ui_set_clock_source, }; const hackrf_ui_t* portapack_hackrf_ui_init() { diff --git a/firmware/common/ui_rad1o.c b/firmware/common/ui_rad1o.c index aac72369..af4e4fb8 100644 --- a/firmware/common/ui_rad1o.c +++ b/firmware/common/ui_rad1o.c @@ -34,6 +34,7 @@ void hackrf_ui_setBBTXVGAGain(const uint32_t gain_db) __attribute__((weak)); void hackrf_ui_setFirstIFFrequency(const uint64_t freq) __attribute__((weak)); void hackrf_ui_setFilter(const rf_path_filter_t filter) __attribute__((weak)); void hackrf_ui_setAntennaBias(bool antenna_bias) __attribute__((weak)); +void hackrf_ui_setClockSource(clock_source_t source) __attribute__((weak)); static void rad1o_ui_init(void) { hackrf_ui_init(); @@ -83,6 +84,10 @@ static void rad1o_ui_set_antenna_bias(bool antenna_bias) { hackrf_ui_setAntennaBias(antenna_bias); } +static void rad1o_ui_set_clock_source(clock_source_t source) { + hackrf_ui_setClockSource(source); +} + static const hackrf_ui_t rad1o_ui = { &rad1o_ui_init, &rad1o_ui_set_frequency, @@ -96,6 +101,7 @@ static const hackrf_ui_t rad1o_ui = { &rad1o_ui_set_first_if_frequency, &rad1o_ui_set_filter, &rad1o_ui_set_antenna_bias, + &rad1o_ui_set_clock_source, }; const hackrf_ui_t* rad1o_ui_setup(void) {