usb_request_status_t usb_vendor_request_set_amp_enable( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if (stage == USB_TRANSFER_STAGE_SETUP) { switch (endpoint->setup.value) { case 0: rf_path_set_lna(&rf_path, 0); usb_transfer_schedule_ack(endpoint->in); return USB_REQUEST_STATUS_OK; case 1: rf_path_set_lna(&rf_path, 1); usb_transfer_schedule_ack(endpoint->in); return USB_REQUEST_STATUS_OK; default: return USB_REQUEST_STATUS_STALL; } } else { return USB_REQUEST_STATUS_OK; } }
void rf_path_set_direction(rf_path_t* const rf_path, const rf_path_direction_t direction) { /* Turn off TX and RX amplifiers, then enable based on direction and bypass state. */ rf_path->switchctrl |= SWITCHCTRL_NO_TX_AMP_PWR | SWITCHCTRL_NO_RX_AMP_PWR; switch(direction) { case RF_PATH_DIRECTION_TX: rf_path->switchctrl |= SWITCHCTRL_TX; if( (rf_path->switchctrl & SWITCHCTRL_AMP_BYPASS) == 0 ) { /* TX amplifier is in path, be sure to enable TX amplifier. */ rf_path->switchctrl &= ~SWITCHCTRL_NO_TX_AMP_PWR; } rffc5071_tx(&rffc5072); if( rf_path->switchctrl & SWITCHCTRL_MIX_BYPASS ) { rffc5071_disable(&rffc5072); } else { rffc5071_enable(&rffc5072); } ssp1_set_mode_max5864(); max5864_tx(&max5864); ssp1_set_mode_max2837(); max2837_tx(&max2837); sgpio_configure(&sgpio_config, SGPIO_DIRECTION_TX); break; case RF_PATH_DIRECTION_RX: rf_path->switchctrl &= ~SWITCHCTRL_TX; if( (rf_path->switchctrl & SWITCHCTRL_AMP_BYPASS) == 0 ) { /* RX amplifier is in path, be sure to enable RX amplifier. */ rf_path->switchctrl &= ~SWITCHCTRL_NO_RX_AMP_PWR; } rffc5071_rx(&rffc5072); if( rf_path->switchctrl & SWITCHCTRL_MIX_BYPASS ) { rffc5071_disable(&rffc5072); } else { rffc5071_enable(&rffc5072); } ssp1_set_mode_max5864(); max5864_rx(&max5864); ssp1_set_mode_max2837(); max2837_rx(&max2837); sgpio_configure(&sgpio_config, SGPIO_DIRECTION_RX); break; case RF_PATH_DIRECTION_OFF: default: #ifdef HACKRF_ONE rf_path_set_antenna(rf_path, 0); #endif rf_path_set_lna(rf_path, 0); /* Set RF path to receive direction when "off" */ rf_path->switchctrl &= ~SWITCHCTRL_TX; rffc5071_disable(&rffc5072); ssp1_set_mode_max5864(); max5864_standby(&max5864); ssp1_set_mode_max2837(); max2837_set_mode(&max2837, MAX2837_MODE_STANDBY); sgpio_configure(&sgpio_config, SGPIO_DIRECTION_RX); break; } switchctrl_set(rf_path, rf_path->switchctrl); }