refact(mixer): Basic mixer abstraction

This commit is contained in:
schneider
2017-01-26 00:31:31 +01:00
parent 35ca538c18
commit 70c41463b1
10 changed files with 197 additions and 87 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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 <stdint.h>
#include <string.h>
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;
}

21
firmware/common/max2871.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef MAX2871_H
#define MAX2871_H
#include <stdint.h>
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

View File

@ -1,5 +1,5 @@
#ifndef MAX2871_H
#define MAX2871_H
#ifndef MAX2871_REGS_H
#define MAX2871_REGS_H
#include <stdint.h>
#define MAX2871_VASA (1 << 9)

128
firmware/common/mixer.c Normal file
View File

@ -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
}

View File

@ -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 <stdint.h>
// 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

View File

@ -29,9 +29,6 @@
#include "hackrf-ui.h"
#include <mixer.h>
#if (defined JAWBREAKER || defined HACKRF_ONE)
#include <rffc5071.h>
#endif
#include <max2837.h>
#include <max5864.h>
#include <sgpio.h>
@ -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

View File

@ -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

View File

@ -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,