From b35431eddf99a3829d871c256bf865096bca0f37 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 2 Jun 2015 07:35:22 +0200 Subject: [PATCH 01/58] doc(max2871): Some notes on how to use the PLL --- firmware/common/max2871.c | 115 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 firmware/common/max2871.c diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c new file mode 100644 index 00000000..387a2e25 --- /dev/null +++ b/firmware/common/max2871.c @@ -0,0 +1,115 @@ +/* + * - The input is fixed to 50 MHz + * f_REF = 50 MHz + * + * - The VCO must operate between 3 GHz and 6 GHz + * f_VCO range: 3 GHz - 6 GHz + * + * Phase Detector Clock: + * - We configure the phase detector to not change the + * input signal + * f_PFD = f_REF x [(1 + DBR)/(R x (1 + RDIV2))] + * R = 1 + * DBR = 0 + * RDIV2 = 0 + * + * => f_PFD = 50 MHz + * + * + * f_RFOUT < 3 GHz: + * - To go to < 3 GHz, f_VCO has to be divided. + * f_RFOUT = f_VCO / DIVA + * + * - We just divide by 2 for now + * DIVA = 2 + * => f_RFOUT = f_VCO / 2 + * + * - Relationship between f_PFD (fixed) and f_VCO (variable) + * N + (F/M) = f_VCO/ f_PFD + * + * - Insert relationship between f_RFOUT and f_VCO: + * N + (F/M) = (f_RFOUT * 2) / f_PFD + * f_RFOUT = (N + F/M) * f_PFD / 2 + * + * - Limits for N, M and F from the datasheet: + * 19 <= N <= 4091 + * 2 <= M <= 4095 + * F < M + * + * - Plug in constants: + * f_RFOUT = (N + F/M) / 2 * 50 MHz + * + * - Given the range of N, we can go to: + * f_RFOUT range: 475 MHz - 3 GHz + * + * - N steps in 25 MHz increments: + * N = floor(f_RFOUT / 50 MHz * 2) + * => N = (f_RFOUT * 2) / 50 MHz (uses integer math) + * + * - Calculate the error: + * f_int_ERROR = f_RFOUT - (N * 50 MHz) / 2 + * f_int_ERROR range: 0 MHz - 24 MHz + * + * - Use the fraction to get to the correct frequency: + * (F/M) / 2 * 50 MHz = f_int_ERROR + * + * - Fix M: + * M = 25 + * + * - Calculate F: + * (F/25) / 2 * 50 MHz = f_int_ERROR + * F = f_int_ERROR / 1 MHz + * + * - Calculate the new error: + * + * f_ERROR = f_RFOUT - (N + F/M) / 2 * 50 MHz + * f_ERROR range: 0 MHz - 1 MHz + * + * + * f_RFOUT > 3 GHz: + * - Do not divide the VCO output + * DIVA = 1 + * => f_RFOUT = f_VCO + * + * - Relationship between f_PFD (fixed) and f_VCO (variable) + * N + (F/M) = f_VCO/ f_PFD + * + * - Insert relationship between f_RFOUT and f_VCO: + * N + (F/M) = f_RFOUT / f_PFD + * f_RFOUT = (N + F/M) * f_PFD + * + * - Limits for N, M and F from the datasheet: + * 19 <= N <= 4091 + * 2 <= M <= 4095 + * F < M + * + * - Plug in constants: + * f_RFOUT = (N + F/M) * 50 MHz + * + * - Given the range of N and the VCO limits, we can go to: + * f_RFOUT range: 3000 MHz - 6000 MHz + * + * - N steps in 50 MHz increments: + * N = floor(f_RFOUT / 50 MHz) + * => N = f_RFOUT / 50 MHz (uses integer math) + * + * - Calculate the error: + * f_int_ERROR = f_RFOUT - N * 50 MHz + * f_int_ERROR range: 0 MHz - 49 MHz + * + * - Use the fraction to get to the correct frequency: + * (F/M) * 50 MHz = f_int_ERROR + * + * - Fix M: + * M = 50 + * + * - Calculate F: + * (F/50) * 50 MHz = f_int_ERROR + * F = f_int_ERROR / 1 MHz + * + * - Calculate the new error: + * + * f_ERROR = f_RFOUT - (N + F/M) * 50 MHz + * f_ERROR range: 0 MHz - 1 MHz + * + */ From ce273438d43ab2ca916f0c1e15335cae7882cca4 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sat, 6 Jun 2015 18:18:23 +0200 Subject: [PATCH 02/58] fix(hackrf_core): new pin assignments --- firmware/common/hackrf_core.c | 14 +++++- firmware/common/hackrf_core.h | 89 +++++++++++++++++++++++++++++++++-- 2 files changed, 98 insertions(+), 5 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index b862ba4f..48c3e251 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -185,7 +185,7 @@ bool sample_rate_set(const uint32_t sample_rate_hz) { return true; #endif -#if (defined JAWBREAKER || defined HACKRF_ONE) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) uint32_t p1 = 4608; uint32_t p2 = 0; uint32_t p3 = 0; @@ -297,7 +297,7 @@ void cpu_clock_init(void) si5351c_configure_multisynth(5, 1536, 0, 1, 0); /* 50MHz */ #endif -#if (defined JAWBREAKER || defined HACKRF_ONE) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) /* * Jawbreaker clocks: * CLK0 -> MAX5864/CPLD @@ -642,3 +642,13 @@ void disable_rf_power(void) { gpio_set(PORT_NO_VAA_ENABLE, PIN_NO_VAA_ENABLE); } #endif + +#ifdef RAD10 +void enable_rf_power(void) { + gpio_set(PORT_VDD_ENABLE, PIN_VDD_ENABLE); +} + +void disable_rf_power(void) { + gpio_clear(PORT_VDD_ENABLE, PIN_VDD_ENABLE); +} +#endif diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 8ce6c943..e0978bb0 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -57,6 +57,9 @@ extern "C" #define SCU_PINMUX_LED1 (P4_1) /* GPIO2[1] on P4_1 */ #define SCU_PINMUX_LED2 (P4_2) /* GPIO2[2] on P4_2 */ #define SCU_PINMUX_LED3 (P6_12) /* GPIO2[8] on P6_12 */ +#ifdef RAD10 +#define SCU_PINMUX_LED4 (PB_6) /* GPIO5[26] on PB_6 */ +#endif #define SCU_PINMUX_EN1V8 (P6_10) /* GPIO3[6] on P6_10 */ @@ -81,7 +84,7 @@ extern "C" /* CPLD JTAG interface */ #define SCU_PINMUX_CPLD_TDO (P9_5) /* GPIO5[18] */ #define SCU_PINMUX_CPLD_TCK (P6_1) /* GPIO3[ 0] */ -#ifdef HACKRF_ONE +#if (defined HACKRF_ONE || defined RAD10) #define SCU_PINMUX_CPLD_TMS (P6_5) /* GPIO3[ 4] */ #define SCU_PINMUX_CPLD_TDI (P6_2) /* GPIO3[ 1] */ #else @@ -123,6 +126,13 @@ extern "C" #define SCU_XCVR_B6 (P5_5) /* GPIO2[14] on P5_5 */ #define SCU_XCVR_B7 (P5_6) /* GPIO2[15] on P5_6 */ #endif + +#ifdef RAD10 +#define SCU_XCVR_RXHP (P8_1) /* GPIO[] on P8_1 */ +#define SCU_XCVR_B6 (P8_2) /* GPIO[] on P8_2 */ +#define SCU_XCVR_B7 (P9_3) /* GPIO[] on P8_3 */ +#endif + #define SCU_XCVR_ENABLE (P4_6) /* GPIO2[6] on P4_6 */ #define SCU_XCVR_RXENABLE (P4_5) /* GPIO2[5] on P4_5 */ #define SCU_XCVR_TXENABLE (P4_4) /* GPIO2[4] on P4_4 */ @@ -144,6 +154,12 @@ extern "C" #define SCU_MIXER_SDATA (P6_4) /* GPIO3[3] on P6_4 */ #define SCU_MIXER_RESETX (P5_5) /* GPIO2[14] on P5_5 */ #endif +#ifdef RAD10 +#define SCU_MIXER_ENX (P5_4) /* GPIO2[13] on P5_4 */ +#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 */ +#endif /* RF LDO control */ #ifdef JAWBREAKER @@ -151,7 +167,7 @@ extern "C" #endif /* RF supply (VAA) control */ -#ifdef HACKRF_ONE +#if (defined HACKRF_ONE || defined RAD10) #define SCU_NO_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ #endif @@ -180,6 +196,20 @@ extern "C" #define SCU_NO_RX_AMP_PWR (P2_12) /* GPIO1[12] on P2_12 */ #endif +#ifdef RAD10 +#define SCU_BY_AMP (P1_7) /* GPIO1[0] on P1_7 */ +#define SCU_BY_AMP_N (P2_5) /* GPIO5[5] on P2_5 */ +#define SCU_TX_RX (P2_10) /* GPIO0[14] on P2_10 */ +#define SCU_TX_RX_N (P2_11) /* GPIO1[11] on P2_11 */ +#define SCU_BY_MIX (P2_12) /* GPIO1[12] on P2_12 */ +#define SCU_BY_MIX_N (P5_1) /* GPIO2[10] on P5_1 */ +#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 */ +#endif + /* TODO add other Pins */ #define SCU_PINMUX_GPIO3_8 (P7_0) /* GPIO3[8] */ #define SCU_PINMUX_GPIO3_9 (P7_1) /* GPIO3[9] */ @@ -216,6 +246,11 @@ extern "C" #define PIN_LED3 (BIT8) /* GPIO2[8] on P6_12 */ #define PORT_LED1_3 (GPIO2) /* PORT for LED1, 2 & 3 */ +#ifdef RAD10 +#define PIN_LED4 (BIT26) /* GPIO5[26] on PB_6 */ +#define PORT_LED4 (GPIO5) /* PORT for LED4 */ +#endif + #define PIN_EN1V8 (BIT6) /* GPIO3[6] on P6_10 */ #define PORT_EN1V8 (GPIO3) @@ -238,6 +273,14 @@ extern "C" #define PORT_XCVR_B (GPIO2) #endif +#ifdef RAD10 +#define PIN_XCVR_RXHP (BIT1) /* GPIO4[1] on P8_1 */ +#define PORT_XCVR_RXHP (GPIO4) +#define PIN_XCVR_B6 (BIT2) /* GPIO4[2] on P8_2 */ +#define PIN_XCVR_B7 (BIT3) /* GPIO4[3] on P8_3 */ +#define PORT_XCVR_B (GPIO4) +#endif + #define PIN_AD_CS (BIT7) /* GPIO2[7] on P5_7 */ #define PORT_AD_CS (GPIO2) /* PORT for AD_CS */ @@ -261,6 +304,16 @@ extern "C" #define PIN_MIXER_RESETX (BIT14) /* GPIO2[14] on P5_5 */ #define PORT_MIXER_RESETX (GPIO2) #endif +#ifdef RAD10 +#define PIN_MIXER_ENX (BIT13) /* GPIO2[13] on P5_4 */ +#define PORT_MIXER_ENX (GPIO2) +#define PIN_MIXER_SCLK (BIT6) /* GPIO5[6] on P2_6 */ +#define PORT_MIXER_SCLK (GPIO5) +#define PIN_MIXER_SDATA (BIT3) /* GPIO3[3] on P6_4 */ +#define PORT_MIXER_SDATA (GPIO3) +#define PIN_MIXER_LE (BIT14) /* GPIO2[14] on P5_5 */ +#define PORT_MIXER_LE (GPIO2) +#endif #ifdef JAWBREAKER #define PIN_RF_LDO_ENABLE (BIT9) /* GPIO2[9] on P5_0 */ @@ -272,6 +325,11 @@ extern "C" #define PORT_NO_VAA_ENABLE (GPIO2) /* PORT for NO_VAA_ENABLE */ #endif +#ifdef RAD10 +#define PIN_VDD_ENABLE (BIT9) /* GPIO2[9] on P5_0 */ +#define PORT_VDD_ENABLE (GPIO2) /* PORT for VDD_ENABLE */ +#endif + #define PIN_FLASH_HOLD (BIT14) /* GPIO1[14] on P3_4 */ #define PIN_FLASH_WP (BIT15) /* GPIO1[15] on P3_5 */ #define PORT_FLASH (GPIO1) @@ -308,6 +366,31 @@ extern "C" #define PORT_NO_RX_AMP_PWR (GPIO1) #endif +#ifdef RAD10 +#define PIN_BY_AMP (GPIOPIN0) /* GPIO1[0] on P1_7 */ +#define PORT_BY_AMP (GPIO1) +#define PIN_BY_AMP_N (GPIOPIN5) /* GPIO5[5] on P2_5 */ +#define PORT_BY_AMP_N (GPIO5) +#define PIN_TX_RX (GPIOPIN14) /* GPIO0[14] on P2_10 */ +#define PORT_TX_RX (GPIO0) +#define PIN_TX_RX_N (GPIOPIN11) /* GPIO1[11] on P2_11 */ +#define PORT_TX_RX_N (GPIO1) +#define PIN_BY_MIX (GPIOPIN12) /* GPIO1[12] on P2_12 */ +#define PORT_BY_MIX (GPIO1) +#define PIN_BY_MIX_N (GPIOPIN10) /* GPIO2[10] on P5_1 */ +#define PORT_BY_MIX_N (GPIO2) +#define PIN_LOW_HIGH_FILT (GPIOPIN11) /* GPIO2[11] on P5_2 */ +#define PORT_LOW_HIGH_FILT (GPIO2) +#define PIN_LOW_HIGH_FILT_N (GPIOPIN12) /* GPIO2[12] on P5_3 */ +#define PORT_LOW_HIGH_FILT_N (GPIO2) +#define PIN_TX_AMP (GPIOPIN15) /* GPIO2[15] on P5_6 */ +#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 */ #define PIN_BOOT0 (BIT8) /* GPIO0[8] on P1_1 */ #define PIN_BOOT1 (BIT9) /* GPIO0[9] on P1_2 */ @@ -319,7 +402,7 @@ extern "C" #define PORT_CPLD_TDO (GPIO5) #define PIN_CPLD_TCK (GPIOPIN0) #define PORT_CPLD_TCK (GPIO3) -#ifdef HACKRF_ONE +#if (defined HACKRF_ONE || defined RAD10) #define PIN_CPLD_TMS (GPIOPIN4) #define PORT_CPLD_TMS (GPIO3) #define PIN_CPLD_TDI (GPIOPIN1) From c05929fe25d79e836a9f9cec5b820c80d7850d57 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sat, 6 Jun 2015 18:49:09 +0200 Subject: [PATCH 03/58] fix(common, hackf_usb): Make it compile for rad10 --- firmware/common/hackrf_core.h | 7 +- firmware/common/max2871.c | 31 +++++++ firmware/common/mixer.h | 43 ++++++++++ firmware/common/rf_path.c | 114 +++++++++++++++++++++---- firmware/common/rffc5071.c | 55 ++++++------ firmware/common/rffc5071.h | 17 ---- firmware/common/si5351c.c | 2 +- firmware/common/tuning.c | 22 ++--- firmware/hackrf-common.cmake | 8 +- firmware/hackrf_usb/hackrf_usb.c | 5 ++ firmware/hackrf_usb/usb_api_register.c | 5 ++ 11 files changed, 235 insertions(+), 74 deletions(-) create mode 100644 firmware/common/mixer.h diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index e0978bb0..b4629921 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -36,6 +36,7 @@ extern "C" #define BOARD_ID_JELLYBEAN 0 #define BOARD_ID_JAWBREAKER 1 #define BOARD_ID_HACKRF_ONE 2 +#define BOARD_ID_RAD10 3 #ifdef JELLYBEAN #define BOARD_ID BOARD_ID_JELLYBEAN @@ -49,6 +50,10 @@ extern "C" #define BOARD_ID BOARD_ID_HACKRF_ONE #endif +#ifdef RAD10 +#define BOARD_ID BOARD_ID_RAD10 +#endif + /* * SCU PinMux */ @@ -104,7 +109,7 @@ extern "C" #ifdef JELLYBEAN #define SCU_PINMUX_SGPIO8 (P1_12) #endif -#if (defined JAWBREAKER || defined HACKRF_ONE) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) #define SCU_PINMUX_SGPIO8 (P9_6) #endif #define SCU_PINMUX_SGPIO9 (P4_3) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 387a2e25..3e454978 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -1,3 +1,5 @@ +#include + /* * - The input is fixed to 50 MHz * f_REF = 50 MHz @@ -113,3 +115,32 @@ * f_ERROR range: 0 MHz - 1 MHz * */ + +void mixer_init(void) +{} +void mixer_setup(void) +{} + +/* Set frequency (MHz). */ +uint64_t mixer_set_frequency(uint16_t mhz) +{ + (void) mhz; + return mhz; +} + +void mixer_tx(void) +{} +void mixer_rx(void) +{} +void mixer_rxtx(void) +{} +void mixer_enable(void) +{} +void mixer_disable(void) +{} +void mixer_set_gpo(uint8_t gpo) +{ + (void) gpo; +} + + diff --git a/firmware/common/mixer.h b/firmware/common/mixer.h new file mode 100644 index 00000000..1ee30057 --- /dev/null +++ b/firmware/common/mixer.h @@ -0,0 +1,43 @@ +/* + * Copyright 2012 Michael Ossmann + * Copyright 2014 Jared Boone + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __MIXER_H +#define __MIXER_H + +/* Initialize chip. Call _setup() externally, as it calls _init(). */ +extern void mixer_init(void); +extern void mixer_setup(void); + +/* Set frequency (MHz). */ +extern uint64_t mixer_set_frequency(uint16_t mhz); + +/* Set up rx only, tx only, or full duplex. Chip should be disabled + * before _tx, _rx, or _rxtx are called. */ +extern void mixer_tx(void); +extern void mixer_rx(void); +extern void mixer_rxtx(void); +extern void mixer_enable(void); +extern void mixer_disable(void); + +extern void mixer_set_gpo(uint8_t); + +#endif // __MIXER_H diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 46aaac44..36507df6 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -27,12 +27,12 @@ #include -#include +#include #include #include #include -#if (defined JAWBREAKER || defined HACKRF_ONE) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) /* * RF switches on Jawbreaker are controlled by General Purpose Outputs (GPO) on * the RFFC5072. @@ -41,6 +41,9 @@ * SWITCHCTRL_NO_TX_AMP_PWR and SWITCHCTRL_NO_RX_AMP_PWR are not normally used * on HackRF One as the amplifier power is instead controlled only by * SWITCHCTRL_AMP_BYPASS. + * + * The rad10 also uses GPIO pins to control the different switches. The amplifiers + * are also connected to the LPC. */ #define SWITCHCTRL_NO_TX_AMP_PWR (1 << 0) /* GPO1 turn off TX amp power */ #define SWITCHCTRL_AMP_BYPASS (1 << 1) /* GPO2 bypass amp section */ @@ -83,6 +86,83 @@ uint8_t switchctrl = SWITCHCTRL_SAFE; */ #define SWITCHCTRL_ANT_PWR (1 << 6) /* turn on antenna port power */ +#ifdef RAD10 +static void switchctrl_set_rad10(uint8_t ctrl) { + (void)ctrl; +#if 0 + if (ctrl & SWITCHCTRL_TX) { + gpio_set(PORT_TX, PIN_TX); + gpio_clear(PORT_RX, PIN_RX); + } else { + gpio_clear(PORT_TX, PIN_TX); + gpio_set(PORT_RX, PIN_RX); + } + + 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); + } + } 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); + } + + if (ctrl & SWITCHCTRL_HP) { + gpio_set(PORT_HP, PIN_HP); + gpio_clear(PORT_LP, PIN_LP); + } else { + gpio_clear(PORT_HP, PIN_HP); + gpio_set(PORT_LP, PIN_LP); + } + + if (ctrl & SWITCHCTRL_AMP_BYPASS) { + gpio_set(PORT_AMP_BYPASS, PIN_AMP_BYPASS); + 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); + } else if (ctrl & SWITCHCTRL_TX) { + gpio_clear(PORT_AMP_BYPASS, PIN_AMP_BYPASS); + 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); + } else { + gpio_clear(PORT_AMP_BYPASS, PIN_AMP_BYPASS); + 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); + } + + /* + * These normally shouldn't be set post-Jawbreaker, but they can be + * 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_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 */ + } +#endif +} +#endif + + #ifdef HACKRF_ONE static void switchctrl_set_hackrf_one(uint8_t ctrl) { if (ctrl & SWITCHCTRL_TX) { @@ -149,18 +229,20 @@ static void switchctrl_set_hackrf_one(uint8_t ctrl) { gpio_set(PORT_NO_RX_AMP_PWR, PIN_NO_RX_AMP_PWR); if (ctrl & SWITCHCTRL_ANT_PWR) { - rffc5071_set_gpo(0x00); /* turn on antenna power by clearing GPO1 */ + mixer_set_gpo(0x00); /* turn on antenna power by clearing GPO1 */ } else { - rffc5071_set_gpo(0x01); /* turn off antenna power by setting GPO1 */ + mixer_set_gpo(0x01); /* turn off antenna power by setting GPO1 */ } } #endif static void switchctrl_set(const uint8_t gpo) { #ifdef JAWBREAKER - rffc5071_set_gpo(gpo); + mixer_set_gpo(gpo); #elif HACKRF_ONE switchctrl_set_hackrf_one(gpo); +#elif RAD10 + switchctrl_set_rad10(gpo); #else (void)gpo; #endif @@ -215,7 +297,7 @@ void rf_path_init(void) { max2837_setup(); max2837_start(); - rffc5071_setup(); + mixer_setup(); switchctrl_set(switchctrl); } @@ -229,11 +311,11 @@ void rf_path_set_direction(const rf_path_direction_t direction) { /* TX amplifier is in path, be sure to enable TX amplifier. */ switchctrl &= ~SWITCHCTRL_NO_TX_AMP_PWR; } - rffc5071_tx(); + mixer_tx(); if( switchctrl & SWITCHCTRL_MIX_BYPASS ) { - rffc5071_disable(); + mixer_disable(); } else { - rffc5071_enable(); + mixer_enable(); } ssp1_set_mode_max5864(); max5864_tx(); @@ -248,11 +330,11 @@ void rf_path_set_direction(const rf_path_direction_t direction) { /* RX amplifier is in path, be sure to enable RX amplifier. */ switchctrl &= ~SWITCHCTRL_NO_RX_AMP_PWR; } - rffc5071_rx(); + mixer_rx(); if( switchctrl & SWITCHCTRL_MIX_BYPASS ) { - rffc5071_disable(); + mixer_disable(); } else { - rffc5071_enable(); + mixer_enable(); } ssp1_set_mode_max5864(); max5864_rx(); @@ -268,7 +350,7 @@ void rf_path_set_direction(const rf_path_direction_t direction) { #endif /* Set RF path to receive direction when "off" */ switchctrl &= ~SWITCHCTRL_TX; - rffc5071_disable(); + mixer_disable(); ssp1_set_mode_max5864(); max5864_standby(); ssp1_set_mode_max2837(); @@ -285,18 +367,18 @@ void rf_path_set_filter(const rf_path_filter_t filter) { default: case RF_PATH_FILTER_BYPASS: switchctrl |= SWITCHCTRL_MIX_BYPASS; - rffc5071_disable(); + mixer_disable(); break; case RF_PATH_FILTER_LOW_PASS: switchctrl &= ~(SWITCHCTRL_HP | SWITCHCTRL_MIX_BYPASS); - rffc5071_enable(); + mixer_enable(); break; case RF_PATH_FILTER_HIGH_PASS: switchctrl &= ~SWITCHCTRL_MIX_BYPASS; switchctrl |= SWITCHCTRL_HP; - rffc5071_enable(); + mixer_enable(); break; } diff --git a/firmware/common/rffc5071.c b/firmware/common/rffc5071.c index 96745eb4..4a31c38f 100644 --- a/firmware/common/rffc5071.c +++ b/firmware/common/rffc5071.c @@ -33,6 +33,7 @@ #include #include +#include "mixer.h" #include "rffc5071.h" #include "rffc5071_regs.def" // private register def macros @@ -87,9 +88,9 @@ uint16_t rffc5071_regs[RFFC5071_NUM_REGS]; uint32_t rffc5071_regs_dirty = 0x7fffffff; /* Set up all registers according to defaults specified in docs. */ -void rffc5071_init(void) +void mixer_init(void) { - LOG("# rffc5071_init\n"); + LOG("# mixer_init\n"); memcpy(rffc5071_regs, rffc5071_regs_default, sizeof(rffc5071_regs)); rffc5071_regs_dirty = 0x7fffffff; @@ -101,10 +102,10 @@ void rffc5071_init(void) * Set up pins for GPIO and SPI control, configure SSP peripheral for SPI, and * set our own default register configuration. */ -void rffc5071_setup(void) +void mixer_setup(void) { - rffc5071_init(); - LOG("# rffc5071_setup\n"); + mixer_init(); + LOG("# mixer_setup\n"); #if !defined TEST /* Configure GPIO pins. */ scu_pinmux(SCU_MIXER_ENX, SCU_GPIO_FAST); @@ -363,7 +364,7 @@ void rffc5071_regs_commit(void) } } -void rffc5071_tx(void) { +void mixer_tx(void) { LOG("# rffc5071_tx\n"); set_RFFC5071_ENBL(0); set_RFFC5071_FULLD(0); @@ -371,7 +372,7 @@ void rffc5071_tx(void) { rffc5071_regs_commit(); } -void rffc5071_rx(void) { +void mixer_rx(void) { LOG("# rfc5071_rx\n"); set_RFFC5071_ENBL(0); set_RFFC5071_FULLD(0); @@ -383,22 +384,22 @@ void rffc5071_rx(void) { * This function turns on both mixer (full-duplex) on the RFFC5071, but our * current hardware designs do not support full-duplex operation. */ -void rffc5071_rxtx(void) { +void mixer_rxtx(void) { LOG("# rfc5071_rxtx\n"); set_RFFC5071_ENBL(0); set_RFFC5071_FULLD(1); /* mixer 1 and mixer 2 (RXTX) */ rffc5071_regs_commit(); - rffc5071_enable(); + mixer_enable(); } -void rffc5071_disable(void) { +void mixer_disable(void) { LOG("# rfc5071_disable\n"); set_RFFC5071_ENBL(0); rffc5071_regs_commit(); } -void rffc5071_enable(void) { +void mixer_enable(void) { LOG("# rfc5071_enable\n"); set_RFFC5071_ENBL(1); rffc5071_regs_commit(); @@ -475,17 +476,17 @@ uint64_t rffc5071_config_synth_int(uint16_t lo) { } /* !!!!!!!!!!! hz is currently ignored !!!!!!!!!!! */ -uint64_t rffc5071_set_frequency(uint16_t mhz) { +uint64_t mixer_set_frequency(uint16_t mhz) { uint32_t tune_freq; - rffc5071_disable(); + mixer_disable(); tune_freq = rffc5071_config_synth_int(mhz); - rffc5071_enable(); + mixer_enable(); return tune_freq; } -void rffc5071_set_gpo(uint8_t gpo) +void mixer_set_gpo(uint8_t gpo) { /* We set GPO for both paths just in case. */ set_RFFC5071_P1GPO(gpo); @@ -497,18 +498,18 @@ void rffc5071_set_gpo(uint8_t gpo) #ifdef TEST int main(int ac, char **av) { - rffc5071_setup(); + mixer_setup(); rffc5071_tx(0); - rffc5071_set_frequency(500, 0); - rffc5071_set_frequency(525, 0); - rffc5071_set_frequency(550, 0); - rffc5071_set_frequency(1500, 0); - rffc5071_set_frequency(1525, 0); - rffc5071_set_frequency(1550, 0); - rffc5071_disable(); - rffc5071_rx(0); - rffc5071_disable(); - rffc5071_rxtx(); - rffc5071_disable(); + mixer_set_frequency(500, 0); + mixer_set_frequency(525, 0); + mixer_set_frequency(550, 0); + mixer_set_frequency(1500, 0); + mixer_set_frequency(1525, 0); + mixer_set_frequency(1550, 0); + mixer_disable(); + mixer_rx(0); + mixer_disable(); + mixer_rxtx(); + mixer_disable(); } #endif //TEST diff --git a/firmware/common/rffc5071.h b/firmware/common/rffc5071.h index 98c31a3e..fa72c3b6 100644 --- a/firmware/common/rffc5071.h +++ b/firmware/common/rffc5071.h @@ -32,10 +32,6 @@ extern uint32_t rffc5071_regs_dirty; #define RFFC5071_REG_SET_CLEAN(r) rffc5071_regs_dirty &= ~(1UL< +#include #include #include @@ -53,9 +53,9 @@ uint64_t freq_cache = 100000000; bool set_freq(const uint64_t freq) { bool success; - uint32_t RFFC5071_freq_mhz; + uint32_t mixer_freq_mhz; uint32_t MAX2837_freq_hz; - uint64_t real_RFFC5071_freq_hz; + uint64_t real_mixer_freq_hz; const uint32_t freq_mhz = freq / 1000000; const uint32_t freq_hz = freq % 1000000; @@ -69,16 +69,16 @@ bool set_freq(const uint64_t freq) rf_path_set_filter(RF_PATH_FILTER_LOW_PASS); /* IF is graduated from 2650 MHz to 2343 MHz */ max2837_freq_nominal_hz = 2650000000 - (freq / 7); - RFFC5071_freq_mhz = (max2837_freq_nominal_hz / FREQ_ONE_MHZ) + freq_mhz; + mixer_freq_mhz = (max2837_freq_nominal_hz / FREQ_ONE_MHZ) + freq_mhz; /* Set Freq and read real freq */ - real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz); - max2837_set_frequency(real_RFFC5071_freq_hz - freq); + real_mixer_freq_hz = mixer_set_frequency(mixer_freq_mhz); + max2837_set_frequency(real_mixer_freq_hz - freq); sgpio_cpld_stream_rx_set_q_invert(1); }else if( (freq_mhz >= MIN_BYPASS_FREQ_MHZ) && (freq_mhz < MAX_BYPASS_FREQ_MHZ) ) { rf_path_set_filter(RF_PATH_FILTER_BYPASS); MAX2837_freq_hz = (freq_mhz * FREQ_ONE_MHZ) + freq_hz; - /* RFFC5071_freq_mhz <= not used in Bypass mode */ + /* mixer_freq_mhz <= not used in Bypass mode */ max2837_set_frequency(MAX2837_freq_hz); sgpio_cpld_stream_rx_set_q_invert(0); }else if( (freq_mhz >= MIN_HP_FREQ_MHZ) && (freq_mhz <= MAX_HP_FREQ_MHZ) ) @@ -94,10 +94,10 @@ bool set_freq(const uint64_t freq) max2837_freq_nominal_hz = 2500000000 + ((freq - 5100000000) / 9); } rf_path_set_filter(RF_PATH_FILTER_HIGH_PASS); - RFFC5071_freq_mhz = freq_mhz - (max2837_freq_nominal_hz / FREQ_ONE_MHZ); + mixer_freq_mhz = freq_mhz - (max2837_freq_nominal_hz / FREQ_ONE_MHZ); /* Set Freq and read real freq */ - real_RFFC5071_freq_hz = rffc5071_set_frequency(RFFC5071_freq_mhz); - max2837_set_frequency(freq - real_RFFC5071_freq_hz); + real_mixer_freq_hz = mixer_set_frequency(mixer_freq_mhz); + max2837_set_frequency(freq - real_mixer_freq_hz); sgpio_cpld_stream_rx_set_q_invert(0); }else { @@ -136,7 +136,7 @@ bool set_freq_explicit(const uint64_t if_freq_hz, const uint64_t lo_freq_hz, sgpio_cpld_stream_rx_set_q_invert(0); } if (path != RF_PATH_FILTER_BYPASS) { - (void)rffc5071_set_frequency(lo_freq_hz / FREQ_ONE_MHZ); + (void)mixer_set_frequency(lo_freq_hz / FREQ_ONE_MHZ); } return true; } diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index df5d5c96..d2581ac1 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -59,6 +59,12 @@ else() set(MCU_PARTNO LPC4330) endif() +if(BOARD STREQUAL "RAD10") + set(MIXER max2871) +else() + set(MIXER rffc5071) +endif() + if(NOT DEFINED SRC_M0) set(SRC_M0 "${PATH_HACKRF_FIRMWARE_COMMON}/m0_sleep.c") endif() @@ -136,7 +142,7 @@ macro(DeclareTargets) ${PATH_HACKRF_FIRMWARE_COMMON}/si5351c.c ${PATH_HACKRF_FIRMWARE_COMMON}/max2837.c ${PATH_HACKRF_FIRMWARE_COMMON}/max5864.c - ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071.c + ${PATH_HACKRF_FIRMWARE_COMMON}/${MIXER}.c m0_bin.s ) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index e842d82b..53f41505 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -116,8 +116,13 @@ static const usb_request_handler_fn vendor_request_handler[] = { usb_vendor_request_read_si5351c, usb_vendor_request_set_sample_rate_frac, usb_vendor_request_set_baseband_filter_bandwidth, +#ifdef RAD10 + NULL, + NULL, +#else usb_vendor_request_write_rffc5071, usb_vendor_request_read_rffc5071, +#endif usb_vendor_request_erase_spiflash, usb_vendor_request_write_spiflash, usb_vendor_request_read_spiflash, diff --git a/firmware/hackrf_usb/usb_api_register.c b/firmware/hackrf_usb/usb_api_register.c index d822c924..ac8f7e70 100644 --- a/firmware/hackrf_usb/usb_api_register.c +++ b/firmware/hackrf_usb/usb_api_register.c @@ -25,7 +25,10 @@ #include #include #include + +#ifndef RAD10 #include +#endif #include #include @@ -105,6 +108,7 @@ usb_request_status_t usb_vendor_request_read_si5351c( } } +#ifndef RAD10 usb_request_status_t usb_vendor_request_write_rffc5071( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage @@ -145,3 +149,4 @@ usb_request_status_t usb_vendor_request_read_rffc5071( return USB_REQUEST_STATUS_OK; } } +#endif From d3cb14650de3fe966a80e6422fe41294592e087b Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sat, 6 Jun 2015 19:22:35 +0200 Subject: [PATCH 04/58] fix(rf_path): TX/RX switch --- firmware/common/rf_path.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 36507df6..edebed69 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -88,16 +88,15 @@ uint8_t switchctrl = SWITCHCTRL_SAFE; #ifdef RAD10 static void switchctrl_set_rad10(uint8_t ctrl) { - (void)ctrl; -#if 0 if (ctrl & SWITCHCTRL_TX) { - gpio_set(PORT_TX, PIN_TX); - gpio_clear(PORT_RX, PIN_RX); + gpio_set(PORT_TX_RX_N, PIN_TX_RX_N); + gpio_clear(PORT_TX_RX, PIN_TX_RX); } else { - gpio_clear(PORT_TX, PIN_TX); - gpio_set(PORT_RX, PIN_RX); + gpio_clear(PORT_TX_RX_N, PIN_TX_RX_N); + 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); From 9e6ae19e104ac16ab901fe213fbd853bc75af349 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sun, 7 Jun 2015 03:35:59 +0200 Subject: [PATCH 05/58] 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) { From b4b768c76f49aeeeeb669e68e67368a06269d714 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sun, 7 Jun 2015 13:58:46 +0200 Subject: [PATCH 06/58] feat(max2871.c): Set the default values after reset --- firmware/common/hackrf_core.h | 24 +++--- firmware/common/max2871.c | 128 ++++++++++++++++++++++++++++++- firmware/common/mixer.h | 2 + firmware/common/rf_path.c | 4 + firmware/hackrf_usb/hackrf_usb.c | 2 +- 5 files changed, 143 insertions(+), 17 deletions(-) diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 1c7fdca4..9325cb87 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -160,10 +160,10 @@ extern "C" #define SCU_MIXER_RESETX (P5_5) /* GPIO2[14] on P5_5 */ #endif #ifdef RAD10 -#define SCU_MIXER_ENX (P5_4) /* GPIO2[13] on P5_4 */ -#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_VCO_CE (P5_4) /* GPIO2[13] on P5_4 */ +#define SCU_VCO_SCLK (P2_6) /* GPIO5[6] on P2_6 */ +#define SCU_VCO_SDATA (P6_4) /* GPIO3[3] on P6_4 */ +#define SCU_VCO_LE (P5_5) /* GPIO2[14] on P5_5 */ #define SCU_MIXER_EN (P6_8) /* GPIO5[16] on P6_8 */ #endif @@ -315,14 +315,14 @@ extern "C" #define PORT_MIXER_RESETX (GPIO2) #endif #ifdef RAD10 -#define PIN_MIXER_ENX (BIT13) /* GPIO2[13] on P5_4 */ -#define PORT_MIXER_ENX (GPIO2) -#define PIN_MIXER_SCLK (BIT6) /* GPIO5[6] on P2_6 */ -#define PORT_MIXER_SCLK (GPIO5) -#define PIN_MIXER_SDATA (BIT3) /* GPIO3[3] on P6_4 */ -#define PORT_MIXER_SDATA (GPIO3) -#define PIN_MIXER_LE (BIT14) /* GPIO2[14] on P5_5 */ -#define PORT_MIXER_LE (GPIO2) +#define PIN_VCO_CE (BIT13) /* GPIO2[13] on P5_4 */ +#define PORT_VCO_CE (GPIO2) +#define PIN_VCO_SCLK (BIT6) /* GPIO5[6] on P2_6 */ +#define PORT_VCO_SCLK (GPIO5) +#define PIN_VCO_SDATA (BIT3) /* GPIO3[3] on P6_4 */ +#define PORT_VCO_SDATA (GPIO3) +#define PIN_VCO_LE (BIT14) /* GPIO2[14] on P5_5 */ +#define PORT_VCO_LE (GPIO2) #define PIN_MIXER_EN (BIT16) /* GPIO5[16] on P6_8 */ #define PORT_MIXER_EN (GPIO5) #endif diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 3e454978..5b960e8a 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -1,5 +1,25 @@ -#include +#include "mixer.h" +//#include "max2871.h" +//#include "mac2871_regs.def" // private register def macros +#if (defined DEBUG) +#include +#define LOG printf +#else +#define LOG(x,...) +#include +#include +#include +#include "hackrf_core.h" +#endif + +#include +#include + +static void max2871_spi_write(uint8_t r, uint32_t v); +static void delay_ms(int ms); + +static uint32_t registers[6]; /* * - The input is fixed to 50 MHz * f_REF = 50 MHz @@ -116,10 +136,110 @@ * */ -void mixer_init(void) -{} void mixer_setup(void) -{} +{ + /* Configure GPIO pins. */ + scu_pinmux(SCU_VCO_CE, SCU_GPIO_FAST); + //scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); + scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST); + scu_pinmux(SCU_VCO_SDATA, SCU_GPIO_FAST); + scu_pinmux(SCU_VCO_LE, SCU_GPIO_FAST); + + /* Set GPIO pins as outputs. */ + GPIO_DIR(PORT_VCO_CE) |= PIN_VCO_CE; + GPIO_DIR(PORT_VCO_SCLK) |= PIN_VCO_SCLK; + GPIO_DIR(PORT_VCO_SDATA) |= PIN_VCO_SDATA; + GPIO_DIR(PORT_VCO_LE) |= PIN_VCO_LE; + + /* set to known state */ + gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ + gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); + gpio_set(PORT_VCO_LE, PIN_VCO_LE); /* active low */ + + registers[0] = 0x007D0000; + registers[1] = 0x2000FFF9; + registers[2] = 0x00004042; + registers[3] = 0x0000000B; + registers[4] = 0x6180B23C; + registers[5] = 0x00400005; + + int i; + for(i = 5; i >= 0; i--) { + max2871_spi_write(i, registers[i]); + delay_ms(20); + } +} + +static void delay_ms(int ms) +{ + uint32_t i; + while(ms--) { + for (i = 0; i < 20000; i++) { + __asm__("nop"); + } + } +} + + +static void serial_delay(void) +{ + uint32_t i; + + for (i = 0; i < 2; i++) + __asm__("nop"); +} + + +/* SPI register write + * + * Send 32 bits: + * First 29 bits are data + * Last 3 bits are register number + */ +static void max2871_spi_write(uint8_t r, uint32_t v) { + +#if DEBUG + LOG("0x%04x -> reg%d\n", v, r); +#else + + uint32_t bits = 32; + uint32_t msb = 1 << (bits -1); + uint32_t data = v | r; + + /* make sure everything is starting in the correct state */ + gpio_set(PORT_VCO_LE, PIN_VCO_LE); + gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); + + /* start transaction by bringing LE low */ + gpio_clear(PORT_VCO_LE, PIN_VCO_LE); + + while (bits--) { + if (data & msb) + gpio_set(PORT_VCO_SDATA, PIN_VCO_SDATA); + else + gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); + data <<= 1; + + serial_delay(); + gpio_set(PORT_VCO_SCLK, PIN_VCO_SCLK); + + serial_delay(); + gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + } + + gpio_set(PORT_VCO_LE, PIN_VCO_LE); +#endif +} + +void max2871_write_registers(void) +{ + int i; + for(i = 5; i >= 0; i--) { + max2871_spi_write(i, registers[i]); + } +} /* Set frequency (MHz). */ uint64_t mixer_set_frequency(uint16_t mhz) diff --git a/firmware/common/mixer.h b/firmware/common/mixer.h index 1ee30057..d48e748b 100644 --- a/firmware/common/mixer.h +++ b/firmware/common/mixer.h @@ -23,6 +23,8 @@ #ifndef __MIXER_H #define __MIXER_H +#include + /* Initialize chip. Call _setup() externally, as it calls _init(). */ extern void mixer_init(void); extern void mixer_setup(void); diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index ba2cc12e..906e613b 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -99,9 +99,11 @@ static void switchctrl_set_rad10(uint8_t ctrl) { if (ctrl & SWITCHCTRL_MIX_BYPASS) { gpio_clear(PORT_BY_MIX, PIN_BY_MIX); gpio_set(PORT_BY_MIX_N, PIN_BY_MIX_N); + gpio_clear(PORT_MIXER_EN, PIN_MIXER_EN); } else { gpio_set(PORT_BY_MIX, PIN_BY_MIX); gpio_clear(PORT_BY_MIX_N, PIN_BY_MIX_N); + gpio_set(PORT_MIXER_EN, PIN_MIXER_EN); } if (ctrl & SWITCHCTRL_HP) { @@ -301,6 +303,7 @@ void rf_path_pin_setup() { 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); + scu_pinmux(SCU_MIXER_EN, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); /* Configure RF power supply (VAA) switch */ scu_pinmux(SCU_VAA_ENABLE, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); @@ -310,6 +313,7 @@ void rf_path_pin_setup() { 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; + GPIO_DIR(PORT_MIXER_EN) |= PIN_MIXER_EN; /* * Safe (initial) switch settings turn off both amplifiers and antenna port diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 53f41505..ca20293e 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -219,7 +219,7 @@ void usb_set_descriptor_by_serial_number(void) int main(void) { pin_setup(); enable_1v8_power(); -#ifdef HACKRF_ONE +#if (defined HACKRF_ONE || defined RAD10) enable_rf_power(); #endif cpu_clock_init(); From cf6fe302bc536acbfa981f23a88b90e203809c84 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sun, 7 Jun 2015 17:07:36 +0200 Subject: [PATCH 07/58] feat(max2871.c): POC --- firmware/common/hackrf_core.h | 3 + firmware/common/max2871.c | 75 +++++++-- firmware/common/max2871_regs.c | 299 +++++++++++++++++++++++++++++++++ firmware/common/max2871_regs.h | 54 ++++++ 4 files changed, 417 insertions(+), 14 deletions(-) create mode 100644 firmware/common/max2871_regs.c create mode 100644 firmware/common/max2871_regs.h diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 9325cb87..1ae0fc01 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -165,6 +165,7 @@ extern "C" #define SCU_VCO_SDATA (P6_4) /* GPIO3[3] on P6_4 */ #define SCU_VCO_LE (P5_5) /* GPIO2[14] on P5_5 */ #define SCU_MIXER_EN (P6_8) /* GPIO5[16] on P6_8 */ +#define SCU_SYNT_RFOUT_EN (P6_9) /* GPIO3[5] on P6_9 */ #endif /* RF LDO control */ @@ -325,6 +326,8 @@ extern "C" #define PORT_VCO_LE (GPIO2) #define PIN_MIXER_EN (BIT16) /* GPIO5[16] on P6_8 */ #define PORT_MIXER_EN (GPIO5) +#define PIN_SYNT_RFOUT_EN (BIT5) /* GPIO3[5] on P6_9 */ +#define PORT_SYNT_RFOUT_EN (GPIO3) #endif #ifdef JAWBREAKER diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 5b960e8a..cba655c7 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -1,6 +1,7 @@ #include "mixer.h" //#include "max2871.h" -//#include "mac2871_regs.def" // private register def macros +// TODO: put max2871_regs.c into the build system +#include "max2871_regs.c" #if (defined DEBUG) #include @@ -17,9 +18,9 @@ #include static void max2871_spi_write(uint8_t r, uint32_t v); +static void max2871_write_registers(void); static void delay_ms(int ms); -static uint32_t registers[6]; /* * - The input is fixed to 50 MHz * f_REF = 50 MHz @@ -140,35 +141,81 @@ void mixer_setup(void) { /* Configure GPIO pins. */ scu_pinmux(SCU_VCO_CE, SCU_GPIO_FAST); - //scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); - scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST); + scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); + //Only used for the debug pin config: scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_SDATA, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_LE, SCU_GPIO_FAST); + scu_pinmux(SCU_SYNT_RFOUT_EN, SCU_GPIO_FAST); /* Set GPIO pins as outputs. */ GPIO_DIR(PORT_VCO_CE) |= PIN_VCO_CE; GPIO_DIR(PORT_VCO_SCLK) |= PIN_VCO_SCLK; GPIO_DIR(PORT_VCO_SDATA) |= PIN_VCO_SDATA; GPIO_DIR(PORT_VCO_LE) |= PIN_VCO_LE; + GPIO_DIR(PORT_SYNT_RFOUT_EN) |= PIN_SYNT_RFOUT_EN; /* set to known state */ gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); gpio_set(PORT_VCO_LE, PIN_VCO_LE); /* active low */ + gpio_set(PORT_SYNT_RFOUT_EN, PIN_SYNT_RFOUT_EN); /* active high */ - registers[0] = 0x007D0000; - registers[1] = 0x2000FFF9; - registers[2] = 0x00004042; - registers[3] = 0x0000000B; - registers[4] = 0x6180B23C; - registers[5] = 0x00400005; - + max2871_regs_init(); int i; for(i = 5; i >= 0; i--) { - max2871_spi_write(i, registers[i]); + max2871_spi_write(i, max2871_get_register(i)); delay_ms(20); } + + max2871_set_INT(1); + max2871_set_N(4500); + max2871_set_FRAC(0); + max2871_set_CPL(0); + max2871_set_CPT(0); + max2871_set_P(1); + max2871_set_M(0); + max2871_set_LDS(0); + max2871_set_SDN(0); + max2871_set_MUX(3); + max2871_set_DBR(0); + max2871_set_RDIV2(0); + max2871_set_R(50); // 1 MHz f_PFD + max2871_set_REG4DB(0); + max2871_set_CP(3); // ?: CP current up 0-3 + max2871_set_LDF(1); // INT-N + max2871_set_LDP(0); // ?: Lock-Detect Precision + max2871_set_PDP(1); + max2871_set_SHDN(0); + max2871_set_TRI(0); + max2871_set_RST(0); + max2871_set_VCO(0); + max2871_set_VAS_SHDN(0); + max2871_set_VAS_TEMP(0); + max2871_set_CSM(0); + max2871_set_MUTEDEL(1); + max2871_set_CDM(0); + max2871_set_CDIV(0); + max2871_set_SDLDO(0); + max2871_set_SDDIV(0); + max2871_set_SDREF(0); + max2871_set_BS(20); // For 1 MHz f_PFD + max2871_set_FB(1); // Do not put DIVA into the feedback loop + max2871_set_DIVA(0); + max2871_set_SDVCO(0); + max2871_set_MTLD(1); + max2871_set_BDIV(0); + max2871_set_RFB_EN(0); + max2871_set_BPWR(0); + max2871_set_RFA_EN(1); + max2871_set_APWR(3); + max2871_set_SDPLL(0); + max2871_set_F01(1); + max2871_set_LD(1); + max2871_set_ADCS(0); + max2871_set_ADCM(0); + + max2871_write_registers(); } static void delay_ms(int ms) @@ -233,11 +280,11 @@ static void max2871_spi_write(uint8_t r, uint32_t v) { #endif } -void max2871_write_registers(void) +static void max2871_write_registers(void) { int i; for(i = 5; i >= 0; i--) { - max2871_spi_write(i, registers[i]); + max2871_spi_write(i, max2871_get_register(i)); } } diff --git a/firmware/common/max2871_regs.c b/firmware/common/max2871_regs.c new file mode 100644 index 00000000..aec781d1 --- /dev/null +++ b/firmware/common/max2871_regs.c @@ -0,0 +1,299 @@ +#include "max2871_regs.h" +#include + +static uint32_t registers[6]; + +void max2871_regs_init(void) +{ + registers[0] = 0x007D0000; + registers[1] = 0x2000FFF9; + registers[2] = 0x00004042; + registers[3] = 0x0000000B; + registers[4] = 0x6180B23C; + registers[5] = 0x00400005; +} + +uint32_t max2871_get_register(int reg) +{ + return registers[reg]; +} + +void max2871_set_INT(uint32_t v) +{ + registers[0] &= ~(0x1 << 31); + registers[0] |= v << 31; +} + +void max2871_set_N(uint32_t v) +{ + registers[0] &= ~(0xFFFF << 15); + registers[0] |= v << 15; +} + +void max2871_set_FRAC(uint32_t v) +{ + registers[0] &= ~(0xFFF << 3); + registers[0] |= v << 3; +} + +void max2871_set_CPL(uint32_t v) +{ + registers[1] &= ~(0x3 << 29); + registers[1] |= v << 29; +} + +void max2871_set_CPT(uint32_t v) +{ + registers[1] &= ~(0x3 << 27); + registers[1] |= v << 27; +} + +void max2871_set_P(uint32_t v) +{ + registers[1] &= ~(0xFFF << 15); + registers[1] |= v << 15; +} + +void max2871_set_M(uint32_t v) +{ + registers[1] &= ~(0xFFF << 3); + registers[1] |= v << 3; +} + +void max2871_set_LDS(uint32_t v) +{ + registers[2] &= ~(0x1 << 31); + registers[2] |= v << 31; +} + +void max2871_set_SDN(uint32_t v) +{ + registers[2] &= ~(0x3 << 29); + registers[2] |= v << 29; +} + +void max2871_set_MUX(uint32_t v) +{ + registers[2] &= ~(0x7 << 26); + registers[5] &= ~(0x1 << 18); + registers[2] |= (v & 0x7) << 26; + registers[5] |= ((v & 0x8) >> 3) << 18; +} + +void max2871_set_DBR(uint32_t v) +{ + registers[2] &= ~(0x1 << 25); + registers[2] |= v << 25; +} + +void max2871_set_RDIV2(uint32_t v) +{ + registers[2] &= ~(0x1 << 24); + registers[2] |= v << 24; +} + +void max2871_set_R(uint32_t v) +{ + registers[2] &= ~(0x3FF << 14); + registers[2] |= v << 14; +} + +void max2871_set_REG4DB(uint32_t v) +{ + registers[2] &= ~(0x1 << 13); + registers[2] |= v << 13; +} + +void max2871_set_CP(uint32_t v) +{ + registers[2] &= ~(0xF << 9); + registers[2] |= v << 9; +} + +void max2871_set_LDF(uint32_t v) +{ + registers[2] &= ~(0x1 << 8); + registers[2] |= v << 8; +} + +void max2871_set_LDP(uint32_t v) +{ + registers[2] &= ~(0x1 << 7); + registers[2] |= v << 7; +} + +void max2871_set_PDP(uint32_t v) +{ + registers[2] &= ~(0x1 << 6); + registers[2] |= v << 6; +} + +void max2871_set_SHDN(uint32_t v) +{ + registers[2] &= ~(0x1 << 5); + registers[2] |= v << 5; +} + +void max2871_set_TRI(uint32_t v) +{ + registers[2] &= ~(0x1 << 4); + registers[2] |= v << 4; +} + +void max2871_set_RST(uint32_t v) +{ + registers[2] &= ~(0x1 << 3); + registers[2] |= v << 3; +} + +void max2871_set_VCO(uint32_t v) +{ + registers[3] &= ~(0x3F << 26); + registers[3] |= v << 26; +} + +void max2871_set_VAS_SHDN(uint32_t v) +{ + registers[3] &= ~(0x1 << 25); + registers[3] |= v << 25; +} + +void max2871_set_VAS_TEMP(uint32_t v) +{ + registers[3] &= ~(0x1 << 24); + registers[3] |= v << 24; +} + +void max2871_set_CSM(uint32_t v) +{ + registers[3] &= ~(0x1 << 18); + registers[3] |= v << 18; +} + +void max2871_set_MUTEDEL(uint32_t v) +{ + registers[3] &= ~(0x1 << 17); + registers[3] |= v << 17; +} + +void max2871_set_CDM(uint32_t v) +{ + registers[3] &= ~(0x3 << 15); + registers[3] |= v << 15; +} + +void max2871_set_CDIV(uint32_t v) +{ + registers[3] &= ~(0xFFF << 3); + registers[3] |= v << 3; +} + +void max2871_set_SDLDO(uint32_t v) +{ + registers[4] &= ~(0x1 << 28); + registers[4] |= v << 28; +} + +void max2871_set_SDDIV(uint32_t v) +{ + registers[4] &= ~(0x1 << 27); + registers[4] |= v << 27; +} + +void max2871_set_SDREF(uint32_t v) +{ + registers[4] &= ~(0x1 << 26); + registers[4] |= v << 26; +} + +void max2871_set_BS(uint32_t v) +{ + registers[4] &= ~(0x3 << 24); + registers[4] &= ~(0xFF << 12); + registers[4] |= ((v & 0x300) >> 8) << 24; + registers[4] |= (v & 0xFF) << 12; +} + +void max2871_set_FB(uint32_t v) +{ + registers[4] &= ~(0x1 << 23); + registers[4] |= v << 23; +} + +void max2871_set_DIVA(uint32_t v) +{ + registers[4] &= ~(0x7 << 20); + registers[4] |= v << 20; +} + +void max2871_set_SDVCO(uint32_t v) +{ + registers[4] &= ~(0x1 << 11); + registers[4] |= v << 11; +} + +void max2871_set_MTLD(uint32_t v) +{ + registers[4] &= ~(0x1 << 10); + registers[4] |= v << 10; +} + +void max2871_set_BDIV(uint32_t v) +{ + registers[4] &= ~(0x1 << 9); + registers[4] |= v << 9; +} + +void max2871_set_RFB_EN(uint32_t v) +{ + registers[4] &= ~(0x1 << 8); + registers[4] |= v << 8; +} + +void max2871_set_BPWR(uint32_t v) +{ + registers[4] &= ~(0x3 << 6); + registers[4] |= v << 6; +} + +void max2871_set_RFA_EN(uint32_t v) +{ + registers[4] &= ~(0x1 << 5); + registers[4] |= v << 5; +} + +void max2871_set_APWR(uint32_t v) +{ + registers[4] &= ~(0x3 << 3); + registers[4] |= v << 3; +} + +void max2871_set_SDPLL(uint32_t v) +{ + registers[5] &= ~(0x1 << 25); + registers[5] |= v << 25; +} + +void max2871_set_F01(uint32_t v) +{ + registers[5] &= ~(0x1 << 24); + registers[5] |= v << 24; +} + +void max2871_set_LD(uint32_t v) +{ + registers[5] &= ~(0x3 << 22); + registers[5] |= v << 22; +} + +void max2871_set_ADCS(uint32_t v) +{ + registers[5] &= ~(0x1 << 6); + registers[5] |= v << 6; +} + +void max2871_set_ADCM(uint32_t v) +{ + registers[5] &= ~(0x7 << 3); + registers[5] |= v << 3; +} diff --git a/firmware/common/max2871_regs.h b/firmware/common/max2871_regs.h new file mode 100644 index 00000000..223f8b7f --- /dev/null +++ b/firmware/common/max2871_regs.h @@ -0,0 +1,54 @@ +#ifndef MAX2871_H +#define MAX2871_H +#include + +void max2871_regs_init(void); +uint32_t max2871_get_register(int reg); + +void max2871_set_INT(uint32_t v); +void max2871_set_N(uint32_t v); +void max2871_set_FRAC(uint32_t v); +void max2871_set_CPL(uint32_t v); +void max2871_set_CPT(uint32_t v); +void max2871_set_P(uint32_t v); +void max2871_set_M(uint32_t v); +void max2871_set_LDS(uint32_t v); +void max2871_set_SDN(uint32_t v); +void max2871_set_MUX(uint32_t v); +void max2871_set_DBR(uint32_t v); +void max2871_set_RDIV2(uint32_t v); +void max2871_set_R(uint32_t v); +void max2871_set_REG4DB(uint32_t v); +void max2871_set_CP(uint32_t v); +void max2871_set_LDF(uint32_t v); +void max2871_set_LDP(uint32_t v); +void max2871_set_PDP(uint32_t v); +void max2871_set_SHDN(uint32_t v); +void max2871_set_TRI(uint32_t v); +void max2871_set_RST(uint32_t v); +void max2871_set_VCO(uint32_t v); +void max2871_set_VAS_SHDN(uint32_t v); +void max2871_set_VAS_TEMP(uint32_t v); +void max2871_set_CSM(uint32_t v); +void max2871_set_MUTEDEL(uint32_t v); +void max2871_set_CDM(uint32_t v); +void max2871_set_CDIV(uint32_t v); +void max2871_set_SDLDO(uint32_t v); +void max2871_set_SDDIV(uint32_t v); +void max2871_set_SDREF(uint32_t v); +void max2871_set_BS(uint32_t v); +void max2871_set_FB(uint32_t v); +void max2871_set_DIVA(uint32_t v); +void max2871_set_SDVCO(uint32_t v); +void max2871_set_MTLD(uint32_t v); +void max2871_set_BDIV(uint32_t v); +void max2871_set_RFB_EN(uint32_t v); +void max2871_set_BPWR(uint32_t v); +void max2871_set_RFA_EN(uint32_t v); +void max2871_set_APWR(uint32_t v); +void max2871_set_SDPLL(uint32_t v); +void max2871_set_F01(uint32_t v); +void max2871_set_LD(uint32_t v); +void max2871_set_ADCS(uint32_t v); +void max2871_set_ADCM(uint32_t v); +#endif From c79c53c52f58ac075e79a083475ca92c3374fb5f Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sun, 7 Jun 2015 23:33:24 +0200 Subject: [PATCH 08/58] chore(name): We are now rad1o --- firmware/common/hackrf_core.c | 6 ++--- firmware/common/hackrf_core.h | 34 +++++++++++++------------- firmware/common/rf_path.c | 14 +++++------ firmware/common/si5351c.c | 2 +- firmware/hackrf-common.cmake | 2 +- firmware/hackrf_usb/hackrf_usb.c | 4 +-- firmware/hackrf_usb/usb_api_register.c | 4 +-- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 394b2fea..75245ea1 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -185,7 +185,7 @@ bool sample_rate_set(const uint32_t sample_rate_hz) { return true; #endif -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) uint32_t p1 = 4608; uint32_t p2 = 0; uint32_t p3 = 0; @@ -297,7 +297,7 @@ void cpu_clock_init(void) si5351c_configure_multisynth(5, 1536, 0, 1, 0); /* 50MHz */ #endif -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) /* * Jawbreaker clocks: * CLK0 -> MAX5864/CPLD @@ -643,7 +643,7 @@ void disable_rf_power(void) { } #endif -#ifdef RAD10 +#ifdef RAD1O void enable_rf_power(void) { gpio_set(PORT_VAA_ENABLE, PIN_VAA_ENABLE); } diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 1ae0fc01..d358da61 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -36,7 +36,7 @@ extern "C" #define BOARD_ID_JELLYBEAN 0 #define BOARD_ID_JAWBREAKER 1 #define BOARD_ID_HACKRF_ONE 2 -#define BOARD_ID_RAD10 3 +#define BOARD_ID_RAD1O 3 #ifdef JELLYBEAN #define BOARD_ID BOARD_ID_JELLYBEAN @@ -50,8 +50,8 @@ extern "C" #define BOARD_ID BOARD_ID_HACKRF_ONE #endif -#ifdef RAD10 -#define BOARD_ID BOARD_ID_RAD10 +#ifdef RAD1O +#define BOARD_ID BOARD_ID_RAD1O #endif /* @@ -62,7 +62,7 @@ extern "C" #define SCU_PINMUX_LED1 (P4_1) /* GPIO2[1] on P4_1 */ #define SCU_PINMUX_LED2 (P4_2) /* GPIO2[2] on P4_2 */ #define SCU_PINMUX_LED3 (P6_12) /* GPIO2[8] on P6_12 */ -#ifdef RAD10 +#ifdef RAD1O #define SCU_PINMUX_LED4 (PB_6) /* GPIO5[26] on PB_6 */ #endif @@ -89,7 +89,7 @@ extern "C" /* CPLD JTAG interface */ #define SCU_PINMUX_CPLD_TDO (P9_5) /* GPIO5[18] */ #define SCU_PINMUX_CPLD_TCK (P6_1) /* GPIO3[ 0] */ -#if (defined HACKRF_ONE || defined RAD10) +#if (defined HACKRF_ONE || defined RAD1O) #define SCU_PINMUX_CPLD_TMS (P6_5) /* GPIO3[ 4] */ #define SCU_PINMUX_CPLD_TDI (P6_2) /* GPIO3[ 1] */ #else @@ -109,7 +109,7 @@ extern "C" #ifdef JELLYBEAN #define SCU_PINMUX_SGPIO8 (P1_12) #endif -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) #define SCU_PINMUX_SGPIO8 (P9_6) #endif #define SCU_PINMUX_SGPIO9 (P4_3) @@ -132,7 +132,7 @@ extern "C" #define SCU_XCVR_B7 (P5_6) /* GPIO2[15] on P5_6 */ #endif -#ifdef RAD10 +#ifdef RAD1O #define SCU_XCVR_RXHP (P8_1) /* GPIO[] on P8_1 */ #define SCU_XCVR_B6 (P8_2) /* GPIO[] on P8_2 */ #define SCU_XCVR_B7 (P9_3) /* GPIO[] on P8_3 */ @@ -159,7 +159,7 @@ extern "C" #define SCU_MIXER_SDATA (P6_4) /* GPIO3[3] on P6_4 */ #define SCU_MIXER_RESETX (P5_5) /* GPIO2[14] on P5_5 */ #endif -#ifdef RAD10 +#ifdef RAD1O #define SCU_VCO_CE (P5_4) /* GPIO2[13] on P5_4 */ #define SCU_VCO_SCLK (P2_6) /* GPIO5[6] on P2_6 */ #define SCU_VCO_SDATA (P6_4) /* GPIO3[3] on P6_4 */ @@ -178,7 +178,7 @@ extern "C" #define SCU_NO_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ #endif -#ifdef RAD10 +#ifdef RAD1O #define SCU_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ #endif @@ -208,7 +208,7 @@ extern "C" #define SCU_NO_RX_AMP_PWR (P2_12) /* GPIO1[12] on P2_12 */ #endif -#ifdef RAD10 +#ifdef RAD1O #define SCU_BY_AMP (P1_7) /* GPIO1[0] on P1_7 */ #define SCU_BY_AMP_N (P2_5) /* GPIO5[5] on P2_5 */ #define SCU_TX_RX (P2_10) /* GPIO0[14] on P2_10 */ @@ -257,7 +257,7 @@ extern "C" #define PIN_LED3 (BIT8) /* GPIO2[8] on P6_12 */ #define PORT_LED1_3 (GPIO2) /* PORT for LED1, 2 & 3 */ -#ifdef RAD10 +#ifdef RAD1O #define PIN_LED4 (BIT26) /* GPIO5[26] on PB_6 */ #define PORT_LED4 (GPIO5) /* PORT for LED4 */ #endif @@ -284,7 +284,7 @@ extern "C" #define PORT_XCVR_B (GPIO2) #endif -#ifdef RAD10 +#ifdef RAD1O #define PIN_XCVR_RXHP (BIT1) /* GPIO4[1] on P8_1 */ #define PORT_XCVR_RXHP (GPIO4) #define PIN_XCVR_B6 (BIT2) /* GPIO4[2] on P8_2 */ @@ -315,7 +315,7 @@ extern "C" #define PIN_MIXER_RESETX (BIT14) /* GPIO2[14] on P5_5 */ #define PORT_MIXER_RESETX (GPIO2) #endif -#ifdef RAD10 +#ifdef RAD1O #define PIN_VCO_CE (BIT13) /* GPIO2[13] on P5_4 */ #define PORT_VCO_CE (GPIO2) #define PIN_VCO_SCLK (BIT6) /* GPIO5[6] on P2_6 */ @@ -340,7 +340,7 @@ extern "C" #define PORT_NO_VAA_ENABLE (GPIO2) /* PORT for NO_VAA_ENABLE */ #endif -#ifdef RAD10 +#ifdef RAD1O #define PIN_VAA_ENABLE (BIT9) /* GPIO2[9] on P5_0 */ #define PORT_VAA_ENABLE (GPIO2) /* PORT for VAA_ENABLE */ #endif @@ -381,7 +381,7 @@ extern "C" #define PORT_NO_RX_AMP_PWR (GPIO1) #endif -#ifdef RAD10 +#ifdef RAD1O #define PIN_BY_AMP (GPIOPIN0) /* GPIO1[0] on P1_7 */ #define PORT_BY_AMP (GPIO1) #define PIN_BY_AMP_N (GPIOPIN5) /* GPIO5[5] on P2_5 */ @@ -415,7 +415,7 @@ extern "C" #define PORT_CPLD_TDO (GPIO5) #define PIN_CPLD_TCK (GPIOPIN0) #define PORT_CPLD_TCK (GPIO3) -#if (defined HACKRF_ONE || defined RAD10) +#if (defined HACKRF_ONE || defined RAD1O) #define PIN_CPLD_TMS (GPIOPIN4) #define PORT_CPLD_TMS (GPIO3) #define PIN_CPLD_TDI (GPIOPIN1) @@ -462,7 +462,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); -#if (defined HACKRF_ONE || defined RAD10) +#if (defined HACKRF_ONE || defined RAD1O) 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 906e613b..10828f28 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -32,7 +32,7 @@ #include #include -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) /* * RF switches on Jawbreaker are controlled by General Purpose Outputs (GPO) on * the RFFC5072. @@ -42,7 +42,7 @@ * on HackRF One as the amplifier power is instead controlled only by * SWITCHCTRL_AMP_BYPASS. * - * The rad10 also uses GPIO pins to control the different switches. The amplifiers + * The rad1o also uses GPIO pins to control the different switches. The amplifiers * are also connected to the LPC. */ #define SWITCHCTRL_NO_TX_AMP_PWR (1 << 0) /* GPO1 turn off TX amp power */ @@ -86,8 +86,8 @@ uint8_t switchctrl = SWITCHCTRL_SAFE; */ #define SWITCHCTRL_ANT_PWR (1 << 6) /* turn on antenna port power */ -#ifdef RAD10 -static void switchctrl_set_rad10(uint8_t ctrl) { +#ifdef RAD1O +static void switchctrl_set_rad1o(uint8_t ctrl) { if (ctrl & SWITCHCTRL_TX) { gpio_set(PORT_TX_RX_N, PIN_TX_RX_N); gpio_clear(PORT_TX_RX, PIN_TX_RX); @@ -244,8 +244,8 @@ static void switchctrl_set(const uint8_t gpo) { mixer_set_gpo(gpo); #elif HACKRF_ONE switchctrl_set_hackrf_one(gpo); -#elif RAD10 - switchctrl_set_rad10(gpo); +#elif RAD1O + switchctrl_set_rad1o(gpo); #else (void)gpo; #endif @@ -291,7 +291,7 @@ void rf_path_pin_setup() { disable_rf_power(); #endif -#ifdef RAD10 +#ifdef RAD1O /* 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); diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index 7d3d27e5..e01b3659 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -239,7 +239,7 @@ void si5351c_configure_clock_control() } #endif -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD10) +#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) void si5351c_configure_clock_control(const enum pll_sources source) { uint8_t pll; diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index d2581ac1..03c53f3f 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -59,7 +59,7 @@ else() set(MCU_PARTNO LPC4330) endif() -if(BOARD STREQUAL "RAD10") +if(BOARD STREQUAL "RAD1O") set(MIXER max2871) else() set(MIXER rffc5071) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index ca20293e..6e3b1a69 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -116,7 +116,7 @@ static const usb_request_handler_fn vendor_request_handler[] = { usb_vendor_request_read_si5351c, usb_vendor_request_set_sample_rate_frac, usb_vendor_request_set_baseband_filter_bandwidth, -#ifdef RAD10 +#ifdef RAD1O NULL, NULL, #else @@ -219,7 +219,7 @@ void usb_set_descriptor_by_serial_number(void) int main(void) { pin_setup(); enable_1v8_power(); -#if (defined HACKRF_ONE || defined RAD10) +#if (defined HACKRF_ONE || defined RAD1O) enable_rf_power(); #endif cpu_clock_init(); diff --git a/firmware/hackrf_usb/usb_api_register.c b/firmware/hackrf_usb/usb_api_register.c index ac8f7e70..df95090b 100644 --- a/firmware/hackrf_usb/usb_api_register.c +++ b/firmware/hackrf_usb/usb_api_register.c @@ -26,7 +26,7 @@ #include #include -#ifndef RAD10 +#ifndef RAD1O #include #endif @@ -108,7 +108,7 @@ usb_request_status_t usb_vendor_request_read_si5351c( } } -#ifndef RAD10 +#ifndef RAD1O usb_request_status_t usb_vendor_request_write_rffc5071( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage From e7dedb761eac9626d581081bc82f1d1dc7d48a14 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 8 Jun 2015 00:54:56 +0200 Subject: [PATCH 09/58] feat(max2871): First mixer_set_frequency implementation --- firmware/common/max2871.c | 127 +++----------------------------------- 1 file changed, 10 insertions(+), 117 deletions(-) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index cba655c7..e33692f8 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -21,122 +21,6 @@ static void max2871_spi_write(uint8_t r, uint32_t v); static void max2871_write_registers(void); static void delay_ms(int ms); -/* - * - The input is fixed to 50 MHz - * f_REF = 50 MHz - * - * - The VCO must operate between 3 GHz and 6 GHz - * f_VCO range: 3 GHz - 6 GHz - * - * Phase Detector Clock: - * - We configure the phase detector to not change the - * input signal - * f_PFD = f_REF x [(1 + DBR)/(R x (1 + RDIV2))] - * R = 1 - * DBR = 0 - * RDIV2 = 0 - * - * => f_PFD = 50 MHz - * - * - * f_RFOUT < 3 GHz: - * - To go to < 3 GHz, f_VCO has to be divided. - * f_RFOUT = f_VCO / DIVA - * - * - We just divide by 2 for now - * DIVA = 2 - * => f_RFOUT = f_VCO / 2 - * - * - Relationship between f_PFD (fixed) and f_VCO (variable) - * N + (F/M) = f_VCO/ f_PFD - * - * - Insert relationship between f_RFOUT and f_VCO: - * N + (F/M) = (f_RFOUT * 2) / f_PFD - * f_RFOUT = (N + F/M) * f_PFD / 2 - * - * - Limits for N, M and F from the datasheet: - * 19 <= N <= 4091 - * 2 <= M <= 4095 - * F < M - * - * - Plug in constants: - * f_RFOUT = (N + F/M) / 2 * 50 MHz - * - * - Given the range of N, we can go to: - * f_RFOUT range: 475 MHz - 3 GHz - * - * - N steps in 25 MHz increments: - * N = floor(f_RFOUT / 50 MHz * 2) - * => N = (f_RFOUT * 2) / 50 MHz (uses integer math) - * - * - Calculate the error: - * f_int_ERROR = f_RFOUT - (N * 50 MHz) / 2 - * f_int_ERROR range: 0 MHz - 24 MHz - * - * - Use the fraction to get to the correct frequency: - * (F/M) / 2 * 50 MHz = f_int_ERROR - * - * - Fix M: - * M = 25 - * - * - Calculate F: - * (F/25) / 2 * 50 MHz = f_int_ERROR - * F = f_int_ERROR / 1 MHz - * - * - Calculate the new error: - * - * f_ERROR = f_RFOUT - (N + F/M) / 2 * 50 MHz - * f_ERROR range: 0 MHz - 1 MHz - * - * - * f_RFOUT > 3 GHz: - * - Do not divide the VCO output - * DIVA = 1 - * => f_RFOUT = f_VCO - * - * - Relationship between f_PFD (fixed) and f_VCO (variable) - * N + (F/M) = f_VCO/ f_PFD - * - * - Insert relationship between f_RFOUT and f_VCO: - * N + (F/M) = f_RFOUT / f_PFD - * f_RFOUT = (N + F/M) * f_PFD - * - * - Limits for N, M and F from the datasheet: - * 19 <= N <= 4091 - * 2 <= M <= 4095 - * F < M - * - * - Plug in constants: - * f_RFOUT = (N + F/M) * 50 MHz - * - * - Given the range of N and the VCO limits, we can go to: - * f_RFOUT range: 3000 MHz - 6000 MHz - * - * - N steps in 50 MHz increments: - * N = floor(f_RFOUT / 50 MHz) - * => N = f_RFOUT / 50 MHz (uses integer math) - * - * - Calculate the error: - * f_int_ERROR = f_RFOUT - N * 50 MHz - * f_int_ERROR range: 0 MHz - 49 MHz - * - * - Use the fraction to get to the correct frequency: - * (F/M) * 50 MHz = f_int_ERROR - * - * - Fix M: - * M = 50 - * - * - Calculate F: - * (F/50) * 50 MHz = f_int_ERROR - * F = f_int_ERROR / 1 MHz - * - * - Calculate the new error: - * - * f_ERROR = f_RFOUT - (N + F/M) * 50 MHz - * f_ERROR range: 0 MHz - 1 MHz - * - */ - void mixer_setup(void) { /* Configure GPIO pins. */ @@ -291,7 +175,16 @@ static void max2871_write_registers(void) /* Set frequency (MHz). */ uint64_t mixer_set_frequency(uint16_t mhz) { - (void) mhz; + int n = mhz; + int diva = 0; + + while(n < 3000) { + n *= 2; + diva += 1; + } + + max2871_set_N(n); + max2871_set_DIVA(diva); return mhz; } From 3a7a2234acebf9604dadb8ed1261af9f19a93878 Mon Sep 17 00:00:00 2001 From: schneider42 Date: Mon, 8 Jun 2015 16:20:17 +0200 Subject: [PATCH 10/58] fix(max2871): Write registers after changing the frequency --- firmware/common/max2871.c | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index e33692f8..0f2e0e1c 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -185,6 +185,7 @@ uint64_t mixer_set_frequency(uint16_t mhz) max2871_set_N(n); max2871_set_DIVA(diva); + max2871_write_registers(); return mhz; } From 745456dc282fd32a0f738e79f2a080b4d8d41134 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 9 Jun 2015 07:07:53 +0200 Subject: [PATCH 11/58] fix(max2871): Wait for VAS to finish before turning on RFA --- firmware/common/hackrf_core.h | 3 +++ firmware/common/max2871.c | 43 ++++++++++++++++++++++++++++++++-- firmware/common/max2871_regs.h | 2 ++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index d358da61..848d2dda 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -164,6 +164,7 @@ extern "C" #define SCU_VCO_SCLK (P2_6) /* GPIO5[6] on P2_6 */ #define SCU_VCO_SDATA (P6_4) /* GPIO3[3] on P6_4 */ #define SCU_VCO_LE (P5_5) /* GPIO2[14] on P5_5 */ +#define SCU_VCO_MUX (PB_5) /* GPIO5[25] on PB_5 */ #define SCU_MIXER_EN (P6_8) /* GPIO5[16] on P6_8 */ #define SCU_SYNT_RFOUT_EN (P6_9) /* GPIO3[5] on P6_9 */ #endif @@ -324,6 +325,8 @@ extern "C" #define PORT_VCO_SDATA (GPIO3) #define PIN_VCO_LE (BIT14) /* GPIO2[14] on P5_5 */ #define PORT_VCO_LE (GPIO2) +#define PIN_VCO_MUX (BIT25) /* GPIO5[25] on PB_5 */ +#define PORT_VCO_MUX (GPIO5) #define PIN_MIXER_EN (BIT16) /* GPIO5[16] on P6_8 */ #define PORT_MIXER_EN (GPIO5) #define PIN_SYNT_RFOUT_EN (BIT5) /* GPIO3[5] on P6_9 */ diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index e33692f8..31431ee6 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -29,6 +29,7 @@ void mixer_setup(void) //Only used for the debug pin config: scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_SDATA, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_LE, SCU_GPIO_FAST); + scu_pinmux(SCU_VCO_MUX, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); scu_pinmux(SCU_SYNT_RFOUT_EN, SCU_GPIO_FAST); /* Set GPIO pins as outputs. */ @@ -38,6 +39,9 @@ void mixer_setup(void) GPIO_DIR(PORT_VCO_LE) |= PIN_VCO_LE; GPIO_DIR(PORT_SYNT_RFOUT_EN) |= PIN_SYNT_RFOUT_EN; + /* MUX is an input */ + GPIO_DIR(PORT_VCO_MUX) &= ~(PIN_VCO_MUX); + /* set to known state */ gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); @@ -61,7 +65,7 @@ void mixer_setup(void) max2871_set_M(0); max2871_set_LDS(0); max2871_set_SDN(0); - max2871_set_MUX(3); + max2871_set_MUX(0x0C); // Register 6 readback max2871_set_DBR(0); max2871_set_RDIV2(0); max2871_set_R(50); // 1 MHz f_PFD @@ -91,7 +95,7 @@ void mixer_setup(void) max2871_set_BDIV(0); max2871_set_RFB_EN(0); max2871_set_BPWR(0); - max2871_set_RFA_EN(1); + max2871_set_RFA_EN(0); max2871_set_APWR(3); max2871_set_SDPLL(0); max2871_set_F01(1); @@ -164,6 +168,32 @@ static void max2871_spi_write(uint8_t r, uint32_t v) { #endif } +static uint32_t max2871_spi_read(void) +{ + uint32_t bits = 32; + uint32_t data = 0; + + max2871_spi_write(0x06, 0x0); + + serial_delay(); + gpio_set(PORT_VCO_SCLK, PIN_VCO_SCLK); + serial_delay(); + gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + serial_delay(); + + while (bits--) { + gpio_set(PORT_VCO_SCLK, PIN_VCO_SCLK); + serial_delay(); + + gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + serial_delay(); + + data <<= 1; + data |= GPIO_STATE(PORT_VCO_MUX, PIN_VCO_MUX) ? 1 : 0; + } + return data; +} + static void max2871_write_registers(void) { int i; @@ -182,9 +212,18 @@ uint64_t mixer_set_frequency(uint16_t mhz) n *= 2; diva += 1; } + max2871_set_RFA_EN(0); + max2871_write_registers(); max2871_set_N(n); max2871_set_DIVA(diva); + max2871_write_registers(); + + while(max2871_spi_read() & MAX2871_VASA); + + max2871_set_RFA_EN(1); + max2871_write_registers(); + return mhz; } diff --git a/firmware/common/max2871_regs.h b/firmware/common/max2871_regs.h index 223f8b7f..8bbb7e75 100644 --- a/firmware/common/max2871_regs.h +++ b/firmware/common/max2871_regs.h @@ -2,6 +2,8 @@ #define MAX2871_H #include +#define MAX2871_VASA (1 << 9) + void max2871_regs_init(void); uint32_t max2871_get_register(int reg); From 418423bb7c60a639c277c225728eb833b297aee0 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 9 Jun 2015 13:49:20 +0200 Subject: [PATCH 12/58] fix(max2871): Increase CP current, use temp compensation and dbl buffering --- firmware/common/max2871.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 31431ee6..bc590d48 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -69,8 +69,8 @@ void mixer_setup(void) max2871_set_DBR(0); max2871_set_RDIV2(0); max2871_set_R(50); // 1 MHz f_PFD - max2871_set_REG4DB(0); - max2871_set_CP(3); // ?: CP current up 0-3 + max2871_set_REG4DB(1); + max2871_set_CP(15); // ?: CP charge pump current 0-15 max2871_set_LDF(1); // INT-N max2871_set_LDP(0); // ?: Lock-Detect Precision max2871_set_PDP(1); @@ -79,7 +79,7 @@ void mixer_setup(void) max2871_set_RST(0); max2871_set_VCO(0); max2871_set_VAS_SHDN(0); - max2871_set_VAS_TEMP(0); + max2871_set_VAS_TEMP(1); max2871_set_CSM(0); max2871_set_MUTEDEL(1); max2871_set_CDM(0); @@ -104,6 +104,8 @@ void mixer_setup(void) max2871_set_ADCM(0); max2871_write_registers(); + + mixer_set_frequency(3500); } static void delay_ms(int ms) From fb219b6f8651998aa41a13defd9f0f1b58cdf2dd Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 9 Jun 2015 14:08:57 +0200 Subject: [PATCH 13/58] fix(usb_descriptor): Let the rad1o be a hack-rf on the usb for now --- firmware/hackrf_usb/usb_descriptor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/hackrf_usb/usb_descriptor.c b/firmware/hackrf_usb/usb_descriptor.c index ff770b24..b049da60 100644 --- a/firmware/hackrf_usb/usb_descriptor.c +++ b/firmware/hackrf_usb/usb_descriptor.c @@ -26,7 +26,7 @@ #define USB_VENDOR_ID (0x1D50) -#ifdef HACKRF_ONE +#if (defined HACKRF_ONE || defined RAD1O) #define USB_PRODUCT_ID (0x6089) #elif JAWBREAKER #define USB_PRODUCT_ID (0x604B) From d7ecde3dc19715bc231f35901ef48630d47baa9a Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sat, 13 Jun 2015 21:35:20 +0200 Subject: [PATCH 14/58] hack(hackrf_usb): Disable reading the serial number via IAP --- firmware/hackrf_usb/hackrf_usb.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 6e3b1a69..747c5612 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -193,6 +193,7 @@ void usb_configuration_changed( void usb_set_descriptor_by_serial_number(void) { +#ifndef RAD1O iap_cmd_res_t iap_cmd_res; /* Read IAP Serial Number Identification */ @@ -211,6 +212,9 @@ void usb_set_descriptor_by_serial_number(void) usb_descriptor_string_serial_number[3 + i * 2] = 0x00; } } else { +#else + { +#endif usb_descriptor_string_serial_number[0] = 2; usb_descriptor_string_serial_number[1] = USB_DESCRIPTOR_TYPE_STRING; } @@ -243,6 +247,7 @@ int main(void) { usb_run(&usb_device); + ssp1_init(); rf_path_init(); From a5986edb6614a7ddb49a422330facd21b2426155 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sun, 14 Jun 2015 21:12:24 +0200 Subject: [PATCH 15/58] fix(max2871): Return the set frequency in Hz --- firmware/common/max2871.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index bc590d48..cf8a27fd 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -226,7 +226,7 @@ uint64_t mixer_set_frequency(uint16_t mhz) max2871_set_RFA_EN(1); max2871_write_registers(); - return mhz; + return mhz * 1000000; } void mixer_tx(void) From 6fb5885b70a6bc306c63917b318deb2d6112db27 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Fri, 10 Jul 2015 22:49:51 +0200 Subject: [PATCH 16/58] Export usb_phy_enable() --- firmware/common/usb.c | 2 +- firmware/common/usb.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/common/usb.c b/firmware/common/usb.c index 3444e1c2..fb7b2547 100644 --- a/firmware/common/usb.c +++ b/firmware/common/usb.c @@ -72,7 +72,7 @@ void usb_peripheral_reset() { while( (RESET_ACTIVE_STATUS0 & RESET_CTRL0_USB0_RST) == 0 ); } -static void usb_phy_enable() { +void usb_phy_enable() { CREG_CREG0 &= ~CREG_CREG0_USB0PHY; } diff --git a/firmware/common/usb.h b/firmware/common/usb.h index a6fa6a92..aa21beb2 100644 --- a/firmware/common/usb.h +++ b/firmware/common/usb.h @@ -29,6 +29,7 @@ #include "usb_type.h" void usb_peripheral_reset(); +void usb_phy_enable(); void usb_device_init( const uint_fast8_t device_ordinal, From 510dde748510dd83ed1402397e11e2cfd9117b91 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 21 Jul 2015 16:42:24 +0100 Subject: [PATCH 17/58] Update rad1o firmware and libhackrf to use rad1o PID --- firmware/hackrf_usb/usb_descriptor.c | 4 +++- host/libhackrf/53-hackrf.rules | 1 + host/libhackrf/src/hackrf.c | 14 ++++++++++++-- host/libhackrf/src/hackrf.h | 1 + host/misc/udev/53-hackrf.rules.in | 2 ++ host/python/max2837_dump.py | 4 ++++ host/python/set_transceiver_mode.py | 8 ++++++-- 7 files changed, 29 insertions(+), 5 deletions(-) diff --git a/firmware/hackrf_usb/usb_descriptor.c b/firmware/hackrf_usb/usb_descriptor.c index b049da60..aaf5b019 100644 --- a/firmware/hackrf_usb/usb_descriptor.c +++ b/firmware/hackrf_usb/usb_descriptor.c @@ -26,10 +26,12 @@ #define USB_VENDOR_ID (0x1D50) -#if (defined HACKRF_ONE || defined RAD1O) +#ifdef HACKRF_ONE #define USB_PRODUCT_ID (0x6089) #elif JAWBREAKER #define USB_PRODUCT_ID (0x604B) +#elif RAD1O +#define USB_PRODUCT_ID (0x6089) /* TBD: (0xCC15) */ #else #define USB_PRODUCT_ID (0xFFFF) #endif diff --git a/host/libhackrf/53-hackrf.rules b/host/libhackrf/53-hackrf.rules index 0338ea8c..a982f4a4 100644 --- a/host/libhackrf/53-hackrf.rules +++ b/host/libhackrf/53-hackrf.rules @@ -1,3 +1,4 @@ ATTR{idVendor}=="1d50", ATTR{idProduct}=="604b", SYMLINK+="hackrf-jawbreaker-%k", MODE="660", GROUP="plugdev" ATTR{idVendor}=="1d50", ATTR{idProduct}=="6089", SYMLINK+="hackrf-one-%k", MODE="660", GROUP="plugdev" +ATTR{idVendor}=="1d50", ATTR{idProduct}=="cc15", SYMLINK+="rad1o-%k", MODE="660", GROUP="plugdev" ATTR{idVendor}=="1fc9", ATTR{idProduct}=="000c", SYMLINK+="nxp-dfu-%k", MODE="660", GROUP="plugdev" diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 2902a800..05b28c09 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -117,6 +117,7 @@ volatile bool do_exit = false; static const uint16_t hackrf_usb_vid = 0x1d50; static const uint16_t hackrf_jawbreaker_usb_pid = 0x604b; static const uint16_t hackrf_one_usb_pid = 0x6089; +static const uint16_t rad1o_usb_pid = 0xcc15; static libusb_context* g_libusb_context = NULL; @@ -291,7 +292,9 @@ hackrf_device_list_t* ADDCALL hackrf_device_list() libusb_get_device_descriptor(list->usb_devices[i], &device_descriptor); if( device_descriptor.idVendor == hackrf_usb_vid ) { - if( (device_descriptor.idProduct == hackrf_one_usb_pid) || (device_descriptor.idProduct == hackrf_jawbreaker_usb_pid) ) { + if((device_descriptor.idProduct == hackrf_one_usb_pid) || + (device_descriptor.idProduct == hackrf_jawbreaker_usb_pid) || + (device_descriptor.idProduct == rad1o_usb_pid)) { int idx = list->devicecount++; list->usb_board_ids[idx] = device_descriptor.idProduct; list->usb_device_index[idx] = i; @@ -360,7 +363,9 @@ libusb_device_handle* hackrf_open_usb(const char* const desired_serial_number) libusb_get_device_descriptor(devices[i], &device_descriptor); if( device_descriptor.idVendor == hackrf_usb_vid ) { - if( (device_descriptor.idProduct == hackrf_one_usb_pid) || (device_descriptor.idProduct == hackrf_jawbreaker_usb_pid) ) { + if((device_descriptor.idProduct == hackrf_one_usb_pid) || + (device_descriptor.idProduct == hackrf_jawbreaker_usb_pid) || + (device_descriptor.idProduct == rad1o_usb_pid)) { printf("USB device %4x:%4x:", device_descriptor.idVendor, device_descriptor.idProduct); if( desired_serial_number != NULL ) { @@ -477,6 +482,11 @@ int ADDCALL hackrf_open(hackrf_device** device) usb_device = libusb_open_device_with_vid_pid(g_libusb_context, hackrf_usb_vid, hackrf_jawbreaker_usb_pid); } + if( usb_device == NULL ) + { + usb_device = libusb_open_device_with_vid_pid(g_libusb_context, hackrf_usb_vid, rad1o_usb_pid); + } + if( usb_device == NULL ) { return HACKRF_ERROR_NOT_FOUND; diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 6f043444..c07435b5 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -72,6 +72,7 @@ enum hackrf_board_id { enum hackrf_usb_board_id { USB_BOARD_ID_JAWBREAKER = 0x604B, USB_BOARD_ID_HACKRF_ONE = 0x6089, + USB_BOARD_ID_RAD1O = 0xCC15, USB_BOARD_ID_INVALID = 0xFFFF, }; diff --git a/host/misc/udev/53-hackrf.rules.in b/host/misc/udev/53-hackrf.rules.in index 951c424d..05144a7f 100644 --- a/host/misc/udev/53-hackrf.rules.in +++ b/host/misc/udev/53-hackrf.rules.in @@ -2,5 +2,7 @@ ATTR{idVendor}=="1d50", ATTR{idProduct}=="604b", SYMLINK+="hackrf-jawbreaker-%k", MODE="660", GROUP="@HACKRF_GROUP@" # HackRF One ATTR{idVendor}=="1d50", ATTR{idProduct}=="6089", SYMLINK+="hackrf-one-%k", MODE="660", GROUP="@HACKRF_GROUP@" +# HackRF One +ATTR{idVendor}=="1d50", ATTR{idProduct}=="CC15", SYMLINK+="rad1o-%k", MODE="660", GROUP="@HACKRF_GROUP@" # HackRF DFU ATTR{idVendor}=="1fc9", ATTR{idProduct}=="000c", SYMLINK+="nxp-dfu-%k", MODE="660", GROUP="@HACKRF_GROUP@" diff --git a/host/python/max2837_dump.py b/host/python/max2837_dump.py index c1732b2e..d0e80f48 100755 --- a/host/python/max2837_dump.py +++ b/host/python/max2837_dump.py @@ -32,6 +32,10 @@ else: if device: print 'Find: HackRF One' else: + device = usb.core.find(idVendor=0x1d50, idProduct=0xCC15) + if device: + print 'Find: Rad1o' + else: print 'Not find any HackRF device.' sys.exit() device.set_configuration() diff --git a/host/python/set_transceiver_mode.py b/host/python/set_transceiver_mode.py index c1307532..fe013709 100755 --- a/host/python/set_transceiver_mode.py +++ b/host/python/set_transceiver_mode.py @@ -31,8 +31,12 @@ else: if device: print 'Find: HackRF One' else: - print 'Not find any HackRF device.' - sys.exit() + device = usb.core.find(idVendor=0x1d50, idProduct=0xCC15) + if device: + print 'Find: Rad1o' + else: + print 'Not find any HackRF device.' + sys.exit() device.set_configuration() def set_rx(): From 1b58ccf006e0a2831927301c19df61de361ba17d Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 22 Jul 2015 22:56:17 +0200 Subject: [PATCH 18/58] Fix include paths --- firmware/common/xapp058/ports.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/common/xapp058/ports.c b/firmware/common/xapp058/ports.c index 029ee0ca..f33ac4b6 100644 --- a/firmware/common/xapp058/ports.c +++ b/firmware/common/xapp058/ports.c @@ -11,8 +11,8 @@ /*******************************************************/ #include "ports.h" -#include "hackrf_core.h" -#include "cpld_jtag.h" +#include "../hackrf_core.h" +#include "../cpld_jtag.h" #include void delay_jtag(uint32_t duration) From f8a2b60d6d81e8f47f12cbc2a64efa68e9536a6e Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 22 Jul 2015 23:32:45 +0200 Subject: [PATCH 19/58] Remove dependency on old dfu-suffix --- firmware/hackrf-common.cmake | 7 +--- firmware/tools/make-dfu.py | 70 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 6 deletions(-) create mode 100755 firmware/tools/make-dfu.py diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 03c53f3f..92a098e8 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -168,12 +168,7 @@ macro(DeclareTargets) add_custom_target( ${PROJECT_NAME}.dfu ALL DEPENDS ${PROJECT_NAME}.bin - COMMAND rm -f _tmp.dfu _header.bin - COMMAND cp ${PROJECT_NAME}.bin _tmp.dfu - COMMAND dfu-suffix --vid=0x1fc9 --pid=0x000c --did=0x0 -s 0 -a _tmp.dfu - COMMAND python -c \"import os.path\; import struct\; print\('0000000: da ff ' + ' '.join\(map\(lambda s: '%02x' % ord\(s\), struct.pack\(' _header.bin - COMMAND cat _header.bin _tmp.dfu >${PROJECT_NAME}.dfu - COMMAND rm -f _tmp.dfu _header.bin + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../tools/make-dfu.py ${PROJECT_NAME}.bin ${PROJECT_NAME}.dfu ) add_custom_target( diff --git a/firmware/tools/make-dfu.py b/firmware/tools/make-dfu.py new file mode 100755 index 00000000..81e1540e --- /dev/null +++ b/firmware/tools/make-dfu.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python2 +# vim: set ts=4 sw=4 tw=0 et pm=: +import struct +import sys +import os.path +import getopt +import zlib + +options, remainder = getopt.getopt(sys.argv[1:], 'p:v:d:S:v', ['pid=', + 'vid=', + 'did=', + 'spec=', + 'verbose', + ]) + +pid = 0x000c +vid = 0x1fc9 +did = 0 +spec = 0x0100 +verbose = False + +for opt, arg in options: + if opt in ('-p', '--pid'): + pid = int(arg) + if opt in ('-v', '--vid'): + vid = int(arg) + if opt in ('-d', '--did'): + did = int(arg) + if opt in ('-S', '--spec'): + spec = int(arg) + elif opt in ('-v', '--verbose'): + verbose = True + +if len(remainder)<1: + in_file = "/dev/stdin" +else: + in_file = remainder[0] + +if len(remainder)<2: + out = open("/dev/stdout","wb") +else: + out = open(remainder[1],"wb") + +# ref. NXP UM10503 Table 24 (Boot image header description) +header = "" +header += struct.pack (' Date: Thu, 23 Jul 2015 00:12:56 +0200 Subject: [PATCH 20/58] change BOARD Parameter in README --- firmware/README | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/firmware/README b/firmware/README index 3a846beb..7c5df078 100644 --- a/firmware/README +++ b/firmware/README @@ -27,12 +27,10 @@ To build and install a standard firmware image for HackRF One: $ cd hackrf_usb $ mkdir build $ cd build -$ cmake .. -DBOARD=HACKRF_ONE +$ cmake .. -DBOARD=RAD1O $ make $ hackrf_spiflash -w hackrf_usb.bin -If you have a Jawbreaker, use -DBOARD=JAWBREAKER instead. - For loading firmware into RAM with DFU you will also need: From 14e23f7f83fed366ddf0d25da92e43118cdbf87c Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Fri, 24 Jul 2015 00:45:28 +0200 Subject: [PATCH 21/58] New rad1o board has CLK4 and CLK5 swapped. --- firmware/common/hackrf_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 75245ea1..358e5597 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -314,10 +314,10 @@ void cpu_clock_init(void) si5351c_configure_multisynth(3, 80*128-512, 0, 1, 0); /* 800/80 = 10MHz */ /* MS4/CLK4 is the source for the RFFC5071 mixer. */ - si5351c_configure_multisynth(4, 16*128-512, 0, 1, 0); /* 800/16 = 50MHz */ + si5351c_configure_multisynth(5, 16*128-512, 0, 1, 0); /* 800/16 = 50MHz */ /* MS5/CLK5 is the source for the MAX2837 clock input. */ - si5351c_configure_multisynth(5, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ + si5351c_configure_multisynth(4, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ /* MS6/CLK6 is unused. */ /* MS7/CLK7 is the source for the LPC43xx microcontroller. */ From cbf2185edccf7b8b71fed0170e9346dd501407d8 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 27 Jul 2015 09:16:38 +0200 Subject: [PATCH 22/58] fix(rf-path): Remove misplaced RX/TX switching The LNA bypass sections were configuring the RX/TX path again. That was redundant and prevented RX without the LNA. --- firmware/common/rf_path.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 10828f28..4eaaf98f 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -118,9 +118,6 @@ static void switchctrl_set_rad1o(uint8_t ctrl) { 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_clear(PORT_RX_LNA, PIN_RX_LNA); @@ -128,9 +125,6 @@ static void switchctrl_set_rad1o(uint8_t ctrl) { 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_RX_LNA, PIN_RX_LNA); @@ -138,9 +132,6 @@ static void switchctrl_set_rad1o(uint8_t ctrl) { 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_RX_LNA, PIN_RX_LNA); From 5bd5085cf12a4c7a3c11e7542f66c71efa3fe9f4 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 27 Jul 2015 09:22:18 +0200 Subject: [PATCH 23/58] fix(hackrf-core): Disable unused clock source to the MCU It is not used and creates noise. --- firmware/common/hackrf_core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 358e5597..21d0500c 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -320,9 +320,15 @@ void cpu_clock_init(void) si5351c_configure_multisynth(4, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ /* MS6/CLK6 is unused. */ + /* MS7/CLK7 is the source for the LPC43xx microcontroller. */ + +#if 0 + /* Clock is deactivated as it is not used and creates noise */ uint8_t ms7data[] = { 90, 255, 20, 0 }; si5351c_write(ms7data, sizeof(ms7data)); +#endif + #endif /* Set to 10 MHz, the common rate between Jellybean and Jawbreaker. */ From 1f38354416ba15f0cf506a97b73fb12f25ad4b78 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 27 Jul 2015 09:25:18 +0200 Subject: [PATCH 24/58] fix(hackrf-core): Disable unused clock outputs They generate noise and are most likely not used --- firmware/common/hackrf_core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 21d0500c..f30fd470 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -594,7 +594,11 @@ void pin_setup(void) { scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_NOPULL); - + + /* Disable unused clock outputs. They generate noise. */ + scu_pinmux(CLK0, SCU_CLK_IN | SCU_CONF_FUNCTION7); + scu_pinmux(CLK2, SCU_CLK_IN | SCU_CONF_FUNCTION7); + /* Configure USB indicators */ #if (defined JELLYBEAN || defined JAWBREAKER) scu_pinmux(SCU_PINMUX_USB_LED0, SCU_CONF_FUNCTION3); From 9f142e3356daaa132ae622667f6c190cadae72b9 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 27 Jul 2015 09:28:56 +0200 Subject: [PATCH 25/58] fix(hackrf-core): Add LED4 for rad1o --- firmware/common/hackrf_core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index f30fd470..6f7b9592 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -592,7 +592,10 @@ void pin_setup(void) { scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_LED2, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_NOPULL); - +#ifdef RAD1O + scu_pinmux(SCU_PINMUX_LED4, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4); +#endif + scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_NOPULL); /* Disable unused clock outputs. They generate noise. */ @@ -618,6 +621,10 @@ void pin_setup(void) { /* Configure GPIO2[1/2/8] (P4_1/2 P6_12) as output. */ GPIO2_DIR |= (PIN_LED1 | PIN_LED2 | PIN_LED3); +#ifdef RAD1O + GPIO5_DIR |= PIN_LED4; +#endif + /* GPIO3[6] on P6_10 as output. */ GPIO3_DIR |= PIN_EN1V8; From dfa12fe1691747cd363711b475a2f5080517a301 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 27 Jul 2015 09:38:58 +0200 Subject: [PATCH 26/58] fix(hackrf-core): Give rad1o its own clock configuration section The old one was broken for the HackRF by 14e23f7f83fed366ddf0d25da92e43118cdbf87c --- firmware/common/hackrf_core.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 6f7b9592..422d4606 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -297,7 +297,7 @@ void cpu_clock_init(void) si5351c_configure_multisynth(5, 1536, 0, 1, 0); /* 50MHz */ #endif -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) +#if (defined JAWBREAKER || defined HACKRF_ONE) /* * Jawbreaker clocks: * CLK0 -> MAX5864/CPLD @@ -314,21 +314,48 @@ void cpu_clock_init(void) si5351c_configure_multisynth(3, 80*128-512, 0, 1, 0); /* 800/80 = 10MHz */ /* MS4/CLK4 is the source for the RFFC5071 mixer. */ - si5351c_configure_multisynth(5, 16*128-512, 0, 1, 0); /* 800/16 = 50MHz */ + si5351c_configure_multisynth(4, 16*128-512, 0, 1, 0); /* 800/16 = 50MHz */ /* MS5/CLK5 is the source for the MAX2837 clock input. */ - si5351c_configure_multisynth(4, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ + si5351c_configure_multisynth(5, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ /* MS6/CLK6 is unused. */ /* MS7/CLK7 is the source for the LPC43xx microcontroller. */ + uint8_t ms7data[] = { 90, 255, 20, 0 }; + si5351c_write(ms7data, sizeof(ms7data)); +#endif +#ifdef RAD1O + /* + * rad1o clocks: + * CLK0 -> MAX5864/CPLD + * CLK1 -> CPLD + * CLK2 -> SGPIO + * CLK3 -> External Clock Output + * CLK4 -> MAX2837 + * CLK5 -> MAX2871 + * CLK6 -> none + * CLK7 -> LPC4330 (but LPC4330 starts up on its own crystal) + */ + + /* MS3/CLK3 is the source for the external clock output. */ + si5351c_configure_multisynth(3, 80*128-512, 0, 1, 0); /* 800/80 = 10MHz */ + + /* MS4/CLK4 is the source for the MAX2837 clock input. */ + si5351c_configure_multisynth(4, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ + + /* MS5/CLK5 is the source for the RFFC5071 mixer. */ + si5351c_configure_multisynth(5, 16*128-512, 0, 1, 0); /* 800/16 = 50MHz */ + + /* MS6/CLK6 is unused. */ + + /* MS7/CLK7 is the source for the LPC43xx microcontroller. */ #if 0 /* Clock is deactivated as it is not used and creates noise */ uint8_t ms7data[] = { 90, 255, 20, 0 }; si5351c_write(ms7data, sizeof(ms7data)); #endif - #endif /* Set to 10 MHz, the common rate between Jellybean and Jawbreaker. */ From 60b3ef31120a965c81aa52983f34e6aa5f80a56e Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 27 Jul 2015 11:30:52 +0200 Subject: [PATCH 27/58] fix(sgpio): Fix rad1o HW bug which inverts RX Q As it is only inverted in the RX path (in respect to the HackRF) we need to distinguish between RX/TX and inverted and not inverted. --- firmware/common/sgpio.c | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/firmware/common/sgpio.c b/firmware/common/sgpio.c index 4c87bb44..d70f5bd6 100644 --- a/firmware/common/sgpio.c +++ b/firmware/common/sgpio.c @@ -30,6 +30,10 @@ static bool sgpio_slice_mode_multislice = true; +#ifdef RAD1O +static void update_q_invert(void); +#endif + void sgpio_configure_pin_functions() { scu_pinmux(SCU_PINMUX_SGPIO0, SCU_GPIO_FAST | SCU_CONF_FUNCTION3); scu_pinmux(SCU_PINMUX_SGPIO1, SCU_GPIO_FAST | SCU_CONF_FUNCTION3); @@ -131,6 +135,12 @@ void sgpio_configure( | (1L << 10) // disable codec data stream during configuration (Output SGPIO10 High) ; +#ifdef RAD1O + // The data direction might have changed. Check if we need to + // adjust the q inversion. + update_q_invert(); +#endif + // Enable SGPIO pin outputs. const uint_fast16_t sgpio_gpio_data_direction = (direction == SGPIO_DIRECTION_TX) @@ -303,10 +313,57 @@ bool sgpio_cpld_stream_rx_set_decimation(const uint_fast8_t n) { return (skip_n < 8); } +#ifdef RAD1O +/* The rad1o hardware has a bug which makes it + * necessary to also switch between the two options based + * on TX or RX mode. + * + * We use the state of the pin to determine which way we + * have to go. + * + * As TX/RX can change without sgpio_cpld_stream_rx_set_q_invert + * being called, we store a local copy of its parameter. + */ +static bool sgpio_invert = false; + +/* + * Called when TX/RX changes od sgpio_cpld_stream_rx_set_q_invert + * gets called. + */ +static void update_q_invert(void) { + /* 1=Output SGPIO11 High(TX mode), 0=Output SGPIO11 Low(RX mode)*/ + bool tx_mode = (SGPIO_GPIO_OUTREG & (1 << 11)) > 0; + + // 0.13: P1_18 + if( !sgpio_invert & !tx_mode) { + GPIO_SET(GPIO0) = GPIOPIN13; + } else if( !sgpio_invert & tx_mode) { + GPIO_CLR(GPIO0) = GPIOPIN13; + } else if( sgpio_invert & !tx_mode) { + GPIO_CLR(GPIO0) = GPIOPIN13; + } else if( sgpio_invert & tx_mode) { + GPIO_SET(GPIO0) = GPIOPIN13; + } +} + void sgpio_cpld_stream_rx_set_q_invert(const uint_fast8_t invert) { + if( invert ) { + sgpio_invert = true; + } else { + sgpio_invert = false; + } + + update_q_invert(); +} + +#else + +void sgpio_cpld_stream_rx_set_q_invert(const uint_fast8_t invert) { + // 0.13: P1_18 if( invert ) { GPIO_SET(GPIO0) = GPIOPIN13; } else { GPIO_CLR(GPIO0) = GPIOPIN13; } } +#endif From 62799d4158a29c0d3254d1df5aae462ac8238644 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Tue, 28 Jul 2015 02:48:47 +0200 Subject: [PATCH 28/58] HACK: wait until si5351 is powered up --- firmware/hackrf_usb/hackrf_usb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 747c5612..e2fbde9c 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -225,6 +225,7 @@ int main(void) { enable_1v8_power(); #if (defined HACKRF_ONE || defined RAD1O) enable_rf_power(); + delay(1000000); #endif cpu_clock_init(); From abab6b154af66b3ce4ad112703cd098d709b588a Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Thu, 30 Jul 2015 00:06:55 +0200 Subject: [PATCH 29/58] Deal with the bigger flash we have on rad1o --- firmware/common/w25q80bv.c | 21 +++++++++------------ firmware/common/w25q80bv.h | 1 + 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/firmware/common/w25q80bv.c b/firmware/common/w25q80bv.c index 2b391d9d..38e55078 100644 --- a/firmware/common/w25q80bv.c +++ b/firmware/common/w25q80bv.c @@ -85,11 +85,10 @@ void w25q80bv_setup(void) SSP_MASTER, SSP_SLAVE_OUT_ENABLE); - device_id = 0; - while(device_id != W25Q80BV_DEVICE_ID_RES) - { + do { device_id = w25q80bv_get_device_id(); - } + } while(device_id != W25Q80BV_DEVICE_ID_RES && + device_id != W25Q16DV_DEVICE_ID_RES); } uint8_t w25q80bv_get_status(void) @@ -163,11 +162,10 @@ void w25q80bv_chip_erase(void) { uint8_t device_id; - device_id = 0; - while(device_id != W25Q80BV_DEVICE_ID_RES) - { + do { device_id = w25q80bv_get_device_id(); - } + } while(device_id != W25Q80BV_DEVICE_ID_RES && + device_id != W25Q16DV_DEVICE_ID_RES); w25q80bv_write_enable(); w25q80bv_wait_while_busy(); @@ -208,11 +206,10 @@ void w25q80bv_program(uint32_t addr, uint32_t len, const uint8_t* data) uint16_t first_block_len; uint8_t device_id; - device_id = 0; - while(device_id != W25Q80BV_DEVICE_ID_RES) - { + do { device_id = w25q80bv_get_device_id(); - } + } while(device_id != W25Q80BV_DEVICE_ID_RES && + device_id != W25Q16DV_DEVICE_ID_RES); /* do nothing if we would overflow the flash */ if ((len > W25Q80BV_NUM_BYTES) || (addr > W25Q80BV_NUM_BYTES) diff --git a/firmware/common/w25q80bv.h b/firmware/common/w25q80bv.h index b11a466a..1dbc9969 100644 --- a/firmware/common/w25q80bv.h +++ b/firmware/common/w25q80bv.h @@ -38,6 +38,7 @@ #define W25Q80BV_DEVICE_ID_RES 0x13 /* Expected device_id for W25Q80BV */ +#define W25Q16DV_DEVICE_ID_RES 0x14 /* Expected device_id for W25Q16DV */ typedef union { From b9f702da8f9869b6eb16354b02d710602765c83d Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Thu, 30 Jul 2015 01:31:13 +0200 Subject: [PATCH 30/58] Simple "build all" toplevel Makefile --- Makefile | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..2181bb34 --- /dev/null +++ b/Makefile @@ -0,0 +1,50 @@ +all: lib hackrf-usb hackrf-tools + +force: clean all + +ifeq ($(MAKECMDGOALS),rebuild) +FORCE=FORCE +rebuild: all +endif + +firmware/libopencm3/README: + git submodule init + +firmware/libopencm3/lib/libopencm3_lpc43xx.a: $(FORCE) + git submodule update + $(MAKE) -C firmware/libopencm3 + +lib: firmware/libopencm3/README firmware/libopencm3/lib/libopencm3_lpc43xx.a + +FDIR=firmware/hackrf_usb/build + +hackrf-usb: hackrf.bin + +hackrf.bin: $(FDIR)/hackrf_usb.bin + cp $< $@ + +$(FDIR)/hackrf_usb.bin: $(FDIR) $(FDIR)/Makefile $(FORCE) + $(MAKE) -C $(FDIR) + +$(FDIR)/Makefile: + cd $(FDIR) && cmake -DBOARD=RAD1O -DRUN_FROM=RAM .. + +$(FDIR): + mkdir $(FDIR) + +TDIR=host/build + +$(TDIR): + mkdir $(TDIR) + +hackrf-tools: $(TDIR) $(TDIR)/hackrf-tools/src/hackrf_info + +$(TDIR)/hackrf-tools/src/hackrf_info: $(FORCE) + cd $(TDIR) && cmake .. && $(MAKE) + + +clean: + $(RM) -r $(FDIR) $(TDIR) + $(MAKE) -C firmware/libopencm3 clean + +FORCE: From 6afe674de50ab6300d9559c86b4deae6aab86683 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Tue, 11 Aug 2015 00:10:17 +0200 Subject: [PATCH 31/58] No longer copy the bin around --- Makefile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 2181bb34..76dbd8e4 100644 --- a/Makefile +++ b/Makefile @@ -18,10 +18,7 @@ lib: firmware/libopencm3/README firmware/libopencm3/lib/libopencm3_lpc43xx.a FDIR=firmware/hackrf_usb/build -hackrf-usb: hackrf.bin - -hackrf.bin: $(FDIR)/hackrf_usb.bin - cp $< $@ +hackrf-usb: $(FDIR)/hackrf_usb.bin $(FDIR)/hackrf_usb.bin: $(FDIR) $(FDIR)/Makefile $(FORCE) $(MAKE) -C $(FDIR) @@ -42,9 +39,10 @@ hackrf-tools: $(TDIR) $(TDIR)/hackrf-tools/src/hackrf_info $(TDIR)/hackrf-tools/src/hackrf_info: $(FORCE) cd $(TDIR) && cmake .. && $(MAKE) - -clean: +hack-clean: $(RM) -r $(FDIR) $(TDIR) + +clean: hack-clean $(MAKE) -C firmware/libopencm3 clean FORCE: From a5d234ded7bba2f87971a9ccee67cbfff6a11263 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Tue, 11 Aug 2015 00:26:41 +0200 Subject: [PATCH 32/58] do not build host-tools by default anymore --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 76dbd8e4..fe55cc56 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +default: lib hackrf-usb + all: lib hackrf-usb hackrf-tools force: clean all From 5ce0cc853bb4e4c95b5acbcc2a25719c6180627f Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 11 Aug 2015 11:03:37 +0200 Subject: [PATCH 33/58] hack(tuning): Fix IF to 2.35 GHz --- firmware/common/tuning.c | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/common/tuning.c b/firmware/common/tuning.c index 498e0be1..533df3d9 100644 --- a/firmware/common/tuning.c +++ b/firmware/common/tuning.c @@ -69,6 +69,7 @@ bool set_freq(const uint64_t freq) rf_path_set_filter(RF_PATH_FILTER_LOW_PASS); /* IF is graduated from 2650 MHz to 2343 MHz */ max2837_freq_nominal_hz = 2650000000 - (freq / 7); + max2837_freq_nominal_hz = 2350000000; mixer_freq_mhz = (max2837_freq_nominal_hz / FREQ_ONE_MHZ) + freq_mhz; /* Set Freq and read real freq */ real_mixer_freq_hz = mixer_set_frequency(mixer_freq_mhz); From e612dfd8bf05343e27d7f9be3bbaed19d46bab42 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Tue, 11 Aug 2015 11:19:58 +0200 Subject: [PATCH 34/58] fix(usb): Use new USB PID: 0xCC15 --- firmware/hackrf_usb/usb_descriptor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/hackrf_usb/usb_descriptor.c b/firmware/hackrf_usb/usb_descriptor.c index aaf5b019..8fbc3ec9 100644 --- a/firmware/hackrf_usb/usb_descriptor.c +++ b/firmware/hackrf_usb/usb_descriptor.c @@ -31,7 +31,7 @@ #elif JAWBREAKER #define USB_PRODUCT_ID (0x604B) #elif RAD1O -#define USB_PRODUCT_ID (0x6089) /* TBD: (0xCC15) */ +#define USB_PRODUCT_ID (0xCC15) #else #define USB_PRODUCT_ID (0xFFFF) #endif From 19d03d62ae902d37a7958cfaa2012c40c04237d9 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Sun, 4 Oct 2015 21:41:45 +0200 Subject: [PATCH 35/58] host/misc/udev: fix CC15 to cc15 in udev rule. Capital letters don't work (tested on debian linux). --- host/misc/udev/53-hackrf.rules.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/misc/udev/53-hackrf.rules.in b/host/misc/udev/53-hackrf.rules.in index 05144a7f..a517ed9d 100644 --- a/host/misc/udev/53-hackrf.rules.in +++ b/host/misc/udev/53-hackrf.rules.in @@ -3,6 +3,6 @@ ATTR{idVendor}=="1d50", ATTR{idProduct}=="604b", SYMLINK+="hackrf-jawbreaker-%k" # HackRF One ATTR{idVendor}=="1d50", ATTR{idProduct}=="6089", SYMLINK+="hackrf-one-%k", MODE="660", GROUP="@HACKRF_GROUP@" # HackRF One -ATTR{idVendor}=="1d50", ATTR{idProduct}=="CC15", SYMLINK+="rad1o-%k", MODE="660", GROUP="@HACKRF_GROUP@" +ATTR{idVendor}=="1d50", ATTR{idProduct}=="cc15", SYMLINK+="rad1o-%k", MODE="660", GROUP="@HACKRF_GROUP@" # HackRF DFU ATTR{idVendor}=="1fc9", ATTR{idProduct}=="000c", SYMLINK+="nxp-dfu-%k", MODE="660", GROUP="@HACKRF_GROUP@" From 9a45248829974c5992f14e218e3e5f26dfa54cb2 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 30 Nov 2015 00:23:55 +0100 Subject: [PATCH 36/58] fix(max2871.c): Switch to a 50 MHz PFD for better performance --- firmware/common/max2871.c | 11 ++++++----- firmware/common/tuning.c | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index cf8a27fd..a58a3a49 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -68,7 +68,7 @@ void mixer_setup(void) max2871_set_MUX(0x0C); // Register 6 readback max2871_set_DBR(0); max2871_set_RDIV2(0); - max2871_set_R(50); // 1 MHz f_PFD + max2871_set_R(1); // 50 MHz f_PFD max2871_set_REG4DB(1); max2871_set_CP(15); // ?: CP charge pump current 0-15 max2871_set_LDF(1); // INT-N @@ -87,7 +87,7 @@ void mixer_setup(void) max2871_set_SDLDO(0); max2871_set_SDDIV(0); max2871_set_SDREF(0); - max2871_set_BS(20); // For 1 MHz f_PFD + max2871_set_BS(20*50); // For 50 MHz f_PFD max2871_set_FB(1); // Do not put DIVA into the feedback loop max2871_set_DIVA(0); max2871_set_SDVCO(0); @@ -207,13 +207,14 @@ static void max2871_write_registers(void) /* Set frequency (MHz). */ uint64_t mixer_set_frequency(uint16_t mhz) { - int n = mhz; + int n = mhz / 50; int diva = 0; - while(n < 3000) { + while(n * 50 < 3000) { n *= 2; diva += 1; } + max2871_set_RFA_EN(0); max2871_write_registers(); @@ -226,7 +227,7 @@ uint64_t mixer_set_frequency(uint16_t mhz) max2871_set_RFA_EN(1); max2871_write_registers(); - return mhz * 1000000; + return (mhz/50)*50 * 1000000; } void mixer_tx(void) diff --git a/firmware/common/tuning.c b/firmware/common/tuning.c index 533df3d9..6998cdf5 100644 --- a/firmware/common/tuning.c +++ b/firmware/common/tuning.c @@ -69,7 +69,7 @@ bool set_freq(const uint64_t freq) rf_path_set_filter(RF_PATH_FILTER_LOW_PASS); /* IF is graduated from 2650 MHz to 2343 MHz */ max2837_freq_nominal_hz = 2650000000 - (freq / 7); - max2837_freq_nominal_hz = 2350000000; + max2837_freq_nominal_hz = 2300000000; mixer_freq_mhz = (max2837_freq_nominal_hz / FREQ_ONE_MHZ) + freq_mhz; /* Set Freq and read real freq */ real_mixer_freq_hz = mixer_set_frequency(mixer_freq_mhz); From 9e827b56beebf0ac512da514b968fafc7410c618 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sat, 5 Dec 2015 23:46:59 +0100 Subject: [PATCH 37/58] hack(rad1o): Lower noise configuration --- firmware/common/hackrf_core.c | 6 ++---- firmware/common/max2871.c | 10 +++++----- firmware/common/si5351c.c | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 422d4606..16760e17 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -346,20 +346,18 @@ void cpu_clock_init(void) si5351c_configure_multisynth(4, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ /* MS5/CLK5 is the source for the RFFC5071 mixer. */ - si5351c_configure_multisynth(5, 16*128-512, 0, 1, 0); /* 800/16 = 50MHz */ + si5351c_configure_multisynth(5, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */ /* MS6/CLK6 is unused. */ /* MS7/CLK7 is the source for the LPC43xx microcontroller. */ -#if 0 - /* Clock is deactivated as it is not used and creates noise */ uint8_t ms7data[] = { 90, 255, 20, 0 }; si5351c_write(ms7data, sizeof(ms7data)); -#endif #endif /* Set to 10 MHz, the common rate between Jellybean and Jawbreaker. */ sample_rate_set(10000000); + //sample_rate_set(8000000); si5351c_set_clock_source(PLL_SOURCE_XTAL); // soft reset diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index a58a3a49..095891b0 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -68,7 +68,7 @@ void mixer_setup(void) max2871_set_MUX(0x0C); // Register 6 readback max2871_set_DBR(0); max2871_set_RDIV2(0); - max2871_set_R(1); // 50 MHz f_PFD + max2871_set_R(1); // 40 MHz f_PFD max2871_set_REG4DB(1); max2871_set_CP(15); // ?: CP charge pump current 0-15 max2871_set_LDF(1); // INT-N @@ -87,7 +87,7 @@ void mixer_setup(void) max2871_set_SDLDO(0); max2871_set_SDDIV(0); max2871_set_SDREF(0); - max2871_set_BS(20*50); // For 50 MHz f_PFD + max2871_set_BS(20*40); // For 40 MHz f_PFD max2871_set_FB(1); // Do not put DIVA into the feedback loop max2871_set_DIVA(0); max2871_set_SDVCO(0); @@ -207,10 +207,10 @@ static void max2871_write_registers(void) /* Set frequency (MHz). */ uint64_t mixer_set_frequency(uint16_t mhz) { - int n = mhz / 50; + int n = mhz / 40; int diva = 0; - while(n * 50 < 3000) { + while(n * 40 < 3000) { n *= 2; diva += 1; } @@ -227,7 +227,7 @@ uint64_t mixer_set_frequency(uint16_t mhz) max2871_set_RFA_EN(1); max2871_write_registers(); - return (mhz/50)*50 * 1000000; + return (mhz/40)*40 * 1000000; } void mixer_tx(void) diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index e01b3659..10598739 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -239,7 +239,7 @@ void si5351c_configure_clock_control() } #endif -#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O) +#if (defined JAWBREAKER || defined HACKRF_ONE) void si5351c_configure_clock_control(const enum pll_sources source) { uint8_t pll; @@ -265,10 +265,41 @@ void si5351c_configure_clock_control(const enum pll_sources source) } #endif -/* Enable CLK outputs 0, 1, 2, 3, 4, 5, 7 only. */ +#ifdef RAD1O +void si5351c_configure_clock_control(const enum pll_sources source) +{ + uint8_t pll; + + /* PLLA on XTAL */ + pll = SI5351C_CLK_PLL_SRC_A; + + /* Clock to CPU is deactivated as it is not used and creates noise */ + /* External clock output is deactivated as it is not used and creates noise */ + uint8_t data[] = {16 + ,SI5351C_CLK_FRAC_MODE | SI5351C_CLK_PLL_SRC(pll) | SI5351C_CLK_SRC(SI5351C_CLK_SRC_MULTISYNTH_SELF) | SI5351C_CLK_IDRV(SI5351C_CLK_IDRV_2MA) + ,SI5351C_CLK_INT_MODE | SI5351C_CLK_PLL_SRC(pll) | SI5351C_CLK_SRC(SI5351C_CLK_SRC_MULTISYNTH_0_4) | SI5351C_CLK_IDRV(SI5351C_CLK_IDRV_2MA) + ,SI5351C_CLK_INT_MODE | SI5351C_CLK_PLL_SRC(pll) | SI5351C_CLK_SRC(SI5351C_CLK_SRC_MULTISYNTH_0_4) | SI5351C_CLK_IDRV(SI5351C_CLK_IDRV_2MA) + ,SI5351C_CLK_POWERDOWN | SI5351C_CLK_INT_MODE /*not connected, but: plla int mode*/ + ,SI5351C_CLK_INT_MODE | SI5351C_CLK_PLL_SRC(pll) | SI5351C_CLK_SRC(SI5351C_CLK_SRC_MULTISYNTH_SELF) | SI5351C_CLK_IDRV(SI5351C_CLK_IDRV_6MA) + ,SI5351C_CLK_INT_MODE | SI5351C_CLK_PLL_SRC(pll) | SI5351C_CLK_SRC(SI5351C_CLK_SRC_MULTISYNTH_SELF) | SI5351C_CLK_IDRV(SI5351C_CLK_IDRV_4MA) + ,SI5351C_CLK_POWERDOWN | SI5351C_CLK_INT_MODE /*not connected, but: plla int mode*/ + ,SI5351C_CLK_POWERDOWN | SI5351C_CLK_INT_MODE /*not connected, but: plla int mode*/ + }; + si5351c_write(data, sizeof(data)); +} +#endif + void si5351c_enable_clock_outputs() { +#ifdef RAD1O + /* Enable CLK outputs 0, 1, 2, 4, 5 only. */ + /* 7: Clock to CPU is deactivated as it is not used and creates noise */ + /* 3: External clock output is deactivated as it is not used and creates noise */ + uint8_t data[] = { 3, ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 4) | (1 << 5))}; +#else + /* Enable CLK outputs 0, 1, 2, 3, 4, 5, 7 only. */ uint8_t data[] = { 3, 0x40 }; +#endif si5351c_write(data, sizeof(data)); } From 86b424d9d3eff7a7f7986d02e4b2723247900aa2 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 7 Dec 2015 00:29:33 +0100 Subject: [PATCH 38/58] feat(hackrf): Callbacks for a possible UI --- firmware/common/hackrf_core.c | 23 +++++++++++++++++++++-- firmware/common/max2837.c | 7 +++---- firmware/common/max2837.h | 2 +- firmware/common/rf_path.c | 12 ++++++++++++ firmware/common/tuning.c | 7 +++++++ firmware/hackrf_usb/hackrf_usb.c | 9 +++++++++ firmware/hackrf_usb/usb_api_transceiver.c | 13 +++++++++++++ 7 files changed, 66 insertions(+), 7 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 16760e17..639b8e70 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -27,6 +27,11 @@ #include "rffc5071.h" #include "sgpio.h" #include "rf_path.h" + +#if HACKRF_ENABLE_UI +#include "hackrf-ui.h" +#endif + #include #include #include @@ -86,6 +91,10 @@ bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom) uint32_t a, b, c; uint32_t rem; +#if HACKRF_ENABLE_UI + hackrf_ui_setSampleRate(rate_num/2); +#endif + /* Find best config */ a = (VCO_FREQ * rate_denom) / rate_num; @@ -169,7 +178,11 @@ bool sample_rate_set(const uint32_t sample_rate_hz) { default: return false; } - + +#if HACKRF_ENABLE_UI + hackrf_ui_setSampleRate(sample_rate_hz); +#endif + /* NOTE: Because MS1, 2, 3 outputs are slaved to PLLA, the p1, p2, p3 * values are irrelevant. */ @@ -250,7 +263,13 @@ bool sample_rate_set(const uint32_t sample_rate_hz) { } bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz) { - return max2837_set_lpf_bandwidth(bandwidth_hz); + uint32_t bandwidth_hz_real = max2837_set_lpf_bandwidth(bandwidth_hz); + +#if HACKRF_ENABLE_UI + if(bandwidth_hz_real) hackrf_ui_setFilterBW(bandwidth_hz_real); +#endif + + return bandwidth_hz_real != 0; } /* clock startup for Jellybean with Lemondrop attached diff --git a/firmware/common/max2837.c b/firmware/common/max2837.c index 020763d6..6da78dc5 100644 --- a/firmware/common/max2837.c +++ b/firmware/common/max2837.c @@ -425,7 +425,7 @@ static const max2837_ft_t max2837_ft[] = { { 0, 0 }, }; -bool max2837_set_lpf_bandwidth(const uint32_t bandwidth_hz) { +uint32_t max2837_set_lpf_bandwidth(const uint32_t bandwidth_hz) { const max2837_ft_t* p = max2837_ft; while( p->bandwidth_hz != 0 ) { if( p->bandwidth_hz >= bandwidth_hz ) { @@ -437,10 +437,9 @@ bool max2837_set_lpf_bandwidth(const uint32_t bandwidth_hz) { if( p->bandwidth_hz != 0 ) { set_MAX2837_FT(p->ft); max2837_regs_commit(); - return true; - } else { - return false; } + + return p->bandwidth_hz; } bool max2837_set_lna_gain(const uint32_t gain_db) { diff --git a/firmware/common/max2837.h b/firmware/common/max2837.h index 582a0966..6d5bf533 100644 --- a/firmware/common/max2837.h +++ b/firmware/common/max2837.h @@ -59,7 +59,7 @@ extern void max2837_stop(void); /* Set frequency in Hz. Frequency setting is a multi-step function * where order of register writes matters. */ extern void max2837_set_frequency(uint32_t freq); -bool max2837_set_lpf_bandwidth(const uint32_t bandwidth_hz); +uint32_t max2837_set_lpf_bandwidth(const uint32_t bandwidth_hz); bool max2837_set_lna_gain(const uint32_t gain_db); bool max2837_set_vga_gain(const uint32_t gain_db); bool max2837_set_txvga_gain(const uint32_t gain_db); diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 4eaaf98f..b148c2ad 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -27,6 +27,10 @@ #include +#if HACKRF_ENABLE_UI +#include "hackrf-ui.h" +#endif + #include #include #include @@ -392,6 +396,10 @@ void rf_path_set_direction(const rf_path_direction_t direction) { } switchctrl_set(switchctrl); + +#if HACKRF_ENABLE_UI + hackrf_ui_setDirection(direction); +#endif } void rf_path_set_filter(const rf_path_filter_t filter) { @@ -434,6 +442,10 @@ void rf_path_set_lna(const uint_fast8_t enable) { } switchctrl_set(switchctrl); + +#if HACKRF_ENABLE_UI + hackrf_ui_setLNAPower(enable); +#endif } /* antenna port power control */ diff --git a/firmware/common/tuning.c b/firmware/common/tuning.c index 6998cdf5..5c51267f 100644 --- a/firmware/common/tuning.c +++ b/firmware/common/tuning.c @@ -22,6 +22,10 @@ #include "tuning.h" +#if HACKRF_ENABLE_UI +#include "hackrf-ui.h" +#endif + #include #include #include @@ -108,6 +112,9 @@ bool set_freq(const uint64_t freq) max2837_set_mode(prior_max2837_mode); if( success ) { freq_cache = freq; +#if HACKRF_ENABLE_UI + hackrf_ui_setFrequency(freq); +#endif } return success; } diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index e2fbde9c..4eb3c41d 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -48,6 +48,10 @@ #include "usb_bulk_buffer.h" #include "si5351c.h" +#if HACKRF_ENABLE_UI +#include "hackrf-ui.h" +#endif + static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { @@ -246,11 +250,16 @@ int main(void) { nvic_set_priority(NVIC_USB0_IRQ, 255); +#if HACKRF_ENABLE_UI + hackrf_ui_init(); +#endif + usb_run(&usb_device); ssp1_init(); + rf_path_init(); unsigned int phase = 0; diff --git a/firmware/hackrf_usb/usb_api_transceiver.c b/firmware/hackrf_usb/usb_api_transceiver.c index 7ab06376..20357260 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.c +++ b/firmware/hackrf_usb/usb_api_transceiver.c @@ -24,6 +24,10 @@ #include +#if HACKRF_ENABLE_UI +#include "hackrf-ui.h" +#endif + #include #include #include @@ -147,6 +151,9 @@ usb_request_status_t usb_vendor_request_set_lna_gain( if( stage == USB_TRANSFER_STAGE_SETUP ) { const uint8_t value = max2837_set_lna_gain(endpoint->setup.index); endpoint->buffer[0] = value; +#if HACKRF_ENABLE_UI + if(value) hackrf_ui_setBBLNAGain(endpoint->setup.index); +#endif usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 1, NULL, NULL); usb_transfer_schedule_ack(endpoint->out); @@ -161,6 +168,9 @@ usb_request_status_t usb_vendor_request_set_vga_gain( if( stage == USB_TRANSFER_STAGE_SETUP ) { const uint8_t value = max2837_set_vga_gain(endpoint->setup.index); endpoint->buffer[0] = value; +#if HACKRF_ENABLE_UI + if(value) hackrf_ui_setBBVGAGain(endpoint->setup.index); +#endif usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 1, NULL, NULL); usb_transfer_schedule_ack(endpoint->out); @@ -175,6 +185,9 @@ usb_request_status_t usb_vendor_request_set_txvga_gain( if( stage == USB_TRANSFER_STAGE_SETUP ) { const uint8_t value = max2837_set_txvga_gain(endpoint->setup.index); endpoint->buffer[0] = value; +#if HACKRF_ENABLE_UI + if(value) hackrf_ui_setBBTXVGAGain(endpoint->setup.index); +#endif usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 1, NULL, NULL); usb_transfer_schedule_ack(endpoint->out); From d7c162902c7d49e9098d153022e575ccc447d7fb Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Wed, 9 Dec 2015 22:26:16 +0100 Subject: [PATCH 39/58] fix(hackrf-ui): Make the calls weak --- firmware/common/hackrf-ui.h | 17 +++++++++++++++++ firmware/common/hackrf_core.c | 9 +-------- firmware/common/rf_path.c | 6 ------ firmware/common/tuning.c | 4 ---- firmware/hackrf_usb/hackrf_usb.c | 4 ---- firmware/hackrf_usb/usb_api_transceiver.c | 8 -------- 6 files changed, 18 insertions(+), 30 deletions(-) create mode 100644 firmware/common/hackrf-ui.h diff --git a/firmware/common/hackrf-ui.h b/firmware/common/hackrf-ui.h new file mode 100644 index 00000000..95b82489 --- /dev/null +++ b/firmware/common/hackrf-ui.h @@ -0,0 +1,17 @@ +#ifndef HACKRF_UI_H +#define HACKRF_UI_H + +#include +#include + +void hackrf_ui_init(void) __attribute__((weak)); +void hackrf_ui_setFrequency(uint64_t _freq) __attribute__((weak)); +void hackrf_ui_setSampleRate(uint32_t _sample_rate) __attribute__((weak)); +void hackrf_ui_setDirection(const rf_path_direction_t _direction) __attribute__((weak)); +void hackrf_ui_setFilterBW(uint32_t bw) __attribute__((weak)); +void hackrf_ui_setLNAPower(bool _lna_on) __attribute__((weak)); +void hackrf_ui_setBBLNAGain(const uint32_t gain_db) __attribute__((weak)); +void hackrf_ui_setBBVGAGain(const uint32_t gain_db) __attribute__((weak)); +void hackrf_ui_setBBTXVGAGain(const uint32_t gain_db) __attribute__((weak)); + +#endif diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 639b8e70..bc5f5084 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -28,9 +28,7 @@ #include "sgpio.h" #include "rf_path.h" -#if HACKRF_ENABLE_UI #include "hackrf-ui.h" -#endif #include #include @@ -91,9 +89,7 @@ bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom) uint32_t a, b, c; uint32_t rem; -#if HACKRF_ENABLE_UI hackrf_ui_setSampleRate(rate_num/2); -#endif /* Find best config */ a = (VCO_FREQ * rate_denom) / rate_num; @@ -179,9 +175,7 @@ bool sample_rate_set(const uint32_t sample_rate_hz) { return false; } -#if HACKRF_ENABLE_UI hackrf_ui_setSampleRate(sample_rate_hz); -#endif /* NOTE: Because MS1, 2, 3 outputs are slaved to PLLA, the p1, p2, p3 * values are irrelevant. */ @@ -262,12 +256,11 @@ bool sample_rate_set(const uint32_t sample_rate_hz) { #endif } + bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz) { uint32_t bandwidth_hz_real = max2837_set_lpf_bandwidth(bandwidth_hz); -#if HACKRF_ENABLE_UI if(bandwidth_hz_real) hackrf_ui_setFilterBW(bandwidth_hz_real); -#endif return bandwidth_hz_real != 0; } diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index aacab246..2bc3e953 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -27,9 +27,7 @@ #include -#if HACKRF_ENABLE_UI #include "hackrf-ui.h" -#endif #include #include @@ -398,9 +396,7 @@ void rf_path_set_direction(const rf_path_direction_t direction) { switchctrl_set(switchctrl); -#if HACKRF_ENABLE_UI hackrf_ui_setDirection(direction); -#endif } void rf_path_set_filter(const rf_path_filter_t filter) { @@ -444,9 +440,7 @@ void rf_path_set_lna(const uint_fast8_t enable) { switchctrl_set(switchctrl); -#if HACKRF_ENABLE_UI hackrf_ui_setLNAPower(enable); -#endif } /* antenna port power control */ diff --git a/firmware/common/tuning.c b/firmware/common/tuning.c index 5c51267f..a6ec5b36 100644 --- a/firmware/common/tuning.c +++ b/firmware/common/tuning.c @@ -22,9 +22,7 @@ #include "tuning.h" -#if HACKRF_ENABLE_UI #include "hackrf-ui.h" -#endif #include #include @@ -112,9 +110,7 @@ bool set_freq(const uint64_t freq) max2837_set_mode(prior_max2837_mode); if( success ) { freq_cache = freq; -#if HACKRF_ENABLE_UI hackrf_ui_setFrequency(freq); -#endif } return success; } diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 05e82376..66cd23b2 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -49,9 +49,7 @@ #include "si5351c.h" #include "w25q80bv.h" -#if HACKRF_ENABLE_UI #include "hackrf-ui.h" -#endif static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF; @@ -259,9 +257,7 @@ int main(void) { nvic_set_priority(NVIC_USB0_IRQ, 255); -#if HACKRF_ENABLE_UI hackrf_ui_init(); -#endif usb_run(&usb_device); diff --git a/firmware/hackrf_usb/usb_api_transceiver.c b/firmware/hackrf_usb/usb_api_transceiver.c index 20357260..a5cb22bc 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.c +++ b/firmware/hackrf_usb/usb_api_transceiver.c @@ -24,9 +24,7 @@ #include -#if HACKRF_ENABLE_UI #include "hackrf-ui.h" -#endif #include #include @@ -151,9 +149,7 @@ usb_request_status_t usb_vendor_request_set_lna_gain( if( stage == USB_TRANSFER_STAGE_SETUP ) { const uint8_t value = max2837_set_lna_gain(endpoint->setup.index); endpoint->buffer[0] = value; -#if HACKRF_ENABLE_UI if(value) hackrf_ui_setBBLNAGain(endpoint->setup.index); -#endif usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 1, NULL, NULL); usb_transfer_schedule_ack(endpoint->out); @@ -168,9 +164,7 @@ usb_request_status_t usb_vendor_request_set_vga_gain( if( stage == USB_TRANSFER_STAGE_SETUP ) { const uint8_t value = max2837_set_vga_gain(endpoint->setup.index); endpoint->buffer[0] = value; -#if HACKRF_ENABLE_UI if(value) hackrf_ui_setBBVGAGain(endpoint->setup.index); -#endif usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 1, NULL, NULL); usb_transfer_schedule_ack(endpoint->out); @@ -185,9 +179,7 @@ usb_request_status_t usb_vendor_request_set_txvga_gain( if( stage == USB_TRANSFER_STAGE_SETUP ) { const uint8_t value = max2837_set_txvga_gain(endpoint->setup.index); endpoint->buffer[0] = value; -#if HACKRF_ENABLE_UI if(value) hackrf_ui_setBBTXVGAGain(endpoint->setup.index); -#endif usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 1, NULL, NULL); usb_transfer_schedule_ack(endpoint->out); From 98af0a9340f403a4b2f11be4cbb176890ce82ce7 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Mon, 21 Dec 2015 01:22:01 +0100 Subject: [PATCH 40/58] fix(hackrf-usb): Remove unneeded rad1o patch, not reading the serial number --- firmware/hackrf_usb/hackrf_usb.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 66cd23b2..b785eed1 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -201,7 +201,6 @@ void usb_configuration_changed( void usb_set_descriptor_by_serial_number(void) { -#ifndef RAD1O iap_cmd_res_t iap_cmd_res; /* Read IAP Serial Number Identification */ @@ -220,9 +219,6 @@ void usb_set_descriptor_by_serial_number(void) usb_descriptor_string_serial_number[3 + i * 2] = 0x00; } } else { -#else - { -#endif usb_descriptor_string_serial_number[0] = 2; usb_descriptor_string_serial_number[1] = USB_DESCRIPTOR_TYPE_STRING; } From bdb762f0235c06d4f5169012d52f1062e42cb2fb Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Sat, 26 Dec 2015 16:19:58 +0100 Subject: [PATCH 41/58] feat(max2871): Implement mixer_enable and mixer_disable --- firmware/common/max2871.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 095891b0..d84bef10 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -237,9 +237,13 @@ void mixer_rx(void) void mixer_rxtx(void) {} void mixer_enable(void) -{} +{ + gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ +} void mixer_disable(void) -{} +{ + gpio_clear(PORT_VCO_CE, PIN_VCO_CE); /* active high */ +} void mixer_set_gpo(uint8_t gpo) { (void) gpo; From 0f5164105343f777989db3c8d71bfe543d7ee5c2 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Thu, 14 Jan 2016 14:38:29 +0100 Subject: [PATCH 42/58] First receive streaming implementation --- host/hackrf-tools/src/hackrf_transfer.c | 52 ++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index 9aac6a6e..318cf8ad 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -297,6 +297,11 @@ uint32_t amplitude = 0; bool receive = false; bool receive_wav = false; +uint64_t stream_size = 0; +uint32_t stream_head = 0; +uint32_t stream_tail = 0; +uint32_t stream_drop = 0; +uint8_t *stream_buf = NULL; bool transmit = false; struct timeval time_start; @@ -353,6 +358,20 @@ int rx_callback(hackrf_transfer* transfer) { transfer->buffer[i] ^= (uint8_t)0x80; } } + if (stream_size>0){ + if ((stream_size-1+stream_head-stream_tail)%stream_size buffer,bytes_to_write); + }else{ + memcpy(stream_buf+stream_tail,transfer->buffer,(stream_size-stream_tail)); + memcpy(stream_buf,transfer->buffer+(stream_size-stream_tail),bytes_to_write-(stream_size-stream_tail)); + }; + __atomic_store_n(&stream_tail,(stream_tail+bytes_to_write)%stream_size,__ATOMIC_RELEASE); + } + return 0; + }else{ bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd); if ((bytes_written != bytes_to_write) || (limit_num_samples && (bytes_to_xfer == 0))) { @@ -360,6 +379,7 @@ int rx_callback(hackrf_transfer* transfer) { } else { return 0; } + } } else { return -1; } @@ -448,6 +468,7 @@ static void usage() { printf("\t[-s sample_rate_hz] # Sample rate in Hz (8/10/12.5/16/20MHz, default %sMHz).\n", u64toa((DEFAULT_SAMPLE_RATE_HZ/FREQ_ONE_MHZ),&ascii_u64_data1)); printf("\t[-n num_samples] # Number of samples to transfer (default is unlimited).\n"); + printf("\t[-S buf_size] # Enable receive streaming with buffer size buf_size.\n"); printf("\t[-c amplitude] # CW signal source mode, amplitude 0-127 (DC value to DAC).\n"); printf("\t[-R] # Repeat TX mode (default is off) \n"); printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in MHz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" ); @@ -492,7 +513,7 @@ int main(int argc, char** argv) { float time_diff; unsigned int lna_gain=8, vga_gain=20, txvga_gain=0; - while( (opt = getopt(argc, argv, "wr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:R")) != EOF ) + while( (opt = getopt(argc, argv, "wr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:RS:")) != EOF ) { result = HACKRF_SUCCESS; switch( opt ) @@ -515,6 +536,11 @@ int main(int argc, char** argv) { serial_number = optarg; break; + case 'S': + result = parse_u64(optarg, &stream_size); + stream_buf = calloc(1,stream_size); + break; + case 'f': automatic_tuning = true; result = parse_u64(optarg, &freq_hz); @@ -931,6 +957,29 @@ int main(int argc, char** argv) { uint32_t byte_count_now; struct timeval time_now; float time_difference, rate; + if (stream_size>0){ + if(stream_head==stream_tail){ + usleep(10000); // queue empty + }else{ + ssize_t len; + ssize_t bytes_written; + uint32_t _st= __atomic_load_n(&stream_tail,__ATOMIC_ACQUIRE); + if(stream_head<_st) + len=_st-stream_head; + else + len=stream_size-stream_head; + bytes_written = fwrite(stream_buf+stream_head, 1, len, fd); + if (len != bytes_written){ + printf("write failed"); + do_exit=true; + }; + stream_head=(stream_head+len)%stream_size; + } + if(stream_drop>0){ + uint32_t drops= __atomic_exchange_n (&stream_drop,0,__ATOMIC_SEQ_CST); + printf("dropped frames: [%d]\n",drops); + } + }else{ sleep(1); gettimeofday(&time_now, NULL); @@ -950,6 +999,7 @@ int main(int argc, char** argv) { printf("\nCouldn't transfer any bytes for one second.\n"); break; } + } } result = hackrf_is_streaming(device); From 70c41463b1c1fe3bb1264a417a47817709cea6f8 Mon Sep 17 00:00:00 2001 From: schneider Date: Thu, 26 Jan 2017 00:31:31 +0100 Subject: [PATCH 43/58] refact(mixer): Basic mixer abstraction --- firmware/common/hackrf_core.c | 46 +-------- firmware/common/hackrf_core.h | 5 +- firmware/common/max2871.c | 23 ++--- firmware/common/max2871.h | 21 ++++ firmware/common/max2871_regs.h | 4 +- firmware/common/mixer.c | 128 +++++++++++++++++++++++++ firmware/common/mixer.h | 31 +++--- firmware/common/rf_path.c | 15 ++- firmware/hackrf-common.cmake | 7 +- firmware/hackrf_usb/usb_api_register.c | 4 +- 10 files changed, 197 insertions(+), 87 deletions(-) create mode 100644 firmware/common/max2871.h create mode 100644 firmware/common/mixer.c diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index bc6d3f23..63eed196 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -29,8 +29,6 @@ #include "max2837_target.h" #include "max5864.h" #include "max5864_target.h" -#include "rffc5071.h" -#include "rffc5071_spi.h" #include "w25q80bv.h" #include "w25q80bv_target.h" #include "i2c_bus.h" @@ -77,20 +75,6 @@ static struct gpio_t gpio_max2837_b7 = GPIO(2, 15); /* MAX5864 SPI chip select (AD_CS) GPIO PinMux */ static struct gpio_t gpio_max5864_select = GPIO(2, 7); -/* RFFC5071 GPIO serial interface PinMux */ -#ifdef JELLYBEAN -static struct gpio_t gpio_rffc5072_select = GPIO(3, 8); -static struct gpio_t gpio_rffc5072_clock = GPIO(3, 9); -static struct gpio_t gpio_rffc5072_data = GPIO(3, 10); -static struct gpio_t gpio_rffc5072_reset = GPIO(3, 11); -#endif -#if (defined JAWBREAKER || defined HACKRF_ONE) -static struct gpio_t gpio_rffc5072_select = GPIO(2, 13); -static struct gpio_t gpio_rffc5072_clock = GPIO(5, 6); -static struct gpio_t gpio_rffc5072_data = GPIO(3, 3); -static struct gpio_t gpio_rffc5072_reset = GPIO(2, 14); -#endif - /* RF LDO control */ #ifdef JAWBREAKER static struct gpio_t gpio_rf_ldo_enable = GPIO(2, 9); @@ -241,27 +225,6 @@ max5864_driver_t max5864 = { .target_init = max5864_target_init, }; -#if 0 //XXX -const rffc5071_spi_config_t rffc5071_spi_config = { - .gpio_select = &gpio_rffc5072_select, - .gpio_clock = &gpio_rffc5072_clock, - .gpio_data = &gpio_rffc5072_data, -}; - -spi_bus_t spi_bus_rffc5071 = { - .config = &rffc5071_spi_config, - .start = rffc5071_spi_start, - .stop = rffc5071_spi_stop, - .transfer = rffc5071_spi_transfer, - .transfer_gather = rffc5071_spi_transfer_gather, -}; - -rffc5071_driver_t rffc5072 = { - .bus = &spi_bus_rffc5071, - .gpio_reset = &gpio_rffc5072_reset, -}; -#endif - const ssp_config_t ssp_config_w25q80bv = { .data_bits = SSP_DATA_8BITS, .serial_clock_rate = 2, @@ -907,12 +870,9 @@ void pin_setup(void) { SCU_SFSI2C0 = SCU_I2C0_NOMINAL; spi_bus_start(&spi_bus_ssp1, &ssp_config_max2837); -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - spi_bus_start(&spi_bus_rffc5071, &rffc5071_spi_config); -#endif - // XXX -#ifdef RAD1O -#endif + + mixer_pin_setup(&mixer); + rf_path_pin_setup(&rf_path); /* Configure external clock in */ diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index e5c7a9e0..627c2aab 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -37,7 +37,7 @@ extern "C" #include "max2837.h" #include "max5864.h" -#include "rffc5071.h" +#include "mixer.h" #include "w25q80bv.h" #include "sgpio.h" #include "rf_path.h" @@ -342,8 +342,7 @@ extern const ssp_config_t ssp_config_max5864; extern max2837_driver_t max2837; extern max5864_driver_t max5864; -// XXX -extern rffc5071_driver_t mixer; +extern mixer_driver_t mixer; extern w25q80bv_driver_t spi_flash; extern sgpio_config_t sgpio_config; extern rf_path_t rf_path; diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 6a5cb197..799b8b4c 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -1,5 +1,4 @@ -#include "mixer.h" -//#include "max2871.h" +#include "max2871.h" // TODO: put max2871_regs.c into the build system #include "max2871_regs.c" @@ -17,13 +16,11 @@ #include #include -rffc5071_driver_t mixer; - static void max2871_spi_write(uint8_t r, uint32_t v); static void max2871_write_registers(void); static void delay_ms(int ms); -void mixer_setup(rffc5071_driver_t* const drv) +void max2871_setup(max2871_driver_t* const drv) { #if 0 //XXX /* Configure GPIO pins. */ @@ -108,7 +105,7 @@ void mixer_setup(rffc5071_driver_t* const drv) max2871_write_registers(); - mixer_set_frequency(3500); + max2871_set_frequency(3500); #endif } @@ -213,7 +210,7 @@ static void max2871_write_registers(void) } /* Set frequency (MHz). */ -uint64_t mixer_set_frequency(rffc5071_driver_t* const drv, uint16_t mhz) +uint64_t max2871_set_frequency(max2871_driver_t* const drv, uint16_t mhz) { int n = mhz / 40; int diva = 0; @@ -238,25 +235,25 @@ uint64_t mixer_set_frequency(rffc5071_driver_t* const drv, uint16_t mhz) return (mhz/40)*40 * 1000000; } -void mixer_tx(rffc5071_driver_t* const drv) +void max2871_tx(max2871_driver_t* const drv) {} -void mixer_rx(rffc5071_driver_t* const drv) +void max2871_rx(max2871_driver_t* const drv) {} -void mixer_rxtx(rffc5071_driver_t* const drv) +void max2871_rxtx(max2871_driver_t* const drv) {} -void mixer_enable(rffc5071_driver_t* const drv) +void max2871_enable(max2871_driver_t* const drv) { #if 0 //XXX gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ #endif } -void mixer_disable(rffc5071_driver_t* const drv) +void max2871_disable(max2871_driver_t* const drv) { #if 0 //XXX gpio_clear(PORT_VCO_CE, PIN_VCO_CE); /* active high */ #endif } -void mixer_set_gpo(rffc5071_driver_t* const drv, uint8_t gpo) +void max2871_set_gpo(max2871_driver_t* const drv, uint8_t gpo) { (void) gpo; } diff --git a/firmware/common/max2871.h b/firmware/common/max2871.h new file mode 100644 index 00000000..3b5af5df --- /dev/null +++ b/firmware/common/max2871.h @@ -0,0 +1,21 @@ +#ifndef MAX2871_H +#define MAX2871_H + +#include + +typedef struct { + //spi_bus_t* const bus; + //gpio_t gpio_reset; + uint16_t regs[1]; + uint32_t regs_dirty; +} max2871_driver_t; + +extern void max2871_setup(max2871_driver_t* const drv); +extern uint64_t max2871_set_frequency(max2871_driver_t* const drv, uint16_t mhz); +extern void max2871_tx(max2871_driver_t* const drv); +extern void max2871_rx(max2871_driver_t* const drv); +extern void max2871_rxtx(max2871_driver_t* const drv); +extern void max2871_enable(max2871_driver_t* const drv); +extern void max2871_disable(max2871_driver_t* const drv); +extern void max2871_set_gpo(max2871_driver_t* const drv, uint8_t gpo); +#endif diff --git a/firmware/common/max2871_regs.h b/firmware/common/max2871_regs.h index 8bbb7e75..5acd11c4 100644 --- a/firmware/common/max2871_regs.h +++ b/firmware/common/max2871_regs.h @@ -1,5 +1,5 @@ -#ifndef MAX2871_H -#define MAX2871_H +#ifndef MAX2871_REGS_H +#define MAX2871_REGS_H #include #define MAX2871_VASA (1 << 9) diff --git a/firmware/common/mixer.c b/firmware/common/mixer.c new file mode 100644 index 00000000..6f6ccd96 --- /dev/null +++ b/firmware/common/mixer.c @@ -0,0 +1,128 @@ +#include "mixer.h" +#include "rffc5071.h" +#include "rffc5071_spi.h" +#include "max2871.h" +#include "gpio_lpc.h" + +/* RFFC5071 GPIO serial interface PinMux */ +#ifdef JELLYBEAN +static struct gpio_t gpio_rffc5072_select = GPIO(3, 8); +static struct gpio_t gpio_rffc5072_clock = GPIO(3, 9); +static struct gpio_t gpio_rffc5072_data = GPIO(3, 10); +static struct gpio_t gpio_rffc5072_reset = GPIO(3, 11); +#endif +#if (defined JAWBREAKER || defined HACKRF_ONE) +static struct gpio_t gpio_rffc5072_select = GPIO(2, 13); +static struct gpio_t gpio_rffc5072_clock = GPIO(5, 6); +static struct gpio_t gpio_rffc5072_data = GPIO(3, 3); +static struct gpio_t gpio_rffc5072_reset = GPIO(2, 14); +#endif + +#if (defined JAWBREAKER || defined HACKRF_ONE) +const rffc5071_spi_config_t rffc5071_spi_config = { + .gpio_select = &gpio_rffc5072_select, + .gpio_clock = &gpio_rffc5072_clock, + .gpio_data = &gpio_rffc5072_data, +}; + +spi_bus_t spi_bus_rffc5071 = { + .config = &rffc5071_spi_config, + .start = rffc5071_spi_start, + .stop = rffc5071_spi_stop, + .transfer = rffc5071_spi_transfer, + .transfer_gather = rffc5071_spi_transfer_gather, +}; + +mixer_driver_t mixer = { + .bus = &spi_bus_rffc5071, + .gpio_reset = &gpio_rffc5072_reset, +}; +#endif +#ifdef RAD1O +mixer_driver_t mixer; +#endif + +void mixer_pin_setup(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + (void) mixer; + spi_bus_start(&spi_bus_rffc5071, &rffc5071_spi_config); +#endif +#ifdef RAD1O +#endif +} + +void mixer_setup(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_setup(mixer); +#endif +#ifdef RAD1O +#endif + +} + +uint64_t mixer_set_frequency(mixer_driver_t* const mixer, uint16_t mhz) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + return rffc5071_set_frequency(mixer, mhz); +#endif +#ifdef RAD1O +#endif + +} + +void mixer_tx(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_tx(mixer); +#endif +#ifdef RAD1O +#endif + +} +void mixer_rx(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_rx(mixer); +#endif +#ifdef RAD1O +#endif + +} +void mixer_rxtx(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_rxtx(mixer); +#endif +#ifdef RAD1O +#endif + +} +void mixer_enable(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_enable(mixer); +#endif +#ifdef RAD1O +#endif + +} +void mixer_disable(mixer_driver_t* const mixer) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_disable(mixer); +#endif +#ifdef RAD1O +#endif +} + + +void mixer_set_gpo(mixer_driver_t* const mixer, uint8_t gpo) +{ +#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_set_gpo(mixer, gpo); +#endif +#ifdef RAD1O +#endif +} diff --git a/firmware/common/mixer.h b/firmware/common/mixer.h index c389848d..d844b2aa 100644 --- a/firmware/common/mixer.h +++ b/firmware/common/mixer.h @@ -23,23 +23,30 @@ #ifndef __MIXER_H #define __MIXER_H +#if (defined JAWBREAKER || defined HACKRF_ONE) +#include "rffc5071.h" +typedef rffc5071_driver_t mixer_driver_t; +#endif + +#ifdef RAD1O +#include "max2871.h" +typedef max2871_driver_t mixer_driver_t; +#endif + #include -// XXX -/* Initialize chip. Call _setup() externally, as it calls _init(). */ -//extern void mixer_init(void); -//extern void mixer_setup(void); +extern void mixer_pin_setup(mixer_driver_t* const mixer); +extern void mixer_setup(mixer_driver_t* const mixer); /* Set frequency (MHz). */ -//extern uint64_t mixer_set_frequency(uint16_t mhz); +extern uint64_t mixer_set_frequency(mixer_driver_t* const mixer, uint16_t mhz); /* Set up rx only, tx only, or full duplex. Chip should be disabled * before _tx, _rx, or _rxtx are called. */ -//extern void mixer_tx(void); -//extern void mixer_rx(void); -//extern void mixer_rxtx(void); -//extern void mixer_enable(void); -//extern void mixer_disable(void); - -//extern void mixer_set_gpo(uint8_t); +extern void mixer_tx(mixer_driver_t* const mixer); +extern void mixer_rx(mixer_driver_t* const mixer); +extern void mixer_rxtx(mixer_driver_t* const mixer); +extern void mixer_enable(mixer_driver_t* const mixer); +extern void mixer_disable(mixer_driver_t* const mixer); +extern void mixer_set_gpo(mixer_driver_t* const drv, uint8_t gpo); #endif // __MIXER_H diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 56cf9465..9ec79b17 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -29,9 +29,6 @@ #include "hackrf-ui.h" #include -#if (defined JAWBREAKER || defined HACKRF_ONE) -#include -#endif #include #include #include @@ -149,13 +146,13 @@ static void switchctrl_set_rad1o(rf_path_t* const rf_path, uint8_t ctrl) { */ 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) { - // TODO + // TODO } #endif } @@ -228,16 +225,16 @@ static void switchctrl_set_hackrf_one(rf_path_t* const rf_path, uint8_t ctrl) { gpio_set(rf_path->gpio_no_rx_amp_pwr); if (ctrl & SWITCHCTRL_ANT_PWR) { - rffc5071_set_gpo(&rffc5072, 0x00); /* turn on antenna power by clearing GPO1 */ + mixer_set_gpo(&mixer, 0x00); /* turn on antenna power by clearing GPO1 */ } else { - rffc5071_set_gpo(&rffc5072, 0x01); /* turn off antenna power by setting GPO1 */ + mixer_set_gpo(&mixer, 0x01); /* turn off antenna power by setting GPO1 */ } } #endif static void switchctrl_set(rf_path_t* const rf_path, const uint8_t gpo) { #ifdef JAWBREAKER - rffc5071_set_gpo(&rffc5072, gpo); + mixer_set_gpo(&mixer, gpo); #elif HACKRF_ONE switchctrl_set_hackrf_one(rf_path, gpo); #elif RAD1O diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 8eed7d22..1d58e9ea 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -59,9 +59,9 @@ else() endif() if(BOARD STREQUAL "RAD1O") - set(MIXER max2871) + set(MIXER max2871) else() - set(MIXER rffc5071) + set(MIXER rffc5071) endif() if(NOT DEFINED SRC_M0) @@ -110,10 +110,11 @@ macro(DeclareTargets) ${PATH_HACKRF_FIRMWARE_COMMON}/max2837_target.c ${PATH_HACKRF_FIRMWARE_COMMON}/max5864.c ${PATH_HACKRF_FIRMWARE_COMMON}/max5864_target.c + ${PATH_HACKRF_FIRMWARE_COMMON}/mixer.c ${PATH_HACKRF_FIRMWARE_COMMON}/${MIXER}.c + ${PATH_HACKRF_FIRMWARE_COMMON}/${MIXER}_spi.c ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_bus.c ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_lpc.c - ${PATH_HACKRF_FIRMWARE_COMMON}/${MIXER}_spi.c ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv.c ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv_target.c ${PATH_HACKRF_FIRMWARE_COMMON}/spi_bus.c diff --git a/firmware/hackrf_usb/usb_api_register.c b/firmware/hackrf_usb/usb_api_register.c index bf27bf68..0fd8bfc2 100644 --- a/firmware/hackrf_usb/usb_api_register.c +++ b/firmware/hackrf_usb/usb_api_register.c @@ -116,7 +116,7 @@ usb_request_status_t usb_vendor_request_write_rffc5071( { if( endpoint->setup.index < RFFC5071_NUM_REGS ) { - rffc5071_reg_write(&rffc5072, endpoint->setup.index, endpoint->setup.value); + rffc5071_reg_write(&mixer, endpoint->setup.index, endpoint->setup.value); usb_transfer_schedule_ack(endpoint->in); return USB_REQUEST_STATUS_OK; } @@ -135,7 +135,7 @@ usb_request_status_t usb_vendor_request_read_rffc5071( { if( endpoint->setup.index < RFFC5071_NUM_REGS ) { - value = rffc5071_reg_read(&rffc5072, endpoint->setup.index); + value = rffc5071_reg_read(&mixer, endpoint->setup.index); endpoint->buffer[0] = value & 0xff; endpoint->buffer[1] = value >> 8; usb_transfer_schedule_block(endpoint->in, &endpoint->buffer, 2, From fb2057cd094302e46fd34432b1699833666ed55c Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 27 Jan 2017 20:45:49 +0100 Subject: [PATCH 44/58] fix(rf_path): Port rad1o pin config --- firmware/common/hackrf_core.c | 44 +++++-- firmware/common/hackrf_core.h | 37 +----- firmware/common/rf_path.c | 213 ++++++++++++++++------------------ firmware/common/rf_path.h | 12 +- 4 files changed, 150 insertions(+), 156 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 63eed196..e683525d 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -81,9 +81,12 @@ static struct gpio_t gpio_rf_ldo_enable = GPIO(2, 9); #endif /* RF supply (VAA) control */ -#if (defined HACKRF_ONE || defined RAD1O) +#ifdef HACKRF_ONE static struct gpio_t gpio_vaa_disable = GPIO(2, 9); #endif +#ifdef RAD1O +static struct gpio_t gpio_vaa_enable = GPIO(2, 9); +#endif static struct gpio_t gpio_w25q80bv_hold = GPIO(1, 14); static struct gpio_t gpio_w25q80bv_wp = GPIO(1, 15); @@ -105,9 +108,18 @@ static struct gpio_t gpio_amp_bypass = GPIO(0, 14); static struct gpio_t gpio_rx_amp = GPIO(1, 11); static struct gpio_t gpio_no_rx_amp_pwr = GPIO(1, 12); #endif - -// XXX #ifdef RAD1O +static struct gpio_t gpio_tx_rx_n = GPIO(0, 11); +static struct gpio_t gpio_tx_rx = GPIO(0, 14); +static struct gpio_t gpio_by_mix = GPIO(1, 12); +static struct gpio_t gpio_by_mix_n = GPIO(2, 10); +static struct gpio_t gpio_by_amp = GPIO(1, 0); +static struct gpio_t gpio_by_amp_n = GPIO(5, 5); +static struct gpio_t gpio_mixer_en = GPIO(5, 16); +static struct gpio_t gpio_low_high_filt = GPIO(2, 11); +static struct gpio_t gpio_low_high_filt_n = GPIO(2, 12); +static struct gpio_t gpio_tx_amp = GPIO(2, 15); +static struct gpio_t gpio_rx_lna = GPIO(5, 15); #endif #if 0 @@ -276,6 +288,17 @@ rf_path_t rf_path = { .gpio_no_rx_amp_pwr = &gpio_no_rx_amp_pwr, #endif #ifdef RAD1O + .gpio_tx_rx_n = &gpio_tx_rx_n, + .gpio_tx_rx = &gpio_tx_rx, + .gpio_by_mix = &gpio_by_mix, + .gpio_by_mix_n = &gpio_by_mix_n, + .gpio_by_amp = &gpio_by_amp, + .gpio_by_amp_n = &gpio_by_amp_n, + .gpio_mixer_en = &gpio_mixer_en, + .gpio_low_high_filt = &gpio_low_high_filt, + .gpio_low_high_filt_n = &gpio_low_high_filt_n, + .gpio_tx_amp = &gpio_tx_amp, + .gpio_rx_lna = &gpio_rx_lna, #endif }; @@ -851,10 +874,13 @@ void pin_setup(void) { gpio_output(&gpio_led[0]); gpio_output(&gpio_led[1]); gpio_output(&gpio_led[2]); +#ifdef RAD1O + gpio_output(&gpio_led[3]); +#endif gpio_output(&gpio_1v8_enable); -#if (defined HACKRF_ONE || defined RAD1O) +#ifdef HACKRF_ONE /* Configure RF power supply (VAA) switch control signal as output */ gpio_output(&gpio_vaa_disable); @@ -863,7 +889,11 @@ void pin_setup(void) { #endif #ifdef RAD1O - gpio_output(&gpio_led[4]); + /* Configure RF power supply (VAA) switch control signal as output */ + gpio_output(&gpio_vaa_enable); + + /* Safe state: start with VAA turned off: */ + disable_rf_power(); #endif /* enable input on SCL and SDA pins */ @@ -901,11 +931,11 @@ void disable_rf_power(void) { #ifdef RAD1O void enable_rf_power(void) { - gpio_set(&gpio_vaa_disable); + gpio_set(&gpio_vaa_enable); } void disable_rf_power(void) { - gpio_clear(&gpio_vaa_disable); + gpio_clear(&gpio_vaa_enable); } #endif diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 627c2aab..a27f27c6 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -259,11 +259,7 @@ extern "C" #define SCU_PINMUX_GP_CLKIN (P4_7) -#ifdef RAD1O -#define PIN_LED4 (BIT26) /* GPIO5[26] on PB_6 */ -#define PORT_LED4 (GPIO5) /* PORT for LED4 */ -#endif - +#if 0 //XXX #ifdef RAD1O #define PIN_XCVR_RXHP (BIT1) /* GPIO4[1] on P8_1 */ #define PORT_XCVR_RXHP (GPIO4) @@ -283,46 +279,17 @@ extern "C" #define PORT_VCO_LE (GPIO2) #define PIN_VCO_MUX (BIT25) /* GPIO5[25] on PB_5 */ #define PORT_VCO_MUX (GPIO5) -#define PIN_MIXER_EN (BIT16) /* GPIO5[16] on P6_8 */ -#define PORT_MIXER_EN (GPIO5) #define PIN_SYNT_RFOUT_EN (BIT5) /* GPIO3[5] on P6_9 */ #define PORT_SYNT_RFOUT_EN (GPIO3) #endif -#ifdef RAD1O -#define PIN_VAA_ENABLE (BIT9) /* GPIO2[9] on P5_0 */ -#define PORT_VAA_ENABLE (GPIO2) /* PORT for VAA_ENABLE */ -#endif - -#ifdef RAD1O -#define PIN_BY_AMP (GPIOPIN0) /* GPIO1[0] on P1_7 */ -#define PORT_BY_AMP (GPIO1) -#define PIN_BY_AMP_N (GPIOPIN5) /* GPIO5[5] on P2_5 */ -#define PORT_BY_AMP_N (GPIO5) -#define PIN_TX_RX (GPIOPIN14) /* GPIO0[14] on P2_10 */ -#define PORT_TX_RX (GPIO0) -#define PIN_TX_RX_N (GPIOPIN11) /* GPIO1[11] on P2_11 */ -#define PORT_TX_RX_N (GPIO1) -#define PIN_BY_MIX (GPIOPIN12) /* GPIO1[12] on P2_12 */ -#define PORT_BY_MIX (GPIO1) -#define PIN_BY_MIX_N (GPIOPIN10) /* GPIO2[10] on P5_1 */ -#define PORT_BY_MIX_N (GPIO2) -#define PIN_LOW_HIGH_FILT (GPIOPIN11) /* GPIO2[11] on P5_2 */ -#define PORT_LOW_HIGH_FILT (GPIO2) -#define PIN_LOW_HIGH_FILT_N (GPIOPIN12) /* GPIO2[12] on P5_3 */ -#define PORT_LOW_HIGH_FILT_N (GPIO2) -#define PIN_TX_AMP (GPIOPIN15) /* GPIO2[15] on P5_6 */ -#define PORT_TX_AMP (GPIO2) -#define PIN_RX_LNA (GPIOPIN15) /* GPIO5[15] on P6_7 */ -#define PORT_RX_LNA (GPIO5) -#endif - #if (defined HACKRF_ONE || defined RAD1O) #define PIN_CPLD_TMS (GPIOPIN4) #define PORT_CPLD_TMS (GPIO3) #define PIN_CPLD_TDI (GPIOPIN1) #define PORT_CPLD_TDI (GPIO3) #endif +#endif typedef enum { TRANSCEIVER_MODE_OFF = 0, diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 9ec79b17..f4aa3ff4 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -87,78 +87,6 @@ uint8_t switchctrl = SWITCHCTRL_SAFE; */ #define SWITCHCTRL_ANT_PWR (1 << 6) /* turn on antenna port power */ -#ifdef RAD1O -static void switchctrl_set_rad1o(rf_path_t* const rf_path, uint8_t ctrl) { -#if 0 //XXX - if (ctrl & SWITCHCTRL_TX) { - gpio_set(PORT_TX_RX_N, PIN_TX_RX_N); - gpio_clear(PORT_TX_RX, PIN_TX_RX); - } else { - gpio_clear(PORT_TX_RX_N, PIN_TX_RX_N); - gpio_set(PORT_TX_RX, PIN_TX_RX); - } - - if (ctrl & SWITCHCTRL_MIX_BYPASS) { - gpio_clear(PORT_BY_MIX, PIN_BY_MIX); - gpio_set(PORT_BY_MIX_N, PIN_BY_MIX_N); - gpio_clear(PORT_MIXER_EN, PIN_MIXER_EN); - } else { - gpio_set(PORT_BY_MIX, PIN_BY_MIX); - gpio_clear(PORT_BY_MIX_N, PIN_BY_MIX_N); - gpio_set(PORT_MIXER_EN, PIN_MIXER_EN); - } - - if (ctrl & SWITCHCTRL_HP) { - 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_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_clear(PORT_BY_AMP, PIN_BY_AMP); - gpio_set(PORT_BY_AMP_N, PIN_BY_AMP_N); - - gpio_clear(PORT_TX_AMP, PIN_TX_AMP); - gpio_clear(PORT_RX_LNA, PIN_RX_LNA); - - } else if (ctrl & SWITCHCTRL_TX) { - gpio_set(PORT_BY_AMP, PIN_BY_AMP); - gpio_clear(PORT_BY_AMP_N, PIN_BY_AMP_N); - - gpio_set(PORT_TX_AMP, PIN_TX_AMP); - gpio_clear(PORT_RX_LNA, PIN_RX_LNA); - - } else { - gpio_set(PORT_BY_AMP, PIN_BY_AMP); - gpio_clear(PORT_BY_AMP_N, PIN_BY_AMP_N); - - gpio_clear(PORT_TX_AMP, PIN_TX_AMP); - gpio_set(PORT_RX_LNA, PIN_RX_LNA); - - } - - /* - * These normally shouldn't be set post-Jawbreaker, but they can be - * used to explicitly turn off power to the amplifiers while AMP_BYPASS - * is unset: - */ - 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) { - // TODO - } -#endif -} -#endif - - #ifdef HACKRF_ONE static void switchctrl_set_hackrf_one(rf_path_t* const rf_path, uint8_t ctrl) { if (ctrl & SWITCHCTRL_TX) { @@ -232,6 +160,74 @@ static void switchctrl_set_hackrf_one(rf_path_t* const rf_path, uint8_t ctrl) { } #endif +#ifdef RAD1O +static void switchctrl_set_rad1o(rf_path_t* const rf_path, uint8_t ctrl) { + if (ctrl & SWITCHCTRL_TX) { + gpio_set(rf_path->gpio_tx_rx_n); + gpio_clear(rf_path->gpio_tx_rx); + } else { + gpio_clear(rf_path->gpio_tx_rx_n); + gpio_set(rf_path->gpio_tx_rx); + } + + if (ctrl & SWITCHCTRL_MIX_BYPASS) { + gpio_clear(rf_path->gpio_by_mix); + gpio_set(rf_path->gpio_by_mix_n); + gpio_clear(rf_path->gpio_mixer_en); + } else { + gpio_set(rf_path->gpio_by_mix); + gpio_clear(rf_path->gpio_by_mix_n); + gpio_set(rf_path->gpio_mixer_en); + } + + if (ctrl & SWITCHCTRL_HP) { + gpio_set(rf_path->gpio_low_high_filt); + gpio_clear(rf_path->gpio_low_high_filt_n); + } else { + gpio_clear(rf_path->gpio_low_high_filt); + gpio_set(rf_path->gpio_low_high_filt_n); + } + + if (ctrl & SWITCHCTRL_AMP_BYPASS) { + gpio_clear(rf_path->gpio_by_amp); + gpio_set(rf_path->gpio_by_amp_n); + + gpio_clear(rf_path->gpio_tx_amp); + gpio_clear(rf_path->gpio_rx_lna); + + } else if (ctrl & SWITCHCTRL_TX) { + gpio_set(rf_path->gpio_by_amp); + gpio_clear(rf_path->gpio_by_amp_n); + + gpio_set(rf_path->gpio_tx_amp); + gpio_clear(rf_path->gpio_rx_lna); + + } else { + gpio_set(rf_path->gpio_by_amp); + gpio_clear(rf_path->gpio_by_amp_n); + + gpio_clear(rf_path->gpio_tx_amp); + gpio_set(rf_path->gpio_rx_lna); + } + + /* + * These normally shouldn't be set post-Jawbreaker, but they can be + * used to explicitly turn off power to the amplifiers while AMP_BYPASS + * is unset: + */ + if (ctrl & SWITCHCTRL_NO_TX_AMP_PWR) { + gpio_clear(rf_path->gpio_tx_amp); + } + if (ctrl & SWITCHCTRL_NO_RX_AMP_PWR) { + gpio_clear(rf_path->gpio_rx_lna); + } + + if (ctrl & SWITCHCTRL_ANT_PWR) { + // TODO + } +} +#endif + static void switchctrl_set(rf_path_t* const rf_path, const uint8_t gpo) { #ifdef JAWBREAKER mixer_set_gpo(&mixer, gpo); @@ -278,52 +274,44 @@ void rf_path_pin_setup(rf_path_t* const rf_path) { gpio_output(rf_path->gpio_tx); gpio_output(rf_path->gpio_mix_bypass); gpio_output(rf_path->gpio_rx); +#endif + +#ifdef RAD1O + /* 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); + scu_pinmux(SCU_MIXER_EN, 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 */ + gpio_output(rf_path->gpio_tx_rx_n); + gpio_output(rf_path->gpio_tx_rx); + gpio_output(rf_path->gpio_by_mix); + gpio_output(rf_path->gpio_by_mix_n); + gpio_output(rf_path->gpio_by_amp); + gpio_output(rf_path->gpio_by_amp_n); + gpio_output(rf_path->gpio_mixer_en); + gpio_output(rf_path->gpio_low_high_filt); + gpio_output(rf_path->gpio_low_high_filt_n); + gpio_output(rf_path->gpio_tx_amp); + gpio_output(rf_path->gpio_rx_lna); +#endif /* * Safe (initial) switch settings turn off both amplifiers and antenna port * power and enable both amp bypass and mixer bypass. */ switchctrl_set(rf_path, SWITCHCTRL_AMP_BYPASS | SWITCHCTRL_MIX_BYPASS); -#endif - -#ifdef RAD1O -#if 0 //XXX - /* 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); - scu_pinmux(SCU_MIXER_EN, 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; - GPIO_DIR(PORT_MIXER_EN) |= PIN_MIXER_EN; - - /* - * 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 -#endif } void rf_path_init(rf_path_t* const rf_path) { @@ -335,7 +323,6 @@ void rf_path_init(rf_path_t* const rf_path) { max2837_setup(&max2837); max2837_start(&max2837); - //XXX mixer_setup(&mixer); switchctrl_set(rf_path, switchctrl); } diff --git a/firmware/common/rf_path.h b/firmware/common/rf_path.h index dd24026e..e12a8c10 100644 --- a/firmware/common/rf_path.h +++ b/firmware/common/rf_path.h @@ -56,8 +56,18 @@ typedef struct rf_path_t { gpio_t gpio_rx_amp; gpio_t gpio_no_rx_amp_pwr; #endif -/// XXX #ifdef RAD1O + gpio_t gpio_tx_rx_n; + gpio_t gpio_tx_rx; + gpio_t gpio_by_mix; + gpio_t gpio_by_mix_n; + gpio_t gpio_by_amp; + gpio_t gpio_by_amp_n; + gpio_t gpio_mixer_en; + gpio_t gpio_low_high_filt; + gpio_t gpio_low_high_filt_n; + gpio_t gpio_tx_amp; + gpio_t gpio_rx_lna; #endif } rf_path_t; From f063f87c49741ce3583b72642830a6908596547b Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 27 Jan 2017 20:51:44 +0100 Subject: [PATCH 45/58] fix(sgpio): Update rad1o update_q_invert gpio access --- firmware/common/sgpio.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/firmware/common/sgpio.c b/firmware/common/sgpio.c index 6326c66f..f57b7b56 100644 --- a/firmware/common/sgpio.c +++ b/firmware/common/sgpio.c @@ -28,7 +28,7 @@ #include #ifdef RAD1O -static void update_q_invert(void); +static void update_q_invert(sgpio_config_t* const config); #endif void sgpio_configure_pin_functions(sgpio_config_t* const config) { @@ -95,7 +95,7 @@ void sgpio_configure( #ifdef RAD1O // The data direction might have changed. Check if we need to // adjust the q inversion. - update_q_invert(); + update_q_invert(config); #endif // Enable SGPIO pin outputs. @@ -291,22 +291,20 @@ static bool sgpio_invert = false; * Called when TX/RX changes od sgpio_cpld_stream_rx_set_q_invert * gets called. */ -static void update_q_invert(void) { -#if 0 //XXX +static void update_q_invert(sgpio_config_t* const config) { /* 1=Output SGPIO11 High(TX mode), 0=Output SGPIO11 Low(RX mode)*/ bool tx_mode = (SGPIO_GPIO_OUTREG & (1 << 11)) > 0; // 0.13: P1_18 if( !sgpio_invert & !tx_mode) { - GPIO_SET(GPIO0) = GPIOPIN13; + gpio_write(config->gpio_rx_q_invert, 1); } else if( !sgpio_invert & tx_mode) { - GPIO_CLR(GPIO0) = GPIOPIN13; + gpio_write(config->gpio_rx_q_invert, 0); } else if( sgpio_invert & !tx_mode) { - GPIO_CLR(GPIO0) = GPIOPIN13; + gpio_write(config->gpio_rx_q_invert, 0); } else if( sgpio_invert & tx_mode) { - GPIO_SET(GPIO0) = GPIOPIN13; + gpio_write(config->gpio_rx_q_invert, 1); } -#endif } void sgpio_cpld_stream_rx_set_q_invert(sgpio_config_t* const config, const uint_fast8_t invert) { @@ -316,7 +314,7 @@ void sgpio_cpld_stream_rx_set_q_invert(sgpio_config_t* const config, const uint_ sgpio_invert = false; } - update_q_invert(); + update_q_invert(config); } #else From 566c9ad4bd1e4ebd4b61f1fe783edc6088a97a44 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 27 Jan 2017 21:41:24 +0100 Subject: [PATCH 46/58] feat(mixer): Full MAX2871 integration for rad1o --- firmware/common/hackrf_core.c | 2 +- firmware/common/hackrf_core.h | 15 ----- firmware/common/max2871.c | 105 +++++++++++++--------------------- firmware/common/max2871.h | 16 +++--- firmware/common/mixer.c | 82 +++++++++++++++----------- firmware/common/mixer.h | 2 +- 6 files changed, 100 insertions(+), 122 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index e683525d..3d326ced 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -901,7 +901,7 @@ void pin_setup(void) { spi_bus_start(&spi_bus_ssp1, &ssp_config_max2837); - mixer_pin_setup(&mixer); + mixer_bus_setup(&mixer); rf_path_pin_setup(&rf_path); diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index a27f27c6..23a8526b 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -268,21 +268,6 @@ extern "C" #define PORT_XCVR_B (GPIO4) #endif -#ifdef RAD1O -#define PIN_VCO_CE (BIT13) /* GPIO2[13] on P5_4 */ -#define PORT_VCO_CE (GPIO2) -#define PIN_VCO_SCLK (BIT6) /* GPIO5[6] on P2_6 */ -#define PORT_VCO_SCLK (GPIO5) -#define PIN_VCO_SDATA (BIT3) /* GPIO3[3] on P6_4 */ -#define PORT_VCO_SDATA (GPIO3) -#define PIN_VCO_LE (BIT14) /* GPIO2[14] on P5_5 */ -#define PORT_VCO_LE (GPIO2) -#define PIN_VCO_MUX (BIT25) /* GPIO5[25] on PB_5 */ -#define PORT_VCO_MUX (GPIO5) -#define PIN_SYNT_RFOUT_EN (BIT5) /* GPIO3[5] on P6_9 */ -#define PORT_SYNT_RFOUT_EN (GPIO3) -#endif - #if (defined HACKRF_ONE || defined RAD1O) #define PIN_CPLD_TMS (GPIOPIN4) #define PORT_CPLD_TMS (GPIO3) diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index 799b8b4c..fbdb5852 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -9,20 +9,18 @@ #define LOG(x,...) #include #include -//#include #include "hackrf_core.h" #endif #include #include -static void max2871_spi_write(uint8_t r, uint32_t v); -static void max2871_write_registers(void); +static void max2871_spi_write(max2871_driver_t* const drv, uint8_t r, uint32_t v); +static void max2871_write_registers(max2871_driver_t* const drv); static void delay_ms(int ms); void max2871_setup(max2871_driver_t* const drv) { -#if 0 //XXX /* Configure GPIO pins. */ scu_pinmux(SCU_VCO_CE, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); @@ -33,26 +31,26 @@ void max2871_setup(max2871_driver_t* const drv) scu_pinmux(SCU_SYNT_RFOUT_EN, SCU_GPIO_FAST); /* Set GPIO pins as outputs. */ - GPIO_DIR(PORT_VCO_CE) |= PIN_VCO_CE; - GPIO_DIR(PORT_VCO_SCLK) |= PIN_VCO_SCLK; - GPIO_DIR(PORT_VCO_SDATA) |= PIN_VCO_SDATA; - GPIO_DIR(PORT_VCO_LE) |= PIN_VCO_LE; - GPIO_DIR(PORT_SYNT_RFOUT_EN) |= PIN_SYNT_RFOUT_EN; + gpio_output(drv->gpio_vco_ce); + gpio_output(drv->gpio_vco_sclk); + gpio_output(drv->gpio_vco_sdata); + gpio_output(drv->gpio_vco_le); + gpio_output(drv->gpio_synt_rfout_en); /* MUX is an input */ - GPIO_DIR(PORT_VCO_MUX) &= ~(PIN_VCO_MUX); + gpio_input(drv->gpio_vco_mux); /* set to known state */ - gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ - gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); - gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); - gpio_set(PORT_VCO_LE, PIN_VCO_LE); /* active low */ - gpio_set(PORT_SYNT_RFOUT_EN, PIN_SYNT_RFOUT_EN); /* active high */ + gpio_set(drv->gpio_vco_ce); /* active high */ + gpio_clear(drv->gpio_vco_sclk); + gpio_clear(drv->gpio_vco_sdata); + gpio_set(drv->gpio_vco_le); /* active low */ + gpio_set(drv->gpio_synt_rfout_en); /* active high */ max2871_regs_init(); int i; for(i = 5; i >= 0; i--) { - max2871_spi_write(i, max2871_get_register(i)); + max2871_spi_write(drv, i, max2871_get_register(i)); delay_ms(20); } @@ -103,10 +101,9 @@ void max2871_setup(max2871_driver_t* const drv) max2871_set_ADCS(0); max2871_set_ADCM(0); - max2871_write_registers(); + max2871_write_registers(drv); - max2871_set_frequency(3500); -#endif + max2871_set_frequency(drv, 3500); } static void delay_ms(int ms) @@ -135,9 +132,7 @@ static void serial_delay(void) * First 29 bits are data * Last 3 bits are register number */ -static void max2871_spi_write(uint8_t r, uint32_t v) { - -#if 0 //XXX +static void max2871_spi_write(max2871_driver_t* const drv, uint8_t r, uint32_t v) { #if DEBUG LOG("0x%04x -> reg%d\n", v, r); #else @@ -147,65 +142,62 @@ static void max2871_spi_write(uint8_t r, uint32_t v) { uint32_t data = v | r; /* make sure everything is starting in the correct state */ - gpio_set(PORT_VCO_LE, PIN_VCO_LE); - gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); - gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); + gpio_set(drv->gpio_vco_le); + gpio_clear(drv->gpio_vco_sclk); + gpio_clear(drv->gpio_vco_sdata); /* start transaction by bringing LE low */ - gpio_clear(PORT_VCO_LE, PIN_VCO_LE); + gpio_clear(drv->gpio_vco_le); while (bits--) { if (data & msb) - gpio_set(PORT_VCO_SDATA, PIN_VCO_SDATA); + gpio_set(drv->gpio_vco_sdata); else - gpio_clear(PORT_VCO_SDATA, PIN_VCO_SDATA); + gpio_clear(drv->gpio_vco_sdata); data <<= 1; serial_delay(); - gpio_set(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_set(drv->gpio_vco_sclk); serial_delay(); - gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_clear(drv->gpio_vco_sclk); } - gpio_set(PORT_VCO_LE, PIN_VCO_LE); -#endif + gpio_set(drv->gpio_vco_le); #endif } -static uint32_t max2871_spi_read(void) +static uint32_t max2871_spi_read(max2871_driver_t* const drv) { -#if 0 //XXX uint32_t bits = 32; uint32_t data = 0; - max2871_spi_write(0x06, 0x0); + max2871_spi_write(drv, 0x06, 0x0); serial_delay(); - gpio_set(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_set(drv->gpio_vco_sclk); serial_delay(); - gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_clear(drv->gpio_vco_sclk); serial_delay(); while (bits--) { - gpio_set(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_set(drv->gpio_vco_sclk); serial_delay(); - gpio_clear(PORT_VCO_SCLK, PIN_VCO_SCLK); + gpio_clear(drv->gpio_vco_sclk); serial_delay(); data <<= 1; - data |= GPIO_STATE(PORT_VCO_MUX, PIN_VCO_MUX) ? 1 : 0; + data |= gpio_read(drv->gpio_vco_mux) ? 1 : 0; } return data; -#endif } -static void max2871_write_registers(void) +static void max2871_write_registers(max2871_driver_t* const drv) { int i; for(i = 5; i >= 0; i--) { - max2871_spi_write(i, max2871_get_register(i)); + max2871_spi_write(drv, i, max2871_get_register(i)); } } @@ -221,41 +213,26 @@ uint64_t max2871_set_frequency(max2871_driver_t* const drv, uint16_t mhz) } max2871_set_RFA_EN(0); - max2871_write_registers(); + max2871_write_registers(drv); max2871_set_N(n); max2871_set_DIVA(diva); - max2871_write_registers(); + max2871_write_registers(drv); - while(max2871_spi_read() & MAX2871_VASA); + while(max2871_spi_read(drv) & MAX2871_VASA); max2871_set_RFA_EN(1); - max2871_write_registers(); + max2871_write_registers(drv); return (mhz/40)*40 * 1000000; } -void max2871_tx(max2871_driver_t* const drv) -{} -void max2871_rx(max2871_driver_t* const drv) -{} -void max2871_rxtx(max2871_driver_t* const drv) -{} void max2871_enable(max2871_driver_t* const drv) { -#if 0 //XXX - gpio_set(PORT_VCO_CE, PIN_VCO_CE); /* active high */ -#endif + gpio_set(drv->gpio_vco_ce); } void max2871_disable(max2871_driver_t* const drv) { -#if 0 //XXX - gpio_clear(PORT_VCO_CE, PIN_VCO_CE); /* active high */ -#endif -} -void max2871_set_gpo(max2871_driver_t* const drv, uint8_t gpo) -{ - (void) gpo; + gpio_clear(drv->gpio_vco_ce); } - diff --git a/firmware/common/max2871.h b/firmware/common/max2871.h index 3b5af5df..f84f5309 100644 --- a/firmware/common/max2871.h +++ b/firmware/common/max2871.h @@ -1,21 +1,21 @@ #ifndef MAX2871_H #define MAX2871_H +#include "gpio.h" + #include typedef struct { - //spi_bus_t* const bus; - //gpio_t gpio_reset; - uint16_t regs[1]; - uint32_t regs_dirty; + gpio_t gpio_vco_ce; + gpio_t gpio_vco_sclk; + gpio_t gpio_vco_sdata; + gpio_t gpio_vco_le; + gpio_t gpio_synt_rfout_en; + gpio_t gpio_vco_mux; } max2871_driver_t; extern void max2871_setup(max2871_driver_t* const drv); extern uint64_t max2871_set_frequency(max2871_driver_t* const drv, uint16_t mhz); -extern void max2871_tx(max2871_driver_t* const drv); -extern void max2871_rx(max2871_driver_t* const drv); -extern void max2871_rxtx(max2871_driver_t* const drv); extern void max2871_enable(max2871_driver_t* const drv); extern void max2871_disable(max2871_driver_t* const drv); -extern void max2871_set_gpo(max2871_driver_t* const drv, uint8_t gpo); #endif diff --git a/firmware/common/mixer.c b/firmware/common/mixer.c index 6f6ccd96..ac48386f 100644 --- a/firmware/common/mixer.c +++ b/firmware/common/mixer.c @@ -5,18 +5,20 @@ #include "gpio_lpc.h" /* RFFC5071 GPIO serial interface PinMux */ -#ifdef JELLYBEAN -static struct gpio_t gpio_rffc5072_select = GPIO(3, 8); -static struct gpio_t gpio_rffc5072_clock = GPIO(3, 9); -static struct gpio_t gpio_rffc5072_data = GPIO(3, 10); -static struct gpio_t gpio_rffc5072_reset = GPIO(3, 11); -#endif #if (defined JAWBREAKER || defined HACKRF_ONE) static struct gpio_t gpio_rffc5072_select = GPIO(2, 13); static struct gpio_t gpio_rffc5072_clock = GPIO(5, 6); static struct gpio_t gpio_rffc5072_data = GPIO(3, 3); static struct gpio_t gpio_rffc5072_reset = GPIO(2, 14); #endif +#ifdef RAD1O +static struct gpio_t gpio_vco_ce = GPIO(2, 13); +static struct gpio_t gpio_vco_sclk = GPIO(5, 6); +static struct gpio_t gpio_vco_sdata = GPIO(3, 3); +static struct gpio_t gpio_vco_le = GPIO(2, 14); +static struct gpio_t gpio_synt_rfout_en = GPIO(5, 25); +static struct gpio_t gpio_vco_mux = GPIO(3, 5); +#endif #if (defined JAWBREAKER || defined HACKRF_ONE) const rffc5071_spi_config_t rffc5071_spi_config = { @@ -39,90 +41,104 @@ mixer_driver_t mixer = { }; #endif #ifdef RAD1O -mixer_driver_t mixer; +mixer_driver_t mixer = { + .gpio_vco_ce = &gpio_vco_ce, + .gpio_vco_sclk = &gpio_vco_sclk, + .gpio_vco_sdata = &gpio_vco_sdata, + .gpio_vco_le = &gpio_vco_le, + .gpio_synt_rfout_en = &gpio_synt_rfout_en, + .gpio_vco_mux = &gpio_vco_mux, +}; #endif -void mixer_pin_setup(mixer_driver_t* const mixer) +void mixer_bus_setup(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - (void) mixer; +#if (defined JAWBREAKER || defined HACKRF_ONE) + (void) mixer; spi_bus_start(&spi_bus_rffc5071, &rffc5071_spi_config); #endif #ifdef RAD1O + (void) mixer; #endif } void mixer_setup(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_setup(mixer); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_setup(mixer); #endif #ifdef RAD1O + max2871_setup(mixer); #endif - } uint64_t mixer_set_frequency(mixer_driver_t* const mixer, uint16_t mhz) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - return rffc5071_set_frequency(mixer, mhz); +#if (defined JAWBREAKER || defined HACKRF_ONE) + return rffc5071_set_frequency(mixer, mhz); #endif #ifdef RAD1O + return max2871_set_frequency(mixer, mhz); #endif - } void mixer_tx(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_tx(mixer); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_tx(mixer); #endif #ifdef RAD1O + (void) mixer; #endif - } + void mixer_rx(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_rx(mixer); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_rx(mixer); #endif #ifdef RAD1O + (void) mixer; #endif - } + void mixer_rxtx(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_rxtx(mixer); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_rxtx(mixer); #endif #ifdef RAD1O + (void) mixer; #endif - } + void mixer_enable(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_enable(mixer); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_enable(mixer); #endif #ifdef RAD1O + (void) mixer; #endif - } + void mixer_disable(mixer_driver_t* const mixer) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_disable(mixer); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_disable(mixer); #endif #ifdef RAD1O + (void) mixer; #endif } - void mixer_set_gpo(mixer_driver_t* const mixer, uint8_t gpo) { -#if (defined JELLYBEAN || defined JAWBREAKER || defined HACKRF_ONE) - rffc5071_set_gpo(mixer, gpo); +#if (defined JAWBREAKER || defined HACKRF_ONE) + rffc5071_set_gpo(mixer, gpo); #endif #ifdef RAD1O + (void) mixer; + (void) gpo; #endif } diff --git a/firmware/common/mixer.h b/firmware/common/mixer.h index d844b2aa..cf46e7c5 100644 --- a/firmware/common/mixer.h +++ b/firmware/common/mixer.h @@ -34,7 +34,7 @@ typedef max2871_driver_t mixer_driver_t; #endif #include -extern void mixer_pin_setup(mixer_driver_t* const mixer); +extern void mixer_bus_setup(mixer_driver_t* const mixer); extern void mixer_setup(mixer_driver_t* const mixer); /* Set frequency (MHz). */ From 9d8890ae6275120f76338ac6733afd9aaa2f5cd7 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 27 Jan 2017 21:42:48 +0100 Subject: [PATCH 47/58] fix(rad1o): gpio cleanup --- firmware/common/hackrf_core.c | 2 +- firmware/common/hackrf_core.h | 21 +-------------------- firmware/common/si5351c.c | 1 + 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 3d326ced..ed398314 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -134,7 +134,7 @@ static struct gpio_t gpio_boot[] = { /* CPLD JTAG interface GPIO pins */ static struct gpio_t gpio_cpld_tdo = GPIO(5, 18); static struct gpio_t gpio_cpld_tck = GPIO(3, 0); -#ifdef HACKRF_ONE +#if defined HACKRF_ONE || defined RAD1O static struct gpio_t gpio_cpld_tms = GPIO(3, 4); static struct gpio_t gpio_cpld_tdi = GPIO(3, 1); #else diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 23a8526b..f0cb92c0 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -142,7 +142,6 @@ extern "C" #define SCU_XCVR_B6 (P5_5) /* GPIO2[14] on P5_5 */ #define SCU_XCVR_B7 (P5_6) /* GPIO2[15] on P5_6 */ #endif - #ifdef RAD1O #define SCU_XCVR_RXHP (P8_1) /* GPIO[] on P8_1 */ #define SCU_XCVR_B6 (P8_2) /* GPIO[] on P8_2 */ @@ -189,7 +188,6 @@ extern "C" #ifdef HACKRF_ONE #define SCU_NO_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ #endif - #ifdef RAD1O #define SCU_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */ #endif @@ -219,7 +217,6 @@ extern "C" #define SCU_RX_AMP (P2_11) /* GPIO1[11] on P2_11 */ #define SCU_NO_RX_AMP_PWR (P2_12) /* GPIO1[12] on P2_12 */ #endif - #ifdef RAD1O #define SCU_BY_AMP (P1_7) /* GPIO1[0] on P1_7 */ #define SCU_BY_AMP_N (P2_5) /* GPIO5[5] on P2_5 */ @@ -259,23 +256,6 @@ extern "C" #define SCU_PINMUX_GP_CLKIN (P4_7) -#if 0 //XXX -#ifdef RAD1O -#define PIN_XCVR_RXHP (BIT1) /* GPIO4[1] on P8_1 */ -#define PORT_XCVR_RXHP (GPIO4) -#define PIN_XCVR_B6 (BIT2) /* GPIO4[2] on P8_2 */ -#define PIN_XCVR_B7 (BIT3) /* GPIO4[3] on P8_3 */ -#define PORT_XCVR_B (GPIO4) -#endif - -#if (defined HACKRF_ONE || defined RAD1O) -#define PIN_CPLD_TMS (GPIOPIN4) -#define PORT_CPLD_TMS (GPIO3) -#define PIN_CPLD_TDI (GPIOPIN1) -#define PORT_CPLD_TDI (GPIO3) -#endif -#endif - typedef enum { TRANSCEIVER_MODE_OFF = 0, TRANSCEIVER_MODE_RX = 1, @@ -324,6 +304,7 @@ typedef enum { LED1 = 0, LED2 = 1, LED3 = 2, + LED4 = 3, } led_t; void led_on(const led_t led); diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index f5fc6d98..a64a7cdd 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -246,6 +246,7 @@ void si5351c_configure_clock_control(si5351c_driver_t* const drv, const enum pll #ifdef RAD1O void si5351c_configure_clock_control(si5351c_driver_t* const drv, const enum pll_sources source) { + (void) source; uint8_t pll; /* PLLA on XTAL */ From d03a05f3d5678c0a9c2f1ae0890081d37736d083 Mon Sep 17 00:00:00 2001 From: schneider Date: Sat, 28 Jan 2017 16:42:45 +0100 Subject: [PATCH 48/58] chore(Makefile): Remove obsolete RUN_FROM option --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index fe55cc56..43fce4d9 100644 --- a/Makefile +++ b/Makefile @@ -20,13 +20,13 @@ lib: firmware/libopencm3/README firmware/libopencm3/lib/libopencm3_lpc43xx.a FDIR=firmware/hackrf_usb/build -hackrf-usb: $(FDIR)/hackrf_usb.bin +hackrf-usb: $(FDIR)/hackrf_usb.dfu -$(FDIR)/hackrf_usb.bin: $(FDIR) $(FDIR)/Makefile $(FORCE) +$(FDIR)/hackrf_usb.dfu: $(FDIR) $(FDIR)/Makefile $(FORCE) $(MAKE) -C $(FDIR) $(FDIR)/Makefile: - cd $(FDIR) && cmake -DBOARD=RAD1O -DRUN_FROM=RAM .. + cd $(FDIR) && cmake -DBOARD=RAD1O .. $(FDIR): mkdir $(FDIR) From 202f2ecf54ea9c5df77b25a79d0dc2ff934fbe3c Mon Sep 17 00:00:00 2001 From: schneider Date: Sat, 28 Jan 2017 22:31:00 +0100 Subject: [PATCH 49/58] fix(mixer): Use correct pins for MAX2871 --- firmware/common/mixer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/common/mixer.c b/firmware/common/mixer.c index ac48386f..93467327 100644 --- a/firmware/common/mixer.c +++ b/firmware/common/mixer.c @@ -16,8 +16,8 @@ static struct gpio_t gpio_vco_ce = GPIO(2, 13); static struct gpio_t gpio_vco_sclk = GPIO(5, 6); static struct gpio_t gpio_vco_sdata = GPIO(3, 3); static struct gpio_t gpio_vco_le = GPIO(2, 14); -static struct gpio_t gpio_synt_rfout_en = GPIO(5, 25); -static struct gpio_t gpio_vco_mux = GPIO(3, 5); +static struct gpio_t gpio_vco_mux = GPIO(5, 25); +static struct gpio_t gpio_synt_rfout_en = GPIO(3, 5); #endif #if (defined JAWBREAKER || defined HACKRF_ONE) From f96ea4b8c2fc437f559b84b0f95cf364f97835cf Mon Sep 17 00:00:00 2001 From: schneider Date: Sat, 28 Jan 2017 22:32:27 +0100 Subject: [PATCH 50/58] change(usb): Make usb_phy_enable() non static --- firmware/common/usb.c | 2 +- firmware/common/usb.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/common/usb.c b/firmware/common/usb.c index 3444e1c2..fb7b2547 100644 --- a/firmware/common/usb.c +++ b/firmware/common/usb.c @@ -72,7 +72,7 @@ void usb_peripheral_reset() { while( (RESET_ACTIVE_STATUS0 & RESET_CTRL0_USB0_RST) == 0 ); } -static void usb_phy_enable() { +void usb_phy_enable() { CREG_CREG0 &= ~CREG_CREG0_USB0PHY; } diff --git a/firmware/common/usb.h b/firmware/common/usb.h index a6fa6a92..aa21beb2 100644 --- a/firmware/common/usb.h +++ b/firmware/common/usb.h @@ -29,6 +29,7 @@ #include "usb_type.h" void usb_peripheral_reset(); +void usb_phy_enable(); void usb_device_init( const uint_fast8_t device_ordinal, From 07f800d57aea284c79688602ad11e55c6b3c9aae Mon Sep 17 00:00:00 2001 From: schneider Date: Sun, 29 Jan 2017 22:54:44 +0100 Subject: [PATCH 51/58] fix(dfu): Use original HackRF DFU tools --- firmware/README | 6 ++-- firmware/hackrf-common.cmake | 11 ++++-- firmware/tools/make-dfu.py | 70 ------------------------------------ 3 files changed, 12 insertions(+), 75 deletions(-) delete mode 100755 firmware/tools/make-dfu.py diff --git a/firmware/README b/firmware/README index 45b5aae5..29f2746d 100644 --- a/firmware/README +++ b/firmware/README @@ -27,10 +27,12 @@ To build and install a standard firmware image for HackRF One: $ cd hackrf_usb $ mkdir build $ cd build -$ cmake .. -DBOARD=RAD1O +$ cmake .. -DBOARD=HACKRF_ONE $ make $ hackrf_spiflash -w hackrf_usb.bin +If you have a Jawbreaker, use -DBOARD=JAWBREAKER instead. +If you have a rad1o, use -DBOARD=RAD1O instead. For loading firmware into RAM with DFU you will also need: @@ -43,4 +45,4 @@ after the 3V3 LED illuminates. A .dfu file is built by default when building firmware. Alternatively you can load a known good .dfu file from a release package with: -$ dfu-util --device 1fc9:000c --alt 0 --download hackrf_usb_ram.dfu +$ dfu-util --device 1fc9:000c --alt 0 --download hackrf_usb.dfu diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 1d58e9ea..667d2dd3 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -196,9 +196,14 @@ macro(DeclareTargets) ) add_custom_target( - ${PROJECT_NAME}.dfu ALL - DEPENDS ${PROJECT_NAME}.bin - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../tools/make-dfu.py ${PROJECT_NAME}.bin ${PROJECT_NAME}.dfu + ${PROJECT_NAME}.dfu ${DFU_ALL} + DEPENDS ${PROJECT_NAME}_dfu.bin + COMMAND rm -f _tmp.dfu _header.bin + COMMAND cp ${PROJECT_NAME}_dfu.bin _tmp.dfu + COMMAND ${DFU_COMMAND} + COMMAND python ../../dfu.py ${PROJECT_NAME} + COMMAND cat _header.bin _tmp.dfu >${PROJECT_NAME}.dfu + COMMAND rm -f _tmp.dfu _header.bin ) add_custom_target( diff --git a/firmware/tools/make-dfu.py b/firmware/tools/make-dfu.py deleted file mode 100755 index 81e1540e..00000000 --- a/firmware/tools/make-dfu.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python2 -# vim: set ts=4 sw=4 tw=0 et pm=: -import struct -import sys -import os.path -import getopt -import zlib - -options, remainder = getopt.getopt(sys.argv[1:], 'p:v:d:S:v', ['pid=', - 'vid=', - 'did=', - 'spec=', - 'verbose', - ]) - -pid = 0x000c -vid = 0x1fc9 -did = 0 -spec = 0x0100 -verbose = False - -for opt, arg in options: - if opt in ('-p', '--pid'): - pid = int(arg) - if opt in ('-v', '--vid'): - vid = int(arg) - if opt in ('-d', '--did'): - did = int(arg) - if opt in ('-S', '--spec'): - spec = int(arg) - elif opt in ('-v', '--verbose'): - verbose = True - -if len(remainder)<1: - in_file = "/dev/stdin" -else: - in_file = remainder[0] - -if len(remainder)<2: - out = open("/dev/stdout","wb") -else: - out = open(remainder[1],"wb") - -# ref. NXP UM10503 Table 24 (Boot image header description) -header = "" -header += struct.pack (' Date: Sun, 29 Jan 2017 22:58:19 +0100 Subject: [PATCH 52/58] fix(hackrf_transfer): Fix missed merge conflict --- host/hackrf-tools/src/hackrf_transfer.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index 9b668293..a36166c6 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -402,7 +402,6 @@ int rx_callback(hackrf_transfer* transfer) { return 0; } } - } } else { return -1; } @@ -1093,7 +1092,6 @@ int main(int argc, char** argv) { break; } } - } } result = hackrf_is_streaming(device); From 7526723f50a83a390f51532041289f50eb66d8a6 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 3 Feb 2017 19:25:57 +0100 Subject: [PATCH 53/58] fix(cmake): Add max2871_regs.c to the build --- firmware/common/max2871.c | 3 +-- firmware/common/max2871_spi.c | 0 firmware/hackrf-common.cmake | 22 ++++++++++++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) delete mode 100644 firmware/common/max2871_spi.c diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index fbdb5852..b67da1a7 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -1,6 +1,5 @@ #include "max2871.h" -// TODO: put max2871_regs.c into the build system -#include "max2871_regs.c" +#include "max2871_regs.h" #if (defined DEBUG) #include diff --git a/firmware/common/max2871_spi.c b/firmware/common/max2871_spi.c deleted file mode 100644 index e69de29b..00000000 diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 667d2dd3..177da4d3 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -58,12 +58,6 @@ else() set(MCU_PARTNO LPC4330) endif() -if(BOARD STREQUAL "RAD1O") - set(MIXER max2871) -else() - set(MIXER rffc5071) -endif() - if(NOT DEFINED SRC_M0) set(SRC_M0 "${PATH_HACKRF_FIRMWARE_COMMON}/m0_sleep.c") endif() @@ -111,8 +105,6 @@ macro(DeclareTargets) ${PATH_HACKRF_FIRMWARE_COMMON}/max5864.c ${PATH_HACKRF_FIRMWARE_COMMON}/max5864_target.c ${PATH_HACKRF_FIRMWARE_COMMON}/mixer.c - ${PATH_HACKRF_FIRMWARE_COMMON}/${MIXER}.c - ${PATH_HACKRF_FIRMWARE_COMMON}/${MIXER}_spi.c ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_bus.c ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_lpc.c ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv.c @@ -122,6 +114,20 @@ macro(DeclareTargets) ${PATH_HACKRF_FIRMWARE_COMMON}/gpio_lpc.c ) + if(BOARD STREQUAL "RAD1O") + SET(SRC_M4 + ${SRC_M4} + ${PATH_HACKRF_FIRMWARE_COMMON}/max2871.c + ${PATH_HACKRF_FIRMWARE_COMMON}/max2871_regs.c + ) + else() + SET(SRC_M4 + ${SRC_M4} + ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071.c + ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071_spi.c + ) + endif() + configure_file( ${PATH_HACKRF_FIRMWARE_COMMON}/m0_bin.s.cmake m0_bin.s From c0c0fab3683af979ecd33c8f132dbd6954567b43 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 3 Feb 2017 19:27:19 +0100 Subject: [PATCH 54/58] chore(rad1o): White space fixes and cleanup --- Makefile | 2 +- firmware/common/hackrf_core.c | 7 +- firmware/common/hackrf_core.h | 6 +- firmware/common/max2871.c | 183 +++++++++++++++---------------- firmware/common/rf_path.c | 4 - firmware/common/sgpio.c | 17 ++- firmware/common/si5351c.c | 6 +- firmware/hackrf_usb/hackrf_usb.c | 6 +- 8 files changed, 111 insertions(+), 120 deletions(-) diff --git a/Makefile b/Makefile index 43fce4d9..fda643e9 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ $(FDIR)/hackrf_usb.dfu: $(FDIR) $(FDIR)/Makefile $(FORCE) $(FDIR)/Makefile: cd $(FDIR) && cmake -DBOARD=RAD1O .. - + $(FDIR): mkdir $(FDIR) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index a6b8432a..e8476400 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -625,8 +625,7 @@ void cpu_clock_init(void) #endif #ifdef RAD1O - /* - * rad1o clocks: + /* rad1o clocks: * CLK0 -> MAX5864/CPLD * CLK1 -> CPLD * CLK2 -> SGPIO @@ -634,8 +633,7 @@ void cpu_clock_init(void) * CLK4 -> MAX2837 * CLK5 -> MAX2871 * CLK6 -> none - * CLK7 -> LPC4330 (but LPC4330 starts up on its own crystal) - */ + * CLK7 -> LPC4330 (but LPC4330 starts up on its own crystal) */ /* MS3/CLK3 is the source for the external clock output. */ si5351c_configure_multisynth(&clock_gen, 3, 80*128-512, 0, 1, 0); /* 800/80 = 10MHz */ @@ -655,7 +653,6 @@ void cpu_clock_init(void) /* Set to 10 MHz, the common rate between Jellybean and Jawbreaker. */ sample_rate_set(10000000); - //sample_rate_set(8000000); si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); // soft reset diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 9f4e748a..82cfc52c 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -143,9 +143,9 @@ extern "C" #define SCU_XCVR_B7 (P5_6) /* GPIO2[15] on P5_6 */ #endif #ifdef RAD1O -#define SCU_XCVR_RXHP (P8_1) /* GPIO[] on P8_1 */ -#define SCU_XCVR_B6 (P8_2) /* GPIO[] on P8_2 */ -#define SCU_XCVR_B7 (P9_3) /* GPIO[] on P8_3 */ +#define SCU_XCVR_RXHP (P8_1) /* GPIO[] on P8_1 */ +#define SCU_XCVR_B6 (P8_2) /* GPIO[] on P8_2 */ +#define SCU_XCVR_B7 (P9_3) /* GPIO[] on P8_3 */ #endif #define SCU_XCVR_ENABLE (P4_6) /* GPIO2[6] on P4_6 */ diff --git a/firmware/common/max2871.c b/firmware/common/max2871.c index b67da1a7..ea073307 100644 --- a/firmware/common/max2871.c +++ b/firmware/common/max2871.c @@ -23,11 +23,11 @@ void max2871_setup(max2871_driver_t* const drv) /* Configure GPIO pins. */ scu_pinmux(SCU_VCO_CE, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); - //Only used for the debug pin config: scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST); + /* Only used for the debug pin config: scu_pinmux(SCU_VCO_SCLK, SCU_GPIO_FAST); */ scu_pinmux(SCU_VCO_SDATA, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_LE, SCU_GPIO_FAST); scu_pinmux(SCU_VCO_MUX, SCU_GPIO_FAST | SCU_CONF_FUNCTION4); - scu_pinmux(SCU_SYNT_RFOUT_EN, SCU_GPIO_FAST); + scu_pinmux(SCU_SYNT_RFOUT_EN, SCU_GPIO_FAST); /* Set GPIO pins as outputs. */ gpio_output(drv->gpio_vco_ce); @@ -36,8 +36,8 @@ void max2871_setup(max2871_driver_t* const drv) gpio_output(drv->gpio_vco_le); gpio_output(drv->gpio_synt_rfout_en); - /* MUX is an input */ - gpio_input(drv->gpio_vco_mux); + /* MUX is an input */ + gpio_input(drv->gpio_vco_mux); /* set to known state */ gpio_set(drv->gpio_vco_ce); /* active high */ @@ -46,73 +46,73 @@ void max2871_setup(max2871_driver_t* const drv) gpio_set(drv->gpio_vco_le); /* active low */ gpio_set(drv->gpio_synt_rfout_en); /* active high */ - max2871_regs_init(); - int i; - for(i = 5; i >= 0; i--) { - max2871_spi_write(drv, i, max2871_get_register(i)); - delay_ms(20); - } + max2871_regs_init(); + int i; + for(i = 5; i >= 0; i--) { + max2871_spi_write(drv, i, max2871_get_register(i)); + delay_ms(20); + } - max2871_set_INT(1); - max2871_set_N(4500); - max2871_set_FRAC(0); - max2871_set_CPL(0); - max2871_set_CPT(0); - max2871_set_P(1); - max2871_set_M(0); - max2871_set_LDS(0); - max2871_set_SDN(0); - max2871_set_MUX(0x0C); // Register 6 readback - max2871_set_DBR(0); - max2871_set_RDIV2(0); - max2871_set_R(1); // 40 MHz f_PFD - max2871_set_REG4DB(1); - max2871_set_CP(15); // ?: CP charge pump current 0-15 - max2871_set_LDF(1); // INT-N - max2871_set_LDP(0); // ?: Lock-Detect Precision - max2871_set_PDP(1); - max2871_set_SHDN(0); - max2871_set_TRI(0); - max2871_set_RST(0); - max2871_set_VCO(0); - max2871_set_VAS_SHDN(0); - max2871_set_VAS_TEMP(1); - max2871_set_CSM(0); - max2871_set_MUTEDEL(1); - max2871_set_CDM(0); - max2871_set_CDIV(0); - max2871_set_SDLDO(0); - max2871_set_SDDIV(0); - max2871_set_SDREF(0); - max2871_set_BS(20*40); // For 40 MHz f_PFD - max2871_set_FB(1); // Do not put DIVA into the feedback loop - max2871_set_DIVA(0); - max2871_set_SDVCO(0); - max2871_set_MTLD(1); - max2871_set_BDIV(0); - max2871_set_RFB_EN(0); - max2871_set_BPWR(0); - max2871_set_RFA_EN(0); - max2871_set_APWR(3); - max2871_set_SDPLL(0); - max2871_set_F01(1); - max2871_set_LD(1); - max2871_set_ADCS(0); - max2871_set_ADCM(0); + max2871_set_INT(1); + max2871_set_N(4500); + max2871_set_FRAC(0); + max2871_set_CPL(0); + max2871_set_CPT(0); + max2871_set_P(1); + max2871_set_M(0); + max2871_set_LDS(0); + max2871_set_SDN(0); + max2871_set_MUX(0x0C); /* Register 6 readback */ + max2871_set_DBR(0); + max2871_set_RDIV2(0); + max2871_set_R(1); /* 40 MHz f_PFD */ + max2871_set_REG4DB(1); + max2871_set_CP(15); /* ?: CP charge pump current 0-15 */ + max2871_set_LDF(1); /* INT-N */ + max2871_set_LDP(0); /* ?: Lock-Detect Precision */ + max2871_set_PDP(1); + max2871_set_SHDN(0); + max2871_set_TRI(0); + max2871_set_RST(0); + max2871_set_VCO(0); + max2871_set_VAS_SHDN(0); + max2871_set_VAS_TEMP(1); + max2871_set_CSM(0); + max2871_set_MUTEDEL(1); + max2871_set_CDM(0); + max2871_set_CDIV(0); + max2871_set_SDLDO(0); + max2871_set_SDDIV(0); + max2871_set_SDREF(0); + max2871_set_BS(20*40); /* For 40 MHz f_PFD */ + max2871_set_FB(1); /* Do not put DIVA into the feedback loop */ + max2871_set_DIVA(0); + max2871_set_SDVCO(0); + max2871_set_MTLD(1); + max2871_set_BDIV(0); + max2871_set_RFB_EN(0); + max2871_set_BPWR(0); + max2871_set_RFA_EN(0); + max2871_set_APWR(3); + max2871_set_SDPLL(0); + max2871_set_F01(1); + max2871_set_LD(1); + max2871_set_ADCS(0); + max2871_set_ADCM(0); - max2871_write_registers(drv); + max2871_write_registers(drv); - max2871_set_frequency(drv, 3500); + max2871_set_frequency(drv, 3500); } static void delay_ms(int ms) { uint32_t i; - while(ms--) { - for (i = 0; i < 20000; i++) { - __asm__("nop"); - } - } + while(ms--) { + for (i = 0; i < 20000; i++) { + __asm__("nop"); + } + } } @@ -129,8 +129,7 @@ static void serial_delay(void) * * Send 32 bits: * First 29 bits are data - * Last 3 bits are register number - */ + * Last 3 bits are register number */ static void max2871_spi_write(max2871_driver_t* const drv, uint8_t r, uint32_t v) { #if DEBUG LOG("0x%04x -> reg%d\n", v, r); @@ -171,13 +170,13 @@ static uint32_t max2871_spi_read(max2871_driver_t* const drv) uint32_t bits = 32; uint32_t data = 0; - max2871_spi_write(drv, 0x06, 0x0); + max2871_spi_write(drv, 0x06, 0x0); - serial_delay(); - gpio_set(drv->gpio_vco_sclk); - serial_delay(); - gpio_clear(drv->gpio_vco_sclk); - serial_delay(); + serial_delay(); + gpio_set(drv->gpio_vco_sclk); + serial_delay(); + gpio_clear(drv->gpio_vco_sclk); + serial_delay(); while (bits--) { gpio_set(drv->gpio_vco_sclk); @@ -187,43 +186,43 @@ static uint32_t max2871_spi_read(max2871_driver_t* const drv) serial_delay(); data <<= 1; - data |= gpio_read(drv->gpio_vco_mux) ? 1 : 0; + data |= gpio_read(drv->gpio_vco_mux) ? 1 : 0; } - return data; + return data; } static void max2871_write_registers(max2871_driver_t* const drv) { - int i; - for(i = 5; i >= 0; i--) { - max2871_spi_write(drv, i, max2871_get_register(i)); - } + int i; + for(i = 5; i >= 0; i--) { + max2871_spi_write(drv, i, max2871_get_register(i)); + } } /* Set frequency (MHz). */ uint64_t max2871_set_frequency(max2871_driver_t* const drv, uint16_t mhz) { - int n = mhz / 40; - int diva = 0; + int n = mhz / 40; + int diva = 0; - while(n * 40 < 3000) { - n *= 2; - diva += 1; - } + while(n * 40 < 3000) { + n *= 2; + diva += 1; + } - max2871_set_RFA_EN(0); - max2871_write_registers(drv); + max2871_set_RFA_EN(0); + max2871_write_registers(drv); - max2871_set_N(n); - max2871_set_DIVA(diva); - max2871_write_registers(drv); + max2871_set_N(n); + max2871_set_DIVA(diva); + max2871_write_registers(drv); - while(max2871_spi_read(drv) & MAX2871_VASA); + while(max2871_spi_read(drv) & MAX2871_VASA); - max2871_set_RFA_EN(1); - max2871_write_registers(drv); + max2871_set_RFA_EN(1); + max2871_write_registers(drv); - return (mhz/40)*40 * 1000000; + return (mhz/40)*40 * 1000000; } void max2871_enable(max2871_driver_t* const drv) diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 5f653e38..05a627bd 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -221,10 +221,6 @@ static void switchctrl_set_rad1o(rf_path_t* const rf_path, uint8_t ctrl) { if (ctrl & SWITCHCTRL_NO_RX_AMP_PWR) { gpio_clear(rf_path->gpio_rx_lna); } - - if (ctrl & SWITCHCTRL_ANT_PWR) { - // TODO - } } #endif diff --git a/firmware/common/sgpio.c b/firmware/common/sgpio.c index f57b7b56..6180ad53 100644 --- a/firmware/common/sgpio.c +++ b/firmware/common/sgpio.c @@ -93,8 +93,8 @@ void sgpio_configure( ; #ifdef RAD1O - // The data direction might have changed. Check if we need to - // adjust the q inversion. + /* The data direction might have changed. Check if we need to + * adjust the q inversion. */ update_q_invert(config); #endif @@ -283,19 +283,16 @@ bool sgpio_cpld_stream_rx_set_decimation(sgpio_config_t* const config, const uin * have to go. * * As TX/RX can change without sgpio_cpld_stream_rx_set_q_invert - * being called, we store a local copy of its parameter. - */ + * being called, we store a local copy of its parameter. */ static bool sgpio_invert = false; -/* - * Called when TX/RX changes od sgpio_cpld_stream_rx_set_q_invert - * gets called. - */ +/* Called when TX/RX changes od sgpio_cpld_stream_rx_set_q_invert + * gets called. */ static void update_q_invert(sgpio_config_t* const config) { - /* 1=Output SGPIO11 High(TX mode), 0=Output SGPIO11 Low(RX mode)*/ + /* 1=Output SGPIO11 High(TX mode), 0=Output SGPIO11 Low(RX mode) */ bool tx_mode = (SGPIO_GPIO_OUTREG & (1 << 11)) > 0; - // 0.13: P1_18 + /* 0.13: P1_18 */ if( !sgpio_invert & !tx_mode) { gpio_write(config->gpio_rx_q_invert, 1); } else if( !sgpio_invert & tx_mode) { diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index a64a7cdd..89932191 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -271,12 +271,12 @@ void si5351c_configure_clock_control(si5351c_driver_t* const drv, const enum pll void si5351c_enable_clock_outputs(si5351c_driver_t* const drv) { #ifdef RAD1O - /* Enable CLK outputs 0, 1, 2, 4, 5 only. */ + /* Enable CLK outputs 0, 1, 2, 4, 5 only. */ /* 7: Clock to CPU is deactivated as it is not used and creates noise */ /* 3: External clock output is deactivated as it is not used and creates noise */ - uint8_t data[] = { 3, ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 4) | (1 << 5))}; + uint8_t data[] = { 3, ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 4) | (1 << 5))}; #else - /* Enable CLK outputs 0, 1, 2, 3, 4, 5, 7 only. */ + /* Enable CLK outputs 0, 1, 2, 3, 4, 5, 7 only. */ uint8_t data[] = { 3, 0x40 }; #endif si5351c_write(drv, data, sizeof(data)); diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 9cd770c2..51d8a088 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -58,8 +58,8 @@ static const usb_request_handler_fn vendor_request_handler[] = { usb_vendor_request_set_sample_rate_frac, usb_vendor_request_set_baseband_filter_bandwidth, #ifdef RAD1O - NULL, - NULL, + NULL, // write_rffc5071 not used + NULL, // read_rffc5071 not used #else usb_vendor_request_write_rffc5071, usb_vendor_request_read_rffc5071, @@ -163,6 +163,8 @@ int main(void) { enable_1v8_power(); #if (defined HACKRF_ONE || defined RAD1O) enable_rf_power(); + + /* Let the voltage stabilize */ delay(1000000); #endif cpu_clock_init(); From 5f46bce3251debdf5745e93363f4d963a221a9f8 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 3 Feb 2017 19:33:25 +0100 Subject: [PATCH 55/58] fix(rad1o): Restore hackrf max2837_freq_nominal_hz behaviour --- firmware/common/tuning.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/firmware/common/tuning.c b/firmware/common/tuning.c index 6ab0e7da..b33b90d3 100644 --- a/firmware/common/tuning.c +++ b/firmware/common/tuning.c @@ -70,9 +70,12 @@ bool set_freq(const uint64_t freq) if(freq_mhz < MAX_LP_FREQ_MHZ) { rf_path_set_filter(&rf_path, RF_PATH_FILTER_LOW_PASS); +#ifdef RAD1O + max2837_freq_nominal_hz = 2300000000; +#else /* IF is graduated from 2650 MHz to 2343 MHz */ max2837_freq_nominal_hz = 2650000000 - (freq / 7); - max2837_freq_nominal_hz = 2300000000; +#endif mixer_freq_mhz = (max2837_freq_nominal_hz / FREQ_ONE_MHZ) + freq_mhz; /* Set Freq and read real freq */ real_mixer_freq_hz = mixer_set_frequency(&mixer, mixer_freq_mhz); From baf9cd40b7ac5c38f73888f7f02712274aa48d71 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 3 Feb 2017 19:33:53 +0100 Subject: [PATCH 56/58] chore(travis): Add rad1o to build --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 8476bf27..9a4ea0f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,7 @@ script: - cd ../.. - mkdir firmware/build-hackrf-one - mkdir firmware/build-jawbreaker + - mkdir firmware/build-rad1o - cd firmware/libopencm3 - make - cd ../build-hackrf-one @@ -45,6 +46,9 @@ script: - cd ../build-jawbreaker - cmake -DBOARD=JAWBREAKER .. - make + - cd ../build-rad1o + - cmake -DBOARD=RAD1O .. + - make addons: apt: From 666844885697a1cb6fce1cd58d9e3efca00dabdb Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 3 Feb 2017 20:09:40 +0100 Subject: [PATCH 57/58] fix(mixertx): Use mixer_setup instead of rffc5071_setup --- firmware/mixertx/mixertx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/mixertx/mixertx.c b/firmware/mixertx/mixertx.c index a6c2024a..fc537c66 100644 --- a/firmware/mixertx/mixertx.c +++ b/firmware/mixertx/mixertx.c @@ -36,7 +36,7 @@ int main(void) ssp1_set_mode_max2837(); max2837_setup(&max2837); - rffc5071_setup(&rffc5072); + mixer_setup(&mixer); led_on(LED2); max2837_set_frequency(&max2837, freq); From 6b08a86255f48ce3f2e8eb44d9bb608ae957d72f Mon Sep 17 00:00:00 2001 From: schneider Date: Sat, 11 Feb 2017 18:07:34 +0100 Subject: [PATCH 58/58] chore(Makefile): Remove rad1o specific plain Makefile --- Makefile | 50 -------------------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index fda643e9..00000000 --- a/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -default: lib hackrf-usb - -all: lib hackrf-usb hackrf-tools - -force: clean all - -ifeq ($(MAKECMDGOALS),rebuild) -FORCE=FORCE -rebuild: all -endif - -firmware/libopencm3/README: - git submodule init - -firmware/libopencm3/lib/libopencm3_lpc43xx.a: $(FORCE) - git submodule update - $(MAKE) -C firmware/libopencm3 - -lib: firmware/libopencm3/README firmware/libopencm3/lib/libopencm3_lpc43xx.a - -FDIR=firmware/hackrf_usb/build - -hackrf-usb: $(FDIR)/hackrf_usb.dfu - -$(FDIR)/hackrf_usb.dfu: $(FDIR) $(FDIR)/Makefile $(FORCE) - $(MAKE) -C $(FDIR) - -$(FDIR)/Makefile: - cd $(FDIR) && cmake -DBOARD=RAD1O .. - -$(FDIR): - mkdir $(FDIR) - -TDIR=host/build - -$(TDIR): - mkdir $(TDIR) - -hackrf-tools: $(TDIR) $(TDIR)/hackrf-tools/src/hackrf_info - -$(TDIR)/hackrf-tools/src/hackrf_info: $(FORCE) - cd $(TDIR) && cmake .. && $(MAKE) - -hack-clean: - $(RM) -r $(FDIR) $(TDIR) - -clean: hack-clean - $(MAKE) -C firmware/libopencm3 clean - -FORCE: