mirror of
https://github.com/greatscottgadgets/hackrf.git
synced 2026-03-03 14:06:49 +01:00
Do not apply radio configuration inside ISRs
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user