diff --git a/firmware/common/radio.c b/firmware/common/radio.c index 75def39b..3f5e1a59 100644 --- a/firmware/common/radio.c +++ b/firmware/common/radio.c @@ -19,6 +19,8 @@ * Boston, MA 02110-1301, USA. */ +#include + #include "hackrf_core.h" #include "tuning.h" #include "rf_path.h" @@ -688,12 +690,15 @@ static bool radio_update_dc_block(radio_t* const radio, uint64_t* bank) bool radio_update(radio_t* const radio) { uint64_t tmp_bank[RADIO_NUM_REGS]; + nvic_disable_irq(NVIC_USB0_IRQ); uint32_t dirty = radio->regs_dirty; if (dirty == 0) { + nvic_enable_irq(NVIC_USB0_IRQ); return false; } radio->regs_dirty = 0; memcpy(&tmp_bank[0], &(radio->config[RADIO_BANK_ACTIVE][0]), sizeof(tmp_bank)); + nvic_enable_irq(NVIC_USB0_IRQ); bool dir = false; bool rate = false; @@ -765,6 +770,7 @@ void radio_switch_opmode(radio_t* const radio, const transceiver_mode_t mode) source_bank = RADIO_BANK_IDLE; } + nvic_disable_irq(NVIC_USB0_IRQ); for (uint8_t reg = 0; reg < RADIO_NUM_REGS; reg++) { value = radio->config[source_bank][reg]; previous = radio->config[RADIO_BANK_ACTIVE][reg]; @@ -775,5 +781,6 @@ void radio_switch_opmode(radio_t* const radio, const transceiver_mode_t mode) } mark_dirty(radio, RADIO_OPMODE); + nvic_enable_irq(NVIC_USB0_IRQ); radio_update(radio); } diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 9986ceac..d8934514 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -385,6 +385,7 @@ int main(void) nvic_disable_irq(NVIC_USB0_IRQ); request = transceiver_request; nvic_enable_irq(NVIC_USB0_IRQ); + radio_update(&radio); switch (request.mode) { case TRANSCEIVER_MODE_OFF: diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 85aa5d7c..84a813a1 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -92,12 +92,16 @@ usb_request_status_t usb_vendor_request_init_sweep( ((uint16_t) (data[10 + i * 2]) << 8) + data[9 + i * 2]; } sweep_freq = (uint64_t) frequencies[0] * FREQ_GRANULARITY; + + nvic_disable_irq(NVIC_USB0_IRQ); radio_reg_write( &radio, RADIO_BANK_ACTIVE, RADIO_FREQUENCY_RF, (sweep_freq + offset) << 24); usb_transfer_schedule_ack(endpoint->in); + nvic_enable_irq(NVIC_USB0_IRQ); + radio_update(&radio); } return USB_REQUEST_STATUS_OK; } diff --git a/firmware/hackrf_usb/usb_api_transceiver.c b/firmware/hackrf_usb/usb_api_transceiver.c index 76399ae9..6a72a1f4 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.c +++ b/firmware/hackrf_usb/usb_api_transceiver.c @@ -420,6 +420,7 @@ void rx_mode(uint32_t seq) NULL); usb_count += USB_TRANSFER_SIZE; } + radio_update(&radio); } transceiver_shutdown(); @@ -456,6 +457,7 @@ void tx_mode(uint32_t seq) NULL); usb_count += USB_TRANSFER_SIZE; } + radio_update(&radio); } transceiver_shutdown(); @@ -465,5 +467,7 @@ void off_mode(uint32_t seq) { hackrf_ui()->set_transceiver_mode(TRANSCEIVER_MODE_OFF); - while (transceiver_request.seq == seq) {} + while (transceiver_request.seq == seq) { + radio_update(&radio); + } }