From 70c41463b1c1fe3bb1264a417a47817709cea6f8 Mon Sep 17 00:00:00 2001 From: schneider Date: Thu, 26 Jan 2017 00:31:31 +0100 Subject: [PATCH] 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,