From 6c0d8036479d32d6bcbcb2d45982d0b49580e5b9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 4 Sep 2013 16:27:43 -0700 Subject: [PATCH] Cleaned up management of SGPIO and transceiver mode state vs. USB configuration state. This should help with power management. It may also be necessary when operating at low speed (48MHz), to keep the SGPIO interrupts from chewing up ALL available CPU cycles. --- firmware/hackrf_usb/hackrf_usb.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 83531a58..eff351a4 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -335,11 +335,13 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { sgpio_configure(transceiver_mode, true); - nvic_set_priority(NVIC_SGPIO_IRQ, 0); - nvic_enable_irq(NVIC_SGPIO_IRQ); - SGPIO_SET_EN_1 = (1 << SGPIO_SLICE_A); + if( transceiver_mode != TRANSCEIVER_MODE_OFF ) { + nvic_set_priority(NVIC_SGPIO_IRQ, 0); + nvic_enable_irq(NVIC_SGPIO_IRQ); + SGPIO_SET_EN_1 = (1 << SGPIO_SLICE_A); - sgpio_cpld_stream_enable(); + sgpio_cpld_stream_enable(); + } } usb_request_status_t usb_vendor_request_set_transceiver_mode( @@ -887,17 +889,17 @@ const usb_request_handlers_t usb_request_handlers = { void usb_configuration_changed( usb_device_t* const device ) { - set_transceiver_mode(transceiver_mode); - if( device->configuration->number ) { cpu_clock_pll1_max_speed(); + set_transceiver_mode(transceiver_mode); gpio_set(PORT_LED1_3, PIN_LED1); } else { /* Configuration number equal 0 means usb bus reset. */ + set_transceiver_mode(TRANSCEIVER_MODE_OFF); cpu_clock_pll1_low_speed(); gpio_clear(PORT_LED1_3, PIN_LED1); } -}; +} void sgpio_isr() { SGPIO_CLR_STATUS_1 = (1 << SGPIO_SLICE_A);