From 9e6ae19e104ac16ab901fe213fbd853bc75af349 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sun, 7 Jun 2015 03:35:59 +0200 Subject: [PATCH] fix(rf_path): First version of rad10 path --- firmware/common/hackrf_core.c | 4 +- firmware/common/hackrf_core.h | 21 ++++--- firmware/common/rf_path.c | 114 ++++++++++++++++++++++------------ 3 files changed, 91 insertions(+), 48 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 48c3e251..394b2fea 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -645,10 +645,10 @@ void disable_rf_power(void) { #ifdef RAD10 void enable_rf_power(void) { - gpio_set(PORT_VDD_ENABLE, PIN_VDD_ENABLE); + gpio_set(PORT_VAA_ENABLE, PIN_VAA_ENABLE); } void disable_rf_power(void) { - gpio_clear(PORT_VDD_ENABLE, PIN_VDD_ENABLE); + gpio_clear(PORT_VAA_ENABLE, PIN_VAA_ENABLE); } #endif diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index b4629921..1c7fdca4 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -164,6 +164,7 @@ extern "C" #define SCU_MIXER_SCLK (P2_6) /* GPIO5[6] on P2_6 */ #define SCU_MIXER_SDATA (P6_4) /* GPIO3[3] on P6_4 */ #define SCU_MIXER_LE (P5_5) /* GPIO2[14] on P5_5 */ +#define SCU_MIXER_EN (P6_8) /* GPIO5[16] on P6_8 */ #endif /* RF LDO control */ @@ -172,10 +173,15 @@ extern "C" #endif /* RF supply (VAA) control */ -#if (defined HACKRF_ONE || defined RAD10) +#ifdef HACKRF_ONE #define SCU_NO_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ #endif +#ifdef RAD10 +#define SCU_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ +#endif + + /* SPI flash */ #define SCU_SSP0_MISO (P3_6) #define SCU_SSP0_MOSI (P3_7) @@ -211,8 +217,7 @@ extern "C" #define SCU_LOW_HIGH_FILT (P5_2) /* GPIO2[11] on P5_2 */ #define SCU_LOW_HIGH_FILT_N (P5_3) /* GPIO2[12] on P5_3 */ #define SCU_TX_AMP (P5_6) /* GPIO2[15] on P5_6 */ -#define SCU_RX_LNA (P5_7) /* GPIO5[15] on P6_7 */ -#define SCU_MIXER_EN (P6_8) /* GPIO5[16] on P6_8 */ +#define SCU_RX_LNA (P6_7) /* GPIO5[15] on P6_7 */ #endif /* TODO add other Pins */ @@ -318,6 +323,8 @@ extern "C" #define PORT_MIXER_SDATA (GPIO3) #define PIN_MIXER_LE (BIT14) /* GPIO2[14] on P5_5 */ #define PORT_MIXER_LE (GPIO2) +#define PIN_MIXER_EN (BIT16) /* GPIO5[16] on P6_8 */ +#define PORT_MIXER_EN (GPIO5) #endif #ifdef JAWBREAKER @@ -331,8 +338,8 @@ extern "C" #endif #ifdef RAD10 -#define PIN_VDD_ENABLE (BIT9) /* GPIO2[9] on P5_0 */ -#define PORT_VDD_ENABLE (GPIO2) /* PORT for VDD_ENABLE */ +#define PIN_VAA_ENABLE (BIT9) /* GPIO2[9] on P5_0 */ +#define PORT_VAA_ENABLE (GPIO2) /* PORT for VAA_ENABLE */ #endif #define PIN_FLASH_HOLD (BIT14) /* GPIO1[14] on P3_4 */ @@ -392,8 +399,6 @@ extern "C" #define PORT_TX_AMP (GPIO2) #define PIN_RX_LNA (GPIOPIN15) /* GPIO5[15] on P6_7 */ #define PORT_RX_LNA (GPIO5) -#define PIN_MIXER_EN (GPIOPIN16) /* GPIO5[16] on P6_8 */ -#define PORT_MIXER_EN (GPIO5) #endif /* GPIO Input */ @@ -454,7 +459,7 @@ bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom); bool sample_rate_set(const uint32_t sampling_rate_hz); bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz); -#ifdef HACKRF_ONE +#if (defined HACKRF_ONE || defined RAD10) void enable_rf_power(void); void disable_rf_power(void); #endif diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index edebed69..ba2cc12e 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -96,50 +96,52 @@ static void switchctrl_set_rad10(uint8_t ctrl) { gpio_set(PORT_TX_RX, PIN_TX_RX); } -#if 0 if (ctrl & SWITCHCTRL_MIX_BYPASS) { - gpio_set(PORT_MIX_BYPASS, PIN_MIX_BYPASS); - gpio_clear(PORT_NO_MIX_BYPASS, PIN_NO_MIX_BYPASS); - if (ctrl & SWITCHCTRL_TX) { - gpio_set(PORT_TX_MIX_BP, PIN_TX_MIX_BP); - gpio_clear(PORT_RX_MIX_BP, PIN_RX_MIX_BP); - } else { - gpio_clear(PORT_TX_MIX_BP, PIN_TX_MIX_BP); - gpio_set(PORT_RX_MIX_BP, PIN_RX_MIX_BP); - } + gpio_clear(PORT_BY_MIX, PIN_BY_MIX); + gpio_set(PORT_BY_MIX_N, PIN_BY_MIX_N); } else { - gpio_clear(PORT_MIX_BYPASS, PIN_MIX_BYPASS); - gpio_set(PORT_NO_MIX_BYPASS, PIN_NO_MIX_BYPASS); - gpio_clear(PORT_TX_MIX_BP, PIN_TX_MIX_BP); - gpio_clear(PORT_RX_MIX_BP, PIN_RX_MIX_BP); + gpio_set(PORT_BY_MIX, PIN_BY_MIX); + gpio_clear(PORT_BY_MIX_N, PIN_BY_MIX_N); } if (ctrl & SWITCHCTRL_HP) { - gpio_set(PORT_HP, PIN_HP); - gpio_clear(PORT_LP, PIN_LP); + gpio_set(PORT_LOW_HIGH_FILT, PIN_LOW_HIGH_FILT); + gpio_clear(PORT_LOW_HIGH_FILT_N, PIN_LOW_HIGH_FILT_N); } else { - gpio_clear(PORT_HP, PIN_HP); - gpio_set(PORT_LP, PIN_LP); + gpio_clear(PORT_LOW_HIGH_FILT, PIN_LOW_HIGH_FILT); + gpio_set(PORT_LOW_HIGH_FILT_N, PIN_LOW_HIGH_FILT_N); } if (ctrl & SWITCHCTRL_AMP_BYPASS) { - gpio_set(PORT_AMP_BYPASS, PIN_AMP_BYPASS); + gpio_clear(PORT_BY_AMP, PIN_BY_AMP); + gpio_set(PORT_BY_AMP_N, PIN_BY_AMP_N); + + gpio_clear(PORT_TX_RX, PIN_TX_RX); + gpio_set(PORT_TX_RX_N, PIN_TX_RX_N); + gpio_clear(PORT_TX_AMP, PIN_TX_AMP); - gpio_set(PORT_NO_TX_AMP_PWR, PIN_NO_TX_AMP_PWR); - gpio_clear(PORT_RX_AMP, PIN_RX_AMP); - gpio_set(PORT_NO_RX_AMP_PWR, PIN_NO_RX_AMP_PWR); + gpio_clear(PORT_RX_LNA, PIN_RX_LNA); + } else if (ctrl & SWITCHCTRL_TX) { - gpio_clear(PORT_AMP_BYPASS, PIN_AMP_BYPASS); + gpio_set(PORT_BY_AMP, PIN_BY_AMP); + gpio_clear(PORT_BY_AMP_N, PIN_BY_AMP_N); + + gpio_clear(PORT_TX_RX, PIN_TX_RX); + gpio_set(PORT_TX_RX_N, PIN_TX_RX_N); + gpio_set(PORT_TX_AMP, PIN_TX_AMP); - gpio_clear(PORT_NO_TX_AMP_PWR, PIN_NO_TX_AMP_PWR); - gpio_clear(PORT_RX_AMP, PIN_RX_AMP); - gpio_set(PORT_NO_RX_AMP_PWR, PIN_NO_RX_AMP_PWR); + gpio_clear(PORT_RX_LNA, PIN_RX_LNA); + } else { - gpio_clear(PORT_AMP_BYPASS, PIN_AMP_BYPASS); + gpio_set(PORT_BY_AMP, PIN_BY_AMP); + gpio_clear(PORT_BY_AMP_N, PIN_BY_AMP_N); + + gpio_set(PORT_TX_RX, PIN_TX_RX); + gpio_clear(PORT_TX_RX_N, PIN_TX_RX_N); + gpio_clear(PORT_TX_AMP, PIN_TX_AMP); - gpio_set(PORT_NO_TX_AMP_PWR, PIN_NO_TX_AMP_PWR); - gpio_set(PORT_RX_AMP, PIN_RX_AMP); - gpio_clear(PORT_NO_RX_AMP_PWR, PIN_NO_RX_AMP_PWR); + gpio_set(PORT_RX_LNA, PIN_RX_LNA); + } /* @@ -147,17 +149,17 @@ static void switchctrl_set_rad10(uint8_t ctrl) { * used to explicitly turn off power to the amplifiers while AMP_BYPASS * is unset: */ - if (ctrl & SWITCHCTRL_NO_TX_AMP_PWR) - gpio_set(PORT_NO_TX_AMP_PWR, PIN_NO_TX_AMP_PWR); - if (ctrl & SWITCHCTRL_NO_RX_AMP_PWR) - gpio_set(PORT_NO_RX_AMP_PWR, PIN_NO_RX_AMP_PWR); + if (ctrl & SWITCHCTRL_NO_TX_AMP_PWR) { + gpio_clear(PORT_TX_AMP, PIN_TX_AMP); + } + if (ctrl & SWITCHCTRL_NO_RX_AMP_PWR) { + gpio_clear(PORT_RX_LNA, PIN_RX_LNA); + } if (ctrl & SWITCHCTRL_ANT_PWR) { - mixer_set_gpo(0x00); /* turn on antenna power by clearing GPO1 */ - } else { - mixer_set_gpo(0x01); /* turn off antenna power by setting GPO1 */ + // TODO } -#endif + } #endif @@ -286,6 +288,42 @@ void rf_path_pin_setup() { /* Safe state: start with VAA turned off: */ disable_rf_power(); #endif + +#ifdef RAD10 + /* Configure RF switch control signals */ + scu_pinmux(SCU_BY_AMP, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_BY_AMP_N, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); + scu_pinmux(SCU_TX_RX, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_TX_RX_N, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_BY_MIX, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_BY_MIX_N, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_LOW_HIGH_FILT, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_LOW_HIGH_FILT_N,SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_TX_AMP, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + scu_pinmux(SCU_RX_LNA, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); + + /* Configure RF power supply (VAA) switch */ + scu_pinmux(SCU_VAA_ENABLE, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); + + /* Configure RF switch control signals as outputs */ + GPIO0_DIR |= PIN_TX_RX; + GPIO1_DIR |= PIN_BY_AMP | PIN_TX_RX_N | PIN_BY_MIX; + GPIO2_DIR |= PIN_BY_MIX_N | PIN_LOW_HIGH_FILT | PIN_LOW_HIGH_FILT_N | PIN_TX_AMP; + GPIO5_DIR |= PIN_BY_AMP_N | PIN_RX_LNA; + + /* + * Safe (initial) switch settings turn off both amplifiers and antenna port + * power and enable both amp bypass and mixer bypass. + */ + switchctrl_set(SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_MIX_BYPASS); + + /* Configure RF power supply (VAA) switch control signal as output */ + GPIO_DIR(PORT_VAA_ENABLE) |= PIN_VAA_ENABLE; + + /* Safe state: start with VAA turned off: */ + disable_rf_power(); +#endif + } void rf_path_init(void) {