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). */