Move various switchctrl manipulation into clearly-defined rf_path_*() implementations.

This commit is contained in:
Jared Boone
2013-09-07 22:06:01 -07:00
parent bf297e0e08
commit 7cf4058372

View File

@ -117,41 +117,79 @@ set_sample_r_params_t set_sample_r_params;
uint8_t switchctrl = SWITCHCTRL_SAFE; uint8_t switchctrl = SWITCHCTRL_SAFE;
void update_switches(void) typedef enum {
{ RF_PATH_DIRECTION_RX,
if (transceiver_mode == TRANSCEIVER_MODE_RX) { RF_PATH_DIRECTION_TX,
rffc5071_rx(); } rf_path_direction_t;
#ifdef JAWBREAKER
/* honor SWITCHCTRL_AMP_BYPASS and SWITCHCTRL_HP settings from caller */
switchctrl &= (SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_HP | SWITCHCTRL_MIX_BYPASS);
if (switchctrl & SWITCHCTRL_AMP_BYPASS)
switchctrl |= SWITCHCTRL_NO_RX_AMP_PWR;
switchctrl |= SWITCHCTRL_NO_TX_AMP_PWR;
rffc5071_set_gpo(switchctrl);
/* honor SWITCHCTRL_MIX_BYPASS setting from caller */ void rf_path_set_direction(const rf_path_direction_t direction) {
if (switchctrl & SWITCHCTRL_MIX_BYPASS) /* Turn off TX and RX amplifiers, then enable based on direction and bypass state. */
rffc5071_disable(); switchctrl |= SWITCHCTRL_NO_TX_AMP_PWR | SWITCHCTRL_NO_RX_AMP_PWR;
else if( direction == RF_PATH_DIRECTION_TX ) {
#endif switchctrl |= SWITCHCTRL_TX;
rffc5071_enable(); if( (switchctrl & SWITCHCTRL_AMP_BYPASS) == 0 ) {
} else if (transceiver_mode == TRANSCEIVER_MODE_TX) { /* TX amplifier is in path, be sure to enable TX amplifier. */
rffc5071_tx(); switchctrl &= ~SWITCHCTRL_NO_TX_AMP_PWR;
#ifdef JAWBREAKER
/* honor SWITCHCTRL_AMP_BYPASS and SWITCHCTRL_HP settings from caller */
switchctrl &= (SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_HP | SWITCHCTRL_MIX_BYPASS);
if (switchctrl & SWITCHCTRL_AMP_BYPASS)
switchctrl |= SWITCHCTRL_NO_TX_AMP_PWR;
switchctrl |= (SWITCHCTRL_TX | SWITCHCTRL_NO_RX_AMP_PWR);
rffc5071_set_gpo(switchctrl);
/* honor SWITCHCTRL_MIX_BYPASS setting from caller */
if (switchctrl & SWITCHCTRL_MIX_BYPASS)
rffc5071_disable();
else
#endif
rffc5071_enable();
} }
rffc5071_tx();
} else {
switchctrl &= ~SWITCHCTRL_TX;
if( (switchctrl & SWITCHCTRL_AMP_BYPASS) == 0 ) {
/* RX amplifier is in path, be sure to enable RX amplifier. */
switchctrl &= ~SWITCHCTRL_NO_RX_AMP_PWR;
}
rffc5071_rx();
}
rffc5071_set_gpo(switchctrl);
}
typedef enum {
RF_PATH_FILTER_BYPASS,
RF_PATH_FILTER_LOW_PASS,
RF_PATH_FILTER_HIGH_PASS,
} rf_path_filter_t;
void rf_path_set_filter(const rf_path_filter_t filter) {
switch(filter) {
default:
case RF_PATH_FILTER_BYPASS:
switchctrl |= SWITCHCTRL_MIX_BYPASS;
rffc5071_disable();
break;
case RF_PATH_FILTER_LOW_PASS:
switchctrl &= ~(SWITCHCTRL_HP | SWITCHCTRL_MIX_BYPASS);
rffc5071_enable();
break;
case RF_PATH_FILTER_HIGH_PASS:
switchctrl &= ~SWITCHCTRL_MIX_BYPASS;
switchctrl |= SWITCHCTRL_HP;
rffc5071_enable();
break;
}
rffc5071_set_gpo(switchctrl);
}
void rf_path_set_lna(const uint_fast8_t enable) {
if( enable ) {
if( switchctrl & SWITCHCTRL_TX ) {
/* AMP_BYPASS=0, NO_RX_AMP_PWR=1, NO_TX_AMP_PWR=0 */
switchctrl |= SWITCHCTRL_NO_RX_AMP_PWR;
switchctrl &= ~(SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_NO_TX_AMP_PWR);
} else {
/* AMP_BYPASS=0, NO_RX_AMP_PWR=0, NO_TX_AMP_PWR=1 */
switchctrl |= SWITCHCTRL_NO_TX_AMP_PWR;
switchctrl &= ~(SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_NO_RX_AMP_PWR);
}
} else {
/* AMP_BYPASS=1, NO_RX_AMP_PWR=1, NO_TX_AMP_PWR=1 */
switchctrl |= SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_NO_TX_AMP_PWR | SWITCHCTRL_NO_RX_AMP_PWR;
}
rffc5071_set_gpo(switchctrl);
} }
#define FREQ_ONE_MHZ (1000*1000) #define FREQ_ONE_MHZ (1000*1000)
@ -190,8 +228,6 @@ bool set_freq(uint32_t freq_mhz, uint32_t freq_hz)
{ {
if(freq_mhz < MAX_LP_FREQ_MHZ) if(freq_mhz < MAX_LP_FREQ_MHZ)
{ {
switchctrl &= ~(SWITCHCTRL_HP | SWITCHCTRL_MIX_BYPASS);
RFFC5071_freq_mhz = MAX2837_FREQ_NOMINAL_MHZ - freq_mhz; RFFC5071_freq_mhz = MAX2837_FREQ_NOMINAL_MHZ - freq_mhz;
/* Set Freq and read real freq */ /* Set Freq and read real freq */
real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz); real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz);
@ -204,20 +240,15 @@ bool set_freq(uint32_t freq_mhz, uint32_t freq_hz)
} }
MAX2837_freq_hz = max2837_freq_nominal_hz + tmp_hz + freq_hz; MAX2837_freq_hz = max2837_freq_nominal_hz + tmp_hz + freq_hz;
max2837_set_frequency(MAX2837_freq_hz); max2837_set_frequency(MAX2837_freq_hz);
update_switches(); rf_path_set_filter(RF_PATH_FILTER_LOW_PASS);
}else if( (freq_mhz >= MIN_BYPASS_FREQ_MHZ) && (freq_mhz < MAX_BYPASS_FREQ_MHZ) ) }else if( (freq_mhz >= MIN_BYPASS_FREQ_MHZ) && (freq_mhz < MAX_BYPASS_FREQ_MHZ) )
{ {
switchctrl |= SWITCHCTRL_MIX_BYPASS;
MAX2837_freq_hz = (freq_mhz * FREQ_ONE_MHZ) + freq_hz; MAX2837_freq_hz = (freq_mhz * FREQ_ONE_MHZ) + freq_hz;
/* RFFC5071_freq_mhz <= not used in Bypass mode */ /* RFFC5071_freq_mhz <= not used in Bypass mode */
max2837_set_frequency(MAX2837_freq_hz); max2837_set_frequency(MAX2837_freq_hz);
update_switches(); rf_path_set_filter(RF_PATH_FILTER_BYPASS);
}else if( (freq_mhz >= MIN_HP_FREQ_MHZ) && (freq_mhz < MAX_HP_FREQ_MHZ) ) }else if( (freq_mhz >= MIN_HP_FREQ_MHZ) && (freq_mhz < MAX_HP_FREQ_MHZ) )
{ {
switchctrl &= ~SWITCHCTRL_MIX_BYPASS;
switchctrl |= SWITCHCTRL_HP;
RFFC5071_freq_mhz = freq_mhz - MAX2837_FREQ_NOMINAL_MHZ; RFFC5071_freq_mhz = freq_mhz - MAX2837_FREQ_NOMINAL_MHZ;
/* Set Freq and read real freq */ /* Set Freq and read real freq */
real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz); real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz);
@ -230,7 +261,7 @@ bool set_freq(uint32_t freq_mhz, uint32_t freq_hz)
} }
MAX2837_freq_hz = max2837_freq_nominal_hz + tmp_hz + freq_hz; MAX2837_freq_hz = max2837_freq_nominal_hz + tmp_hz + freq_hz;
max2837_set_frequency(MAX2837_freq_hz); max2837_set_frequency(MAX2837_freq_hz);
update_switches(); rf_path_set_filter(RF_PATH_FILTER_HIGH_PASS);
}else }else
{ {
/* Error freq_mhz too high */ /* Error freq_mhz too high */
@ -388,7 +419,7 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) {
gpio_set(PORT_LED1_3, PIN_LED2); gpio_set(PORT_LED1_3, PIN_LED2);
usb_endpoint_init(&usb_endpoint_bulk_in); usb_endpoint_init(&usb_endpoint_bulk_in);
update_switches(); rf_path_set_direction(RF_PATH_DIRECTION_RX);
//rffc5071_set_frequency(1700, 0); // 2600 MHz IF - 1700 MHz LO = 900 MHz RF //rffc5071_set_frequency(1700, 0); // 2600 MHz IF - 1700 MHz LO = 900 MHz RF
max2837_start(); max2837_start();
max2837_rx(); max2837_rx();
@ -397,7 +428,7 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) {
gpio_set(PORT_LED1_3, PIN_LED3); gpio_set(PORT_LED1_3, PIN_LED3);
usb_endpoint_init(&usb_endpoint_bulk_out); usb_endpoint_init(&usb_endpoint_bulk_out);
update_switches(); rf_path_set_direction(RF_PATH_DIRECTION_TX);
//rffc5071_set_frequency(1700, 0); // 2600 MHz IF - 1700 MHz LO = 900 MHz RF //rffc5071_set_frequency(1700, 0); // 2600 MHz IF - 1700 MHz LO = 900 MHz RF
max2837_start(); max2837_start();
max2837_tx(); max2837_tx();
@ -807,13 +838,11 @@ usb_request_status_t usb_vendor_request_set_amp_enable(
if (stage == USB_TRANSFER_STAGE_SETUP) { if (stage == USB_TRANSFER_STAGE_SETUP) {
switch (endpoint->setup.value) { switch (endpoint->setup.value) {
case 0: case 0:
switchctrl |= SWITCHCTRL_AMP_BYPASS; rf_path_set_lna(0);
update_switches();
usb_endpoint_schedule_ack(endpoint->in); usb_endpoint_schedule_ack(endpoint->in);
return USB_REQUEST_STATUS_OK; return USB_REQUEST_STATUS_OK;
case 1: case 1:
switchctrl &= ~SWITCHCTRL_AMP_BYPASS; rf_path_set_lna(1);
update_switches();
usb_endpoint_schedule_ack(endpoint->in); usb_endpoint_schedule_ack(endpoint->in);
return USB_REQUEST_STATUS_OK; return USB_REQUEST_STATUS_OK;
default: default: