Move various switchctrl manipulation into clearly-defined rf_path_*() implementations.
This commit is contained in:
@ -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:
|
||||||
|
Reference in New Issue
Block a user