From 6a83a5b8074a5520fbddc0d3d6029fde4b8fc001 Mon Sep 17 00:00:00 2001 From: Antoine van Gelder Date: Fri, 17 Jul 2026 15:07:21 +0200 Subject: [PATCH 1/2] radio: don't reconfigure the radio when switching operating mode to idle. --- firmware/common/radio.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/firmware/common/radio.c b/firmware/common/radio.c index 36f65cad..7e1b6907 100644 --- a/firmware/common/radio.c +++ b/firmware/common/radio.c @@ -940,19 +940,30 @@ bool radio_update(radio_t* const radio) memcpy(&tmp_bank[0], &(radio->config[RADIO_BANK_REQUESTED][0]), sizeof(tmp_bank)); nvic_enable_irq(NVIC_USB0_IRQ); + // We only want to update the sr, freq and bw configuration groups + // if the transceiver is off or about to be switched on. + // + // This ensures that, when idle, the radio's applied configuration + // will always reflect the last settings used before the + // transceiver was switched off. + bool radio_ready = radio->config[RADIO_BANK_REQUESTED][RADIO_OPMODE] != + TRANSCEIVER_MODE_OFF || + radio->config[RADIO_BANK_APPLIED][RADIO_OPMODE] == TRANSCEIVER_MODE_OFF; + if ((dirty & RADIO_REG_GROUP_RATE) || - ((detected_platform() == BOARD_ID_PRALINE) && - (dirty & (1 << RADIO_OPMODE)))) { + ((detected_platform() == BOARD_ID_PRALINE) && (dirty & (1 << RADIO_OPMODE)) && + radio_ready)) { changed |= radio_update_sample_rate(radio, &tmp_bank[0]); } if ((dirty & RADIO_REG_GROUP_FREQ) || ((detected_platform() == BOARD_ID_PRALINE) && - ((changed & RADIO_REG_GROUP_RATE) || (dirty & (1 << RADIO_OPMODE))))) { + ((changed & RADIO_REG_GROUP_RATE) || (dirty & (1 << RADIO_OPMODE))) && + radio_ready)) { changed |= radio_update_frequency(radio, &tmp_bank[0]); } if ((dirty & RADIO_REG_GROUP_BW) || ((detected_platform() == BOARD_ID_PRALINE) && - (changed & (RADIO_REG_GROUP_RATE | RADIO_REG_GROUP_FREQ)))) { + (changed & (RADIO_REG_GROUP_RATE | RADIO_REG_GROUP_FREQ)) && radio_ready)) { changed |= radio_update_bandwidth(radio, &tmp_bank[0]); } if (dirty & (RADIO_REG_GROUP_GAIN | (1 << RADIO_OPMODE))) { From 6259086c9625ebef760f51305aae9a364a465a9a Mon Sep 17 00:00:00 2001 From: Antoine van Gelder Date: Tue, 21 Jul 2026 11:44:26 +0200 Subject: [PATCH 2/2] libhackrf: set a 500ms timeout for changing fpga bitstream --- host/libhackrf/src/hackrf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 7bafd5f3..4018ac63 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -57,6 +57,7 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI #define DEFAULT_REQUEST_TIMEOUT 100 #define CPLD_WRITE_TIMEOUT 10000 #define SPIFLASH_WRITE_TIMEOUT 50000 // W25Q32JV max chip erase time +#define FPGA_BITSTREAM_TIMEOUT 500 // TODO: Factor this into a shared #include so that firmware can use // the same values. @@ -3496,7 +3497,7 @@ int ADDCALL hackrf_set_fpga_bitstream(hackrf_device* device, const uint8_t index 0, NULL, 0, - DEFAULT_REQUEST_TIMEOUT); + FPGA_BITSTREAM_TIMEOUT); if (result != 0) { last_libusb_error = result;