Do not apply radio configuration inside ISRs

This commit is contained in:
Michael Ossmann
2026-02-20 11:30:50 -05:00
parent b4041dd550
commit b1bfc246bf
4 changed files with 17 additions and 1 deletions

View File

@@ -19,6 +19,8 @@
* Boston, MA 02110-1301, USA.
*/
#include <libopencm3/dispatch/nvic.h>
#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);
}

View File

@@ -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:

View File

@@ -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;
}

View File

@@ -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);
}
}