refact(mixer): Basic mixer abstraction
This commit is contained in:
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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
21
firmware/common/max2871.h
Normal 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
|
@ -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
128
firmware/common/mixer.c
Normal 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
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user