mirror of
https://github.com/greatscottgadgets/hackrf.git
synced 2026-03-10 17:29:38 +01:00
Merge pull request #1631 from greatscottgadgets/praline-legacy
Add HackRF Pro legacy radio mode
This commit is contained in:
@@ -28,6 +28,7 @@ $ cmake ..
|
||||
$ make
|
||||
$ hackrf_spiflash -w hackrf_usb.bin
|
||||
|
||||
If you have a HackRF Pro, add -DBOARD=PRALINE to the cmake command.
|
||||
If you have a Jawbreaker, add -DBOARD=JAWBREAKER to the cmake command.
|
||||
If you have a rad1o, use -DBOARD=RAD1O instead.
|
||||
|
||||
@@ -48,9 +49,9 @@ For loading firmware into RAM with DFU you will need:
|
||||
|
||||
http://dfu-util.sourceforge.net/
|
||||
|
||||
To start up HackRF One in DFU mode, hold down the DFU button while powering it
|
||||
on or while pressing and releasing the RESET button. Release the DFU button
|
||||
after the 3V3 LED illuminates.
|
||||
To start up HackRF One or HackRF Pro in DFU mode, hold down the DFU button
|
||||
while powering it on or while pressing and releasing the RESET button. Release
|
||||
the DFU button after the 3V3 LED illuminates.
|
||||
|
||||
A .dfu file is built by default when building firmware. Alternatively you can
|
||||
use a known good .dfu file from a release package. Load the firmware into RAM
|
||||
|
||||
@@ -29,7 +29,11 @@
|
||||
void fpga_init(fpga_driver_t* const drv)
|
||||
{
|
||||
// Standard bitstream default register values.
|
||||
set_FPGA_STANDARD_CTRL(drv, 0);
|
||||
set_FPGA_STANDARD_CTRL_DC_BLOCK(drv, true);
|
||||
set_FPGA_STANDARD_CTRL_QUARTER_SHIFT_EN(drv, false);
|
||||
set_FPGA_STANDARD_CTRL_QUARTER_SHIFT_UP(drv, false);
|
||||
set_FPGA_STANDARD_CTRL_PRBS(drv, false);
|
||||
set_FPGA_STANDARD_CTRL_TRIGGER_EN(drv, false);
|
||||
set_FPGA_STANDARD_TX_CTRL(drv, 0);
|
||||
|
||||
// TODO support the other bitstreams
|
||||
@@ -78,10 +82,10 @@ void fpga_regs_commit(fpga_driver_t* const drv)
|
||||
}
|
||||
}
|
||||
|
||||
void fpga_set_hw_sync_enable(fpga_driver_t* const drv, const hw_sync_mode_t hw_sync_mode)
|
||||
void fpga_set_trigger_enable(fpga_driver_t* const drv, const bool enable)
|
||||
{
|
||||
fpga_reg_read(drv, FPGA_STANDARD_CTRL);
|
||||
set_FPGA_STANDARD_CTRL_TRIGGER_EN(drv, hw_sync_mode == 1);
|
||||
set_FPGA_STANDARD_CTRL_TRIGGER_EN(drv, enable & 0b1);
|
||||
fpga_regs_commit(drv);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#define __FPGA_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "hackrf_core.h"
|
||||
#include "ice40_spi.h"
|
||||
|
||||
/* Up to 6 registers, each containing up to 8 bits of data */
|
||||
#define FPGA_NUM_REGS 6
|
||||
@@ -63,7 +63,7 @@ extern void fpga_reg_write(fpga_driver_t* const drv, uint8_t r, uint8_t v);
|
||||
* provided routines for those operations. */
|
||||
extern void fpga_regs_commit(fpga_driver_t* const drv);
|
||||
|
||||
void fpga_set_hw_sync_enable(fpga_driver_t* const drv, const hw_sync_mode_t hw_sync_mode);
|
||||
void fpga_set_trigger_enable(fpga_driver_t* const drv, const bool enable);
|
||||
void fpga_set_rx_dc_block_enable(fpga_driver_t* const drv, const bool enable);
|
||||
void fpga_set_rx_decimation_ratio(fpga_driver_t* const drv, const uint8_t value);
|
||||
void fpga_set_rx_quarter_shift_mode(
|
||||
|
||||
@@ -170,7 +170,7 @@ static struct gpio_t gpio_cpld_pp_tdo = GPIO(1, 8);
|
||||
|
||||
/* other CPLD interface GPIO pins */
|
||||
#ifndef PRALINE
|
||||
static struct gpio_t gpio_hw_sync_enable = GPIO(5, 12);
|
||||
static struct gpio_t gpio_trigger_enable = GPIO(5, 12);
|
||||
#endif
|
||||
static struct gpio_t gpio_q_invert = GPIO(0, 13);
|
||||
|
||||
@@ -179,7 +179,7 @@ static struct gpio_t gpio_q_invert = GPIO(0, 13);
|
||||
static struct gpio_t gpio_h1r9_rx = GPIO(0, 7);
|
||||
static struct gpio_t gpio_h1r9_1v8_enable = GPIO(2, 9);
|
||||
static struct gpio_t gpio_h1r9_vaa_disable = GPIO(3, 6);
|
||||
static struct gpio_t gpio_h1r9_hw_sync_enable = GPIO(5, 5);
|
||||
static struct gpio_t gpio_h1r9_trigger_enable = GPIO(5, 5);
|
||||
#endif
|
||||
|
||||
#ifdef PRALINE
|
||||
@@ -324,7 +324,7 @@ w25q80bv_driver_t spi_flash = {
|
||||
sgpio_config_t sgpio_config = {
|
||||
.gpio_q_invert = &gpio_q_invert,
|
||||
#ifndef PRALINE
|
||||
.gpio_hw_sync_enable = &gpio_hw_sync_enable,
|
||||
.gpio_trigger_enable = &gpio_trigger_enable,
|
||||
#endif
|
||||
.slice_mode_multislice = true,
|
||||
};
|
||||
@@ -375,7 +375,11 @@ radio_t radio = {
|
||||
.mode = TRANSCEIVER_MODE_OFF,
|
||||
.clock[RADIO_CLOCK_CLKIN] = {.enable = false},
|
||||
.clock[RADIO_CLOCK_CLKOUT] = {.enable = false},
|
||||
.trigger_mode = HW_SYNC_MODE_OFF,
|
||||
.trigger_enable = false,
|
||||
#ifdef PRALINE
|
||||
.resampling_n = 0,
|
||||
.shift = FPGA_QUARTER_SHIFT_MODE_NONE,
|
||||
#endif
|
||||
},
|
||||
.clock_source = CLOCK_SOURCE_HACKRF,
|
||||
},
|
||||
@@ -975,7 +979,6 @@ void clock_gen_init(void)
|
||||
void clock_gen_shutdown(void)
|
||||
{
|
||||
i2c_bus_start(clock_gen.bus, &i2c_config_si5351c_fast_clock);
|
||||
si5351c_init(&clock_gen);
|
||||
si5351c_disable_all_outputs(&clock_gen);
|
||||
si5351c_disable_oeb_pin_control(&clock_gen);
|
||||
si5351c_power_down_all_clocks(&clock_gen);
|
||||
@@ -1198,7 +1201,7 @@ void pin_setup(void)
|
||||
#ifdef HACKRF_ONE
|
||||
if (detected_platform() == BOARD_ID_HACKRF1_R9) {
|
||||
rf_path.gpio_rx = &gpio_h1r9_rx;
|
||||
sgpio_config.gpio_hw_sync_enable = &gpio_h1r9_hw_sync_enable;
|
||||
sgpio_config.gpio_trigger_enable = &gpio_h1r9_trigger_enable;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1360,12 +1363,12 @@ void set_leds(const uint8_t state)
|
||||
}
|
||||
}
|
||||
|
||||
void hw_sync_enable(const hw_sync_mode_t hw_sync_mode)
|
||||
void trigger_enable(const bool enable)
|
||||
{
|
||||
#ifndef PRALINE
|
||||
gpio_write(sgpio_config.gpio_hw_sync_enable, hw_sync_mode == 1);
|
||||
gpio_write(sgpio_config.gpio_trigger_enable, enable);
|
||||
#else
|
||||
fpga_set_hw_sync_enable(&fpga, hw_sync_mode);
|
||||
fpga_set_trigger_enable(&fpga, enable);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -179,7 +179,7 @@ extern "C" {
|
||||
#define SCU_PINMUX_SGPIO15_PINCFG (SCU_GPIO_FAST | SCU_CONF_FUNCTION4)
|
||||
|
||||
#endif
|
||||
#define SCU_HW_SYNC_EN (P4_8) /* GPIO5[12] on P4_8 */
|
||||
#define SCU_TRIGGER_EN (P4_8) /* GPIO5[12] on P4_8 */
|
||||
|
||||
/* MAX2837 GPIO (XCVR_CTL) PinMux */
|
||||
#ifdef RAD1O
|
||||
@@ -387,7 +387,7 @@ extern "C" {
|
||||
#define SCU_H1R9_NO_ANT_PWR (P4_4) /* GPIO2[4] on P4_4 */
|
||||
#define SCU_H1R9_EN1V8 (P5_0) /* GPIO2[9] on P5_0 */
|
||||
#define SCU_H1R9_NO_VAA_EN (P6_10) /* GPIO3[6] on P6_10 */
|
||||
#define SCU_H1R9_HW_SYNC_EN (P2_5) /* GPIO5[5] on P2_5 */
|
||||
#define SCU_H1R9_TRIGGER_EN (P2_5) /* GPIO5[5] on P2_5 */
|
||||
|
||||
void delay(uint32_t duration);
|
||||
void delay_us_at_mhz(uint32_t us, uint32_t mhz);
|
||||
@@ -460,7 +460,7 @@ void led_off(const led_t led);
|
||||
void led_toggle(const led_t led);
|
||||
void set_leds(const uint8_t state);
|
||||
|
||||
void hw_sync_enable(const hw_sync_mode_t hw_sync_mode);
|
||||
void trigger_enable(const bool enable);
|
||||
|
||||
void halt_and_flash(const uint32_t duration);
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ void max2831_setup(max2831_driver_t* const drv)
|
||||
|
||||
//set_MAX2831_TXVGA_GAIN(0x3f); /* maximum gain */
|
||||
set_MAX2831_TXVGA_GAIN(drv, 0x00); /* minimum gain */
|
||||
//set_MAX2831_RX_HPF_SEL(drv, MAX2831_RX_HPF_100_HZ);
|
||||
set_MAX2831_RX_HPF_SEL(drv, MAX2831_RX_HPF_30_KHZ);
|
||||
set_MAX2831_LNA_GAIN(drv, MAX2831_LNA_GAIN_MAX); /* maximum gain */
|
||||
set_MAX2831_RXVGA_GAIN(drv, 0x18);
|
||||
|
||||
|
||||
@@ -39,15 +39,49 @@ radio_error_t radio_set_sample_rate(
|
||||
|
||||
radio_config_t* config = &radio->channel[chan_id].config;
|
||||
|
||||
// TODO get the actual tuned frequency from sample_rate_frac_set
|
||||
sample_rate.hz = (double) sample_rate.num / (double) sample_rate.div;
|
||||
/*
|
||||
* Store the sample rate rounded to the nearest Hz for convenience.
|
||||
*/
|
||||
if (sample_rate.div == 0) {
|
||||
return RADIO_ERR_INVALID_PARAM;
|
||||
}
|
||||
sample_rate.hz = (sample_rate.num + (sample_rate.div >> 1)) / sample_rate.div;
|
||||
|
||||
if (config->mode == TRANSCEIVER_MODE_OFF) {
|
||||
config->sample_rate[element] = sample_rate;
|
||||
return RADIO_OK;
|
||||
}
|
||||
|
||||
#ifdef PRALINE
|
||||
#define MAX_AFE_RATE 40000000
|
||||
#define MAX_N 5
|
||||
uint8_t n = 0; // resampling ratio is 2**n
|
||||
if ((config->mode == TRANSCEIVER_MODE_RX) ||
|
||||
(config->mode == TRANSCEIVER_MODE_RX_SWEEP)) {
|
||||
n = 1;
|
||||
uint32_t afe_rate_x2 = 2 * sample_rate.hz;
|
||||
while ((afe_rate_x2 <= MAX_AFE_RATE) && (n < MAX_N)) {
|
||||
afe_rate_x2 <<= 1;
|
||||
n++;
|
||||
}
|
||||
fpga_set_rx_decimation_ratio(&fpga, n);
|
||||
}
|
||||
config->resampling_n = n;
|
||||
bool ok = sample_rate_frac_set(sample_rate.num << n, sample_rate.div);
|
||||
if (ok) {
|
||||
config->sample_rate[element] = sample_rate;
|
||||
radio_channel_t* channel = &radio->channel[chan_id];
|
||||
radio_frequency_t frequency =
|
||||
radio_get_frequency(radio, channel->id, RADIO_FREQUENCY_RF);
|
||||
ok = radio_set_frequency(
|
||||
radio,
|
||||
channel->id,
|
||||
RADIO_FREQUENCY_RF,
|
||||
frequency);
|
||||
}
|
||||
#else
|
||||
bool ok = sample_rate_frac_set(sample_rate.num, sample_rate.div);
|
||||
#endif
|
||||
if (!ok) {
|
||||
return RADIO_ERR_INVALID_PARAM;
|
||||
}
|
||||
@@ -82,17 +116,22 @@ radio_error_t radio_set_filter(
|
||||
return RADIO_OK;
|
||||
}
|
||||
|
||||
uint32_t real_hz;
|
||||
#ifndef PRALINE
|
||||
real_hz = max283x_set_lpf_bandwidth(&max283x, filter.hz);
|
||||
max283x_set_lpf_bandwidth(&max283x, filter.hz);
|
||||
#else
|
||||
real_hz = max2831_set_lpf_bandwidth(&max283x, filter.hz);
|
||||
#endif
|
||||
if (real_hz == 0) {
|
||||
return RADIO_ERR_INVALID_PARAM;
|
||||
uint32_t lpf_bandwidth =
|
||||
(config->sample_rate[RADIO_SAMPLE_RATE_CLOCKGEN].hz * 3) / 8;
|
||||
uint32_t offset = 0;
|
||||
if (config->shift != FPGA_QUARTER_SHIFT_MODE_NONE) {
|
||||
offset = (config->sample_rate[RADIO_SAMPLE_RATE_CLOCKGEN].hz
|
||||
<< config->resampling_n) /
|
||||
8;
|
||||
}
|
||||
lpf_bandwidth += offset * 2;
|
||||
max2831_set_lpf_bandwidth(&max283x, lpf_bandwidth);
|
||||
#endif
|
||||
|
||||
config->filter[element] = (radio_filter_t){.hz = real_hz};
|
||||
config->filter[element] = filter;
|
||||
return RADIO_OK;
|
||||
}
|
||||
|
||||
@@ -191,6 +230,24 @@ radio_error_t radio_set_frequency(
|
||||
frequency.if_hz,
|
||||
frequency.lo_hz,
|
||||
frequency.path);
|
||||
#ifdef PRALINE
|
||||
if (ok) {
|
||||
fpga_set_rx_quarter_shift_mode(
|
||||
&fpga,
|
||||
FPGA_QUARTER_SHIFT_MODE_NONE);
|
||||
config->shift = FPGA_QUARTER_SHIFT_MODE_NONE;
|
||||
radio_channel_t* channel = &radio->channel[chan_id];
|
||||
radio_filter_t filter = radio_get_filter(
|
||||
radio,
|
||||
channel->id,
|
||||
RADIO_FILTER_BASEBAND);
|
||||
ok = radio_set_filter(
|
||||
radio,
|
||||
channel->id,
|
||||
RADIO_FILTER_BASEBAND,
|
||||
filter);
|
||||
}
|
||||
#endif
|
||||
if (!ok) {
|
||||
return RADIO_ERR_INVALID_PARAM;
|
||||
}
|
||||
@@ -200,39 +257,62 @@ radio_error_t radio_set_frequency(
|
||||
}
|
||||
|
||||
// auto-tune
|
||||
uint64_t real_hz;
|
||||
bool ok;
|
||||
#ifndef PRALINE
|
||||
switch (config->mode) {
|
||||
case TRANSCEIVER_MODE_RX:
|
||||
case TRANSCEIVER_MODE_RX_SWEEP:
|
||||
case TRANSCEIVER_MODE_TX:
|
||||
// TODO return if, of components so we can support them in the getter
|
||||
real_hz = tuning_set_frequency(max283x_tune_config, frequency.hz);
|
||||
ok = set_freq(frequency.hz);
|
||||
break;
|
||||
default:
|
||||
return RADIO_ERR_INVALID_CONFIG;
|
||||
}
|
||||
#else
|
||||
const tune_config_t* tune_config;
|
||||
switch (config->mode) {
|
||||
case TRANSCEIVER_MODE_RX:
|
||||
real_hz = tuning_set_frequency(max2831_tune_config_rx, frequency.hz);
|
||||
tune_config = praline_tune_config_rx;
|
||||
break;
|
||||
case TRANSCEIVER_MODE_RX_SWEEP:
|
||||
real_hz =
|
||||
tuning_set_frequency(max2831_tune_config_rx_sweep, frequency.hz);
|
||||
tune_config = praline_tune_config_rx_sweep;
|
||||
break;
|
||||
case TRANSCEIVER_MODE_TX:
|
||||
real_hz = tuning_set_frequency(max2831_tune_config_tx, frequency.hz);
|
||||
tune_config = praline_tune_config_tx;
|
||||
break;
|
||||
default:
|
||||
return RADIO_ERR_INVALID_CONFIG;
|
||||
}
|
||||
#endif
|
||||
if (real_hz == 0) {
|
||||
bool found = false;
|
||||
for (; (tune_config->rf_range_end_mhz != 0) || (tune_config->if_mhz != 0);
|
||||
tune_config++) {
|
||||
if ((frequency.hz == 0) ||
|
||||
(tune_config->rf_range_end_mhz > (frequency.hz / FREQ_ONE_MHZ))) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
return RADIO_ERR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
fpga_set_rx_quarter_shift_mode(&fpga, tune_config->shift);
|
||||
config->shift = tune_config->shift;
|
||||
uint32_t offset = (config->sample_rate[RADIO_SAMPLE_RATE_CLOCKGEN].hz
|
||||
<< config->resampling_n) /
|
||||
8;
|
||||
ok = tuning_set_frequency(tune_config, frequency.hz, offset);
|
||||
if (ok) {
|
||||
radio_channel_t* channel = &radio->channel[chan_id];
|
||||
radio_filter_t filter =
|
||||
radio_get_filter(radio, channel->id, RADIO_FILTER_BASEBAND);
|
||||
ok = radio_set_filter(radio, channel->id, RADIO_FILTER_BASEBAND, filter);
|
||||
}
|
||||
#endif
|
||||
if (!ok) {
|
||||
return RADIO_ERR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
frequency.hz = real_hz;
|
||||
config->frequency[element] = frequency;
|
||||
return RADIO_OK;
|
||||
}
|
||||
@@ -319,20 +399,17 @@ radio_clock_t radio_get_clock(
|
||||
return radio->channel[chan_id].config.clock[element];
|
||||
}
|
||||
|
||||
radio_error_t radio_set_trigger_mode(
|
||||
radio_t* radio,
|
||||
radio_chan_id chan_id,
|
||||
hw_sync_mode_t mode)
|
||||
radio_error_t radio_set_trigger_enable(radio_t* radio, radio_chan_id chan_id, bool enable)
|
||||
{
|
||||
radio_config_t* config = &radio->channel[chan_id].config;
|
||||
|
||||
config->trigger_mode = mode;
|
||||
config->trigger_enable = enable;
|
||||
return RADIO_OK;
|
||||
}
|
||||
|
||||
hw_sync_mode_t radio_get_trigger_mode(radio_t* radio, radio_chan_id chan_id)
|
||||
bool radio_get_trigger_enable(radio_t* radio, radio_chan_id chan_id)
|
||||
{
|
||||
return radio->channel[chan_id].config.trigger_mode;
|
||||
return radio->channel[chan_id].config.trigger_enable;
|
||||
}
|
||||
|
||||
transceiver_mode_t radio_get_mode(radio_t* radio, radio_chan_id chan_id)
|
||||
@@ -398,6 +475,23 @@ radio_error_t radio_switch_mode(
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Because of offset tuning on Praline, the sample rate can affect the
|
||||
* tuning configuration, so radio_set_sample_rate() calls
|
||||
* radio_set_frequency(). Also because of offset tuning, the tuning
|
||||
* configuration can affect the baseband filter bandwidth (in addition
|
||||
* to the filter bandwidth being automatically based on the sample
|
||||
* rate), so radio_set_frequency() calls radio_set_filter().
|
||||
*/
|
||||
#ifndef PRALINE
|
||||
// tuning frequency
|
||||
radio_frequency_t frequency =
|
||||
radio_get_frequency(radio, channel->id, RADIO_FREQUENCY_RF);
|
||||
result = radio_set_frequency(radio, channel->id, RADIO_FREQUENCY_RF, frequency);
|
||||
if (result != RADIO_OK) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// baseband filter bandwidth
|
||||
radio_filter_t filter =
|
||||
radio_get_filter(radio, channel->id, RADIO_FILTER_BASEBAND);
|
||||
@@ -405,6 +499,7 @@ radio_error_t radio_switch_mode(
|
||||
if (result != RADIO_OK) {
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
// rf_amp enable
|
||||
radio_gain_t enable = radio_get_gain(radio, channel->id, RADIO_GAIN_RF_AMP);
|
||||
@@ -445,14 +540,6 @@ radio_error_t radio_switch_mode(
|
||||
return result;
|
||||
}
|
||||
|
||||
// tuning frequency
|
||||
radio_frequency_t frequency =
|
||||
radio_get_frequency(radio, channel->id, RADIO_FREQUENCY_RF);
|
||||
result = radio_set_frequency(radio, channel->id, RADIO_FREQUENCY_RF, frequency);
|
||||
if (result != RADIO_OK) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// finally, set the rf path direction
|
||||
rf_path_set_direction(&rf_path, direction);
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "rf_path.h"
|
||||
#include "fpga.h"
|
||||
|
||||
typedef enum {
|
||||
RADIO_OK = 1,
|
||||
@@ -77,7 +78,7 @@ typedef enum {
|
||||
typedef struct {
|
||||
uint32_t num;
|
||||
uint32_t div;
|
||||
double hz;
|
||||
uint32_t hz;
|
||||
} radio_sample_rate_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -106,12 +107,6 @@ typedef struct {
|
||||
bool enable;
|
||||
} radio_clock_t;
|
||||
|
||||
// legacy type, moved from hackrf_core
|
||||
typedef enum {
|
||||
HW_SYNC_MODE_OFF = 0,
|
||||
HW_SYNC_MODE_ON = 1,
|
||||
} hw_sync_mode_t;
|
||||
|
||||
// legacy type, moved from hackrf_core
|
||||
typedef enum {
|
||||
CLOCK_SOURCE_HACKRF = 0,
|
||||
@@ -158,10 +153,19 @@ typedef struct {
|
||||
radio_clock_t clock[RADIO_CLOCK_COUNT];
|
||||
|
||||
// trigger elements
|
||||
hw_sync_mode_t trigger_mode;
|
||||
bool trigger_enable;
|
||||
|
||||
// currently active transceiver mode
|
||||
transceiver_mode_t mode;
|
||||
|
||||
#ifdef PRALINE
|
||||
// resampling ratio is 2**n
|
||||
uint8_t resampling_n;
|
||||
|
||||
// quarter-rate shift configuration for offset tuning
|
||||
fpga_quarter_shift_mode_t shift;
|
||||
#endif
|
||||
|
||||
} radio_config_t;
|
||||
|
||||
typedef struct radio_channel_t {
|
||||
@@ -245,11 +249,8 @@ radio_clock_t radio_get_clock(
|
||||
radio_chan_id chan_id,
|
||||
radio_clock_id element);
|
||||
|
||||
radio_error_t radio_set_trigger_mode(
|
||||
radio_t* radio,
|
||||
radio_chan_id chan_id,
|
||||
hw_sync_mode_t mode);
|
||||
hw_sync_mode_t radio_get_trigger_mode(radio_t* radio, radio_chan_id chan_id);
|
||||
radio_error_t radio_set_trigger_enable(radio_t* radio, radio_chan_id chan_id, bool enable);
|
||||
bool radio_get_trigger_enable(radio_t* radio, radio_chan_id chan_id);
|
||||
|
||||
transceiver_mode_t radio_get_mode(radio_t* radio, radio_chan_id chan_id);
|
||||
rf_path_direction_t radio_get_direction(radio_t* radio, radio_chan_id chan_id);
|
||||
|
||||
@@ -122,8 +122,10 @@ void rffc5071_setup(rffc5071_driver_t* const drv)
|
||||
/* GPOs are active at all times */
|
||||
set_RFFC5071_GATE(drv, 1);
|
||||
|
||||
#ifdef PRALINE
|
||||
/* Enable GPO Lock output signal */
|
||||
set_RFFC5071_LOCK(drv, 1);
|
||||
#endif
|
||||
|
||||
rffc5071_regs_commit(drv);
|
||||
}
|
||||
@@ -247,19 +249,22 @@ uint64_t rffc5071_config_synth(rffc5071_driver_t* const drv, uint64_t lo)
|
||||
|
||||
fvco = lo << n_lo;
|
||||
|
||||
/* higher divider and charge pump current required above
|
||||
* 3.2GHz. Programming guide says these values (fbkdiv, n,
|
||||
* maybe pump?) can be changed back after enable in order to
|
||||
* improve phase noise, since the VCO will already be stable
|
||||
* and will be unaffected. */
|
||||
/*
|
||||
* Higher charge pump leakage setting is required above 3.2 GHz.
|
||||
*/
|
||||
if (fvco > (3200 * FREQ_ONE_MHZ)) {
|
||||
fbkdivlog = 2;
|
||||
set_RFFC5071_PLLCPL(drv, 3);
|
||||
} else {
|
||||
fbkdivlog = 1;
|
||||
set_RFFC5071_PLLCPL(drv, 2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Supposedly fbkdivlog can be set to 1 when VCO is below 3.2 GHz, but
|
||||
* this has resulted in tuning instability on some boards, most evident
|
||||
* in RX sweep mode.
|
||||
*/
|
||||
fbkdivlog = 2;
|
||||
|
||||
uint64_t tmp_n = (fvco << (24ULL - fbkdivlog)) / REF_FREQ;
|
||||
|
||||
/* Round to nearest step = ref_MHz / 2**s. For s=6, step=625000 Hz */
|
||||
|
||||
@@ -52,11 +52,11 @@ void sgpio_configure_pin_functions(sgpio_config_t* const config)
|
||||
|
||||
if (detected_platform() == BOARD_ID_HACKRF1_R9) {
|
||||
scu_pinmux(
|
||||
SCU_H1R9_HW_SYNC_EN,
|
||||
SCU_H1R9_TRIGGER_EN,
|
||||
SCU_GPIO_FAST | SCU_CONF_FUNCTION4); /* GPIO5[5] */
|
||||
} else {
|
||||
scu_pinmux(
|
||||
SCU_HW_SYNC_EN,
|
||||
SCU_TRIGGER_EN,
|
||||
SCU_GPIO_FAST | SCU_CONF_FUNCTION4); /* GPIO5[12] */
|
||||
}
|
||||
|
||||
@@ -64,8 +64,8 @@ void sgpio_configure_pin_functions(sgpio_config_t* const config)
|
||||
gpio_output(config->gpio_q_invert);
|
||||
|
||||
#ifndef PRALINE
|
||||
hw_sync_enable(0);
|
||||
gpio_output(config->gpio_hw_sync_enable);
|
||||
trigger_enable(false);
|
||||
gpio_output(config->gpio_trigger_enable);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ typedef enum {
|
||||
typedef struct sgpio_config_t {
|
||||
gpio_t gpio_q_invert;
|
||||
#ifndef PRALINE
|
||||
gpio_t gpio_hw_sync_enable;
|
||||
gpio_t gpio_trigger_enable;
|
||||
#endif
|
||||
bool slice_mode_multislice;
|
||||
} sgpio_config_t;
|
||||
|
||||
@@ -22,199 +22,374 @@
|
||||
#ifndef __TUNE_CONFIG_H__
|
||||
#define __TUNE_CONFIG_H__
|
||||
|
||||
#ifdef PRALINE
|
||||
#include "fpga.h"
|
||||
|
||||
typedef struct {
|
||||
uint16_t rf_range_end_mhz;
|
||||
uint16_t if_mhz;
|
||||
bool high_lo;
|
||||
fpga_quarter_shift_mode_t shift;
|
||||
} tune_config_t;
|
||||
|
||||
#ifndef PRALINE
|
||||
// TODO maybe one day?
|
||||
static const tune_config_t max283x_tune_config[] = {};
|
||||
#else
|
||||
// clang-format off
|
||||
/* tuning table optimized for TX */
|
||||
static const tune_config_t max2831_tune_config_tx[] = {
|
||||
{ 2100, 2375, true },
|
||||
{ 2175, 2325, false },
|
||||
{ 2320, 2525, false },
|
||||
{ 2580, 0, false },
|
||||
{ 3000, 2325, false },
|
||||
{ 3100, 2375, false },
|
||||
{ 3200, 2425, false },
|
||||
{ 3350, 2375, false },
|
||||
{ 3500, 2475, false },
|
||||
{ 3550, 2425, false },
|
||||
{ 3650, 2325, false },
|
||||
{ 3700, 2375, false },
|
||||
{ 3850, 2425, false },
|
||||
{ 3925, 2375, false },
|
||||
{ 4600, 2325, false },
|
||||
{ 4700, 2375, false },
|
||||
{ 4800, 2425, false },
|
||||
{ 5100, 2375, false },
|
||||
{ 5850, 2525, false },
|
||||
{ 6500, 2325, false },
|
||||
{ 6750, 2375, false },
|
||||
{ 6850, 2425, false },
|
||||
{ 6950, 2475, false },
|
||||
{ 7000, 2525, false },
|
||||
{ 7251, 2575, false },
|
||||
{ 0, 0, false },
|
||||
static const tune_config_t praline_tune_config_tx[] = {
|
||||
{ 2100, 2375, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2105, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2115, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2130, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2150, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2160, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2175, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2190, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2195, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2210, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2248, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2265, 2525, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2300, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2320, 2525, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2580, 0, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3000, 2325, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3140, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3200, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3280, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3340, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3420, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3480, 2525, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3500, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3595, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3625, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3670, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3710, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3760, 2525, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3790, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3860, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3915, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4000, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4055, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4125, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4700, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4800, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5000, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5260, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5465, 2525, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5560, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5720, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5860, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5970, 2575, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6000, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6500, 2325, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6750, 2375, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6850, 2425, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6950, 2475, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 7000, 2525, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 7251, 2575, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 0, 0, false, 0 },
|
||||
};
|
||||
|
||||
/* tuning table optimized for 20 Msps interleaved RX sweep mode */
|
||||
static const tune_config_t max2831_tune_config_rx_sweep[] = {
|
||||
{ 140, 2330, false },
|
||||
{ 424, 2570, true },
|
||||
{ 557, 2520, true },
|
||||
{ 593, 2380, true },
|
||||
{ 776, 2360, true },
|
||||
{ 846, 2570, true },
|
||||
{ 926, 2500, true },
|
||||
{ 1055, 2380, true },
|
||||
{ 1175, 2360, true },
|
||||
{ 1391, 2340, true },
|
||||
{ 1529, 2570, true },
|
||||
{ 1671, 2520, true },
|
||||
{ 1979, 2380, true },
|
||||
{ 2150, 2330, true },
|
||||
{ 2160, 2550, false },
|
||||
{ 2170, 2560, false },
|
||||
{ 2179, 2570, false },
|
||||
{ 2184, 2520, false },
|
||||
{ 2187, 2560, false },
|
||||
{ 2194, 2530, false },
|
||||
{ 2203, 2540, false },
|
||||
{ 2212, 2550, false },
|
||||
{ 2222, 2560, false },
|
||||
{ 2231, 2570, false },
|
||||
{ 2233, 2530, false },
|
||||
{ 2237, 2520, false },
|
||||
{ 2241, 2550, false },
|
||||
{ 2245, 2570, false },
|
||||
{ 2250, 2560, false },
|
||||
{ 2252, 2550, false },
|
||||
{ 2258, 2570, false },
|
||||
{ 2261, 2560, false },
|
||||
{ 2266, 2540, false },
|
||||
{ 2271, 2570, false },
|
||||
{ 2275, 2550, false },
|
||||
{ 2280, 2500, false },
|
||||
{ 2284, 2560, false },
|
||||
{ 2285, 2530, false },
|
||||
{ 2289, 2510, false },
|
||||
{ 2293, 2570, false },
|
||||
{ 2294, 2540, false },
|
||||
{ 2298, 2520, false },
|
||||
{ 2301, 2570, false },
|
||||
{ 2302, 2550, false },
|
||||
{ 2307, 2530, false },
|
||||
{ 2308, 2560, false },
|
||||
{ 2312, 2560, false },
|
||||
{ 2316, 2540, false },
|
||||
{ 2317, 2570, false },
|
||||
{ 2320, 2570, false },
|
||||
{ 2580, 0, false },
|
||||
{ 2585, 2360, false },
|
||||
{ 2588, 2340, false },
|
||||
{ 2594, 2350, false },
|
||||
{ 2606, 2330, false },
|
||||
{ 2617, 2340, false },
|
||||
{ 2627, 2350, false },
|
||||
{ 2638, 2360, false },
|
||||
{ 2649, 2370, false },
|
||||
{ 2659, 2380, false },
|
||||
{ 2664, 2350, false },
|
||||
{ 2675, 2360, false },
|
||||
{ 2686, 2370, false },
|
||||
{ 2697, 2380, false },
|
||||
{ 2705, 2350, false },
|
||||
{ 2716, 2360, false },
|
||||
{ 2728, 2370, false },
|
||||
{ 2739, 2380, false },
|
||||
{ 2757, 2330, false },
|
||||
{ 2779, 2350, false },
|
||||
{ 2790, 2360, false },
|
||||
{ 2801, 2370, false },
|
||||
{ 2812, 2380, false },
|
||||
{ 2821, 2570, false },
|
||||
{ 2831, 2520, false },
|
||||
{ 2852, 2330, false },
|
||||
{ 2874, 2350, false },
|
||||
{ 2897, 2370, false },
|
||||
{ 2913, 2510, false },
|
||||
{ 2925, 2570, false },
|
||||
{ 2937, 2530, false },
|
||||
{ 2948, 2540, false },
|
||||
{ 2960, 2550, false },
|
||||
{ 2975, 2330, false },
|
||||
{ 2988, 2340, false },
|
||||
{ 3002, 2330, false },
|
||||
{ 3014, 2360, false },
|
||||
{ 3027, 2370, false },
|
||||
{ 3041, 2500, false },
|
||||
{ 3052, 2510, false },
|
||||
{ 3064, 2520, false },
|
||||
{ 3082, 2500, false },
|
||||
{ 3107, 2520, false },
|
||||
{ 3132, 2540, false },
|
||||
{ 3157, 2560, false },
|
||||
{ 3170, 2570, false },
|
||||
{ 3192, 2500, false },
|
||||
{ 3216, 2340, false },
|
||||
{ 3270, 2330, false },
|
||||
{ 3319, 2370, false },
|
||||
{ 3341, 2340, false },
|
||||
{ 3370, 2330, false },
|
||||
{ 3400, 2350, false },
|
||||
{ 3430, 2370, false },
|
||||
{ 3464, 2520, false },
|
||||
{ 3491, 2540, false },
|
||||
{ 3519, 2560, false },
|
||||
{ 3553, 2510, false },
|
||||
{ 3595, 2540, false },
|
||||
{ 3638, 2570, false },
|
||||
{ 3665, 2540, false },
|
||||
{ 3685, 2560, false },
|
||||
{ 3726, 2330, false },
|
||||
{ 3790, 2370, false },
|
||||
{ 3910, 2350, false },
|
||||
{ 4014, 2510, false },
|
||||
{ 4123, 2380, false },
|
||||
{ 4191, 2550, false },
|
||||
{ 4349, 2510, false },
|
||||
{ 4452, 2570, false },
|
||||
{ 4579, 2500, false },
|
||||
{ 4707, 2570, false },
|
||||
{ 4831, 2560, false },
|
||||
{ 4851, 2570, false },
|
||||
{ 4871, 2560, false },
|
||||
{ 4891, 2570, false },
|
||||
{ 4911, 2540, false },
|
||||
{ 4931, 2550, false },
|
||||
{ 4951, 2560, false },
|
||||
{ 5044, 2330, false },
|
||||
{ 5065, 2340, false },
|
||||
{ 5174, 2330, false },
|
||||
{ 5285, 2380, false },
|
||||
{ 5449, 2340, false },
|
||||
{ 5574, 2510, false },
|
||||
{ 5717, 2340, false },
|
||||
{ 5892, 2530, false },
|
||||
{ 6096, 2350, false },
|
||||
{ 6254, 2560, false },
|
||||
{ 6625, 2340, false },
|
||||
{ 6764, 2540, false },
|
||||
{ 6930, 2530, false },
|
||||
{ 7251, 2570, false },
|
||||
{ 0, 0, false },
|
||||
static const tune_config_t praline_tune_config_rx_sweep[] = {
|
||||
{ 140, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 424, 2570, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 557, 2520, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 593, 2380, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 776, 2360, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 846, 2570, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 926, 2500, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 1055, 2380, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 1175, 2360, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 1391, 2340, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 1529, 2570, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 1671, 2520, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 1979, 2380, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2150, 2330, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2160, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2170, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2179, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2184, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2187, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2194, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2203, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2212, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2222, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2231, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2233, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2237, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2241, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2245, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2250, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2252, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2258, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2261, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2266, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2271, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2275, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2280, 2500, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2284, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2285, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2289, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2293, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2294, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2298, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2301, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2302, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2307, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2308, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2312, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2316, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2317, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2320, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2580, 0, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2585, 2360, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2588, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2594, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2606, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2617, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2627, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2638, 2360, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2649, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2659, 2380, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2664, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2675, 2360, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2686, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2697, 2380, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2705, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2716, 2360, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2728, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2739, 2380, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2757, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2779, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2790, 2360, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2801, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2812, 2380, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2821, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2831, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2852, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2874, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2897, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2913, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2925, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2937, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2948, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2960, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2975, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 2988, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3002, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3014, 2360, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3027, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3041, 2500, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3052, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3064, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3082, 2500, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3107, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3132, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3157, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3170, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3192, 2500, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3216, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3270, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3319, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3341, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3370, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3400, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3430, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3464, 2520, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3491, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3519, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3553, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3595, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3638, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3665, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3685, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3726, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3790, 2370, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 3910, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4014, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4123, 2380, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4191, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4349, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4452, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4579, 2500, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4707, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4831, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4851, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4871, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4891, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4911, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4931, 2550, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 4951, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5044, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5065, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5174, 2330, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5285, 2380, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5449, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5574, 2510, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5717, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 5892, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6096, 2350, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6254, 2560, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6625, 2340, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6764, 2540, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 6930, 2530, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 7251, 2570, false, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 0, 0, false, 0 },
|
||||
};
|
||||
|
||||
// TODO these are just copies of max2831_tune_config_rx_sweep for now
|
||||
#define max2831_tune_config_rx max2831_tune_config_rx_sweep
|
||||
// clang-format on
|
||||
|
||||
/* tuning table optimized for RX */
|
||||
static const tune_config_t praline_tune_config_rx[] = {
|
||||
{ 0, 2360, true, FPGA_QUARTER_SHIFT_MODE_NONE },
|
||||
{ 50, 2320, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 100, 2320, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 140, 2320, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 406, 2560, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 511, 2380, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 578, 2560, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 741, 2340, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 861, 2560, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 921, 2560, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 1049, 2340, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 1169, 2380, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 1360, 2340, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 1544, 2560, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 1675, 2560, true, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 1992, 2380, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2070, 2340, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2150, 2360, true, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2168, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2185, 2580, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2202, 2580, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2205, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2216, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2223, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2234, 2580, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2240, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2251, 2580, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2258, 2580, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2265, 2540, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2271, 2580, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2273, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2275, 2580, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2280, 2500, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2284, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2289, 2580, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2293, 2540, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2298, 2520, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2300, 2580, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2302, 2540, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2309, 2560, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2311, 2580, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2314, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2315, 2540, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2320, 2580, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2380, 0, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2440, 0, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2500, 0, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2580, 0, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2583, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2584, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2587, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2593, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2607, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2609, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2615, 2360, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2627, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2629, 2360, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2631, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2644, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2649, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2651, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2654, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2665, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2669, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2672, 2360, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2682, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2687, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2692, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2695, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2705, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2707, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2712, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2717, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2728, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2730, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2734, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2758, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2780, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2787, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2802, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2809, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2822, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2831, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2854, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2875, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2898, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2918, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2936, 2520, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2944, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 2959, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2976, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 2985, 2500, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3003, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3009, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3027, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3034, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3050, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3069, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3094, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3119, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3144, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3169, 2560, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3180, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3204, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3232, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3292, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3340, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3369, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3399, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3429, 2380, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3464, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3489, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3512, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3551, 2500, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3582, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3611, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3639, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3729, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 3817, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 3942, 2360, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 4049, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4134, 2500, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 4194, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4353, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4449, 2360, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 4562, 2500, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4672, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4769, 2540, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4849, 2560, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 4889, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4929, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 4969, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 5009, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 5049, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 5092, 2360, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 5209, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 5298, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 5468, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 5582, 2520, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 5702, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 5888, 2520, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 6092, 2340, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 6240, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 6609, 2340, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 6752, 2380, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 6930, 2520, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 7000, 2560, false, FPGA_QUARTER_SHIFT_MODE_UP },
|
||||
{ 7070, 2560, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 7251, 2580, false, FPGA_QUARTER_SHIFT_MODE_DOWN },
|
||||
{ 0, 0, false, 0 },
|
||||
};
|
||||
// clang-format on
|
||||
#endif
|
||||
|
||||
#endif /*__TUNE_CONFIG_H__*/
|
||||
|
||||
@@ -32,8 +32,6 @@
|
||||
#include "operacake.h"
|
||||
#include "platform_detect.h"
|
||||
|
||||
#define FREQ_ONE_MHZ (1000ULL * 1000)
|
||||
|
||||
#ifndef PRALINE
|
||||
|
||||
#define MIN_LP_FREQ_MHZ (0)
|
||||
@@ -70,16 +68,14 @@
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef PRALINE
|
||||
static uint32_t max2837_freq_nominal_hz = 2560000000;
|
||||
|
||||
uint64_t freq_cache = 100000000;
|
||||
|
||||
/*
|
||||
* Set freq/tuning between 0MHz to 7250 MHz (less than 16bits really used)
|
||||
* hz between 0 to 999999 Hz (not checked)
|
||||
* return false on error or true if success.
|
||||
*/
|
||||
#ifndef PRALINE
|
||||
bool set_freq(const uint64_t freq)
|
||||
{
|
||||
bool success;
|
||||
@@ -137,7 +133,6 @@ bool set_freq(const uint64_t freq)
|
||||
}
|
||||
max283x_set_mode(&max283x, prior_max283x_mode);
|
||||
if (success) {
|
||||
freq_cache = freq;
|
||||
hackrf_ui()->set_frequency(freq);
|
||||
#ifdef HACKRF_ONE
|
||||
operacake_set_range(freq_mhz);
|
||||
@@ -146,26 +141,13 @@ bool set_freq(const uint64_t freq)
|
||||
return success;
|
||||
}
|
||||
|
||||
uint64_t tuning_set_frequency(const tune_config_t* config, const uint64_t frequency_hz)
|
||||
{
|
||||
(void) config;
|
||||
|
||||
bool result = set_freq(frequency_hz);
|
||||
if (!result) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return frequency_hz;
|
||||
}
|
||||
#else
|
||||
bool set_freq(const uint64_t freq)
|
||||
{
|
||||
return tuning_set_frequency(max2831_tune_config_rx_sweep, freq) != 0;
|
||||
}
|
||||
|
||||
uint64_t tuning_set_frequency(const tune_config_t* cfg, const uint64_t freq)
|
||||
bool tuning_set_frequency(
|
||||
const tune_config_t* cfg,
|
||||
const uint64_t freq,
|
||||
const uint32_t offset)
|
||||
{
|
||||
bool found;
|
||||
uint64_t mixer_freq_hz;
|
||||
uint64_t real_mixer_freq_hz;
|
||||
|
||||
@@ -175,16 +157,15 @@ uint64_t tuning_set_frequency(const tune_config_t* cfg, const uint64_t freq)
|
||||
|
||||
const uint16_t freq_mhz = freq / FREQ_ONE_MHZ;
|
||||
|
||||
found = false;
|
||||
for (; cfg->rf_range_end_mhz != 0; cfg++) {
|
||||
if (cfg->rf_range_end_mhz > freq_mhz) {
|
||||
found = true;
|
||||
break;
|
||||
uint64_t rf = freq;
|
||||
if (cfg->shift == FPGA_QUARTER_SHIFT_MODE_DOWN) {
|
||||
if (offset > rf) {
|
||||
rf = offset - rf;
|
||||
} else {
|
||||
rf = rf - offset;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
return false;
|
||||
} else if (cfg->shift == FPGA_QUARTER_SHIFT_MODE_UP) {
|
||||
rf = rf + offset;
|
||||
}
|
||||
|
||||
max2831_mode_t prior_max2831_mode = max2831_mode(&max283x);
|
||||
@@ -192,31 +173,30 @@ uint64_t tuning_set_frequency(const tune_config_t* cfg, const uint64_t freq)
|
||||
|
||||
if (cfg->if_mhz == 0) {
|
||||
rf_path_set_filter(&rf_path, RF_PATH_FILTER_BYPASS);
|
||||
max2831_set_frequency(&max283x, freq);
|
||||
max2831_set_frequency(&max283x, rf);
|
||||
sgpio_cpld_set_mixer_invert(&sgpio_config, 0);
|
||||
} else if (cfg->if_mhz > freq_mhz) {
|
||||
rf_path_set_filter(&rf_path, RF_PATH_FILTER_LOW_PASS);
|
||||
if (cfg->high_lo) {
|
||||
mixer_freq_hz = FREQ_ONE_MHZ * cfg->if_mhz + freq;
|
||||
mixer_freq_hz = FREQ_ONE_MHZ * cfg->if_mhz + rf;
|
||||
real_mixer_freq_hz = mixer_set_frequency(&mixer, mixer_freq_hz);
|
||||
max2831_set_frequency(&max283x, real_mixer_freq_hz - freq);
|
||||
max2831_set_frequency(&max283x, real_mixer_freq_hz - rf);
|
||||
sgpio_cpld_set_mixer_invert(&sgpio_config, 1);
|
||||
} else {
|
||||
mixer_freq_hz = FREQ_ONE_MHZ * cfg->if_mhz - freq;
|
||||
mixer_freq_hz = FREQ_ONE_MHZ * cfg->if_mhz - rf;
|
||||
real_mixer_freq_hz = mixer_set_frequency(&mixer, mixer_freq_hz);
|
||||
max2831_set_frequency(&max283x, real_mixer_freq_hz + freq);
|
||||
max2831_set_frequency(&max283x, real_mixer_freq_hz + rf);
|
||||
sgpio_cpld_set_mixer_invert(&sgpio_config, 0);
|
||||
}
|
||||
} else {
|
||||
rf_path_set_filter(&rf_path, RF_PATH_FILTER_HIGH_PASS);
|
||||
mixer_freq_hz = freq - FREQ_ONE_MHZ * cfg->if_mhz;
|
||||
mixer_freq_hz = rf - FREQ_ONE_MHZ * cfg->if_mhz;
|
||||
real_mixer_freq_hz = mixer_set_frequency(&mixer, mixer_freq_hz);
|
||||
max2831_set_frequency(&max283x, freq - real_mixer_freq_hz);
|
||||
max2831_set_frequency(&max283x, rf - real_mixer_freq_hz);
|
||||
sgpio_cpld_set_mixer_invert(&sgpio_config, 0);
|
||||
}
|
||||
|
||||
max2831_set_mode(&max283x, prior_max2831_mode);
|
||||
freq_cache = freq;
|
||||
hackrf_ui()->set_frequency(freq);
|
||||
operacake_set_range(freq_mhz);
|
||||
return true;
|
||||
|
||||
@@ -30,12 +30,19 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
bool set_freq(const uint64_t freq); // TODO deprecate
|
||||
#define FREQ_ONE_MHZ (1000ULL * 1000)
|
||||
|
||||
bool set_freq(const uint64_t freq);
|
||||
bool set_freq_explicit(
|
||||
const uint64_t if_freq_hz,
|
||||
const uint64_t lo_freq_hz,
|
||||
const rf_path_filter_t path);
|
||||
|
||||
uint64_t tuning_set_frequency(const tune_config_t* config, const uint64_t frequency_hz);
|
||||
#ifdef PRALINE
|
||||
bool tuning_set_frequency(
|
||||
const tune_config_t* cfg,
|
||||
const uint64_t freq,
|
||||
const uint32_t offset);
|
||||
#endif
|
||||
|
||||
#endif /*__TUNING_H__*/
|
||||
|
||||
@@ -53,6 +53,7 @@ void append(char** dest, size_t* capacity, const char* str)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PRALINE
|
||||
static const char* test_result_to_str(test_result_t result)
|
||||
{
|
||||
switch (result) {
|
||||
@@ -67,6 +68,7 @@ static const char* test_result_to_str(test_result_t result)
|
||||
}
|
||||
return "????";
|
||||
}
|
||||
#endif
|
||||
|
||||
void generate_selftest_report(void)
|
||||
{
|
||||
|
||||
@@ -376,8 +376,7 @@ void transceiver_startup(const transceiver_mode_t mode)
|
||||
}
|
||||
|
||||
activate_best_clock_source();
|
||||
hw_sync_mode_t trigger_mode = radio_get_trigger_mode(&radio, RADIO_CHANNEL0);
|
||||
hw_sync_enable(trigger_mode);
|
||||
trigger_enable(radio_get_trigger_enable(&radio, RADIO_CHANNEL0));
|
||||
}
|
||||
|
||||
usb_request_status_t usb_vendor_request_set_transceiver_mode(
|
||||
@@ -407,10 +406,10 @@ usb_request_status_t usb_vendor_request_set_hw_sync_mode(
|
||||
const usb_transfer_stage_t stage)
|
||||
{
|
||||
if (stage == USB_TRANSFER_STAGE_SETUP) {
|
||||
radio_error_t result = radio_set_trigger_mode(
|
||||
radio_error_t result = radio_set_trigger_enable(
|
||||
&radio,
|
||||
RADIO_CHANNEL0,
|
||||
endpoint->setup.value);
|
||||
endpoint->setup.value != 0);
|
||||
if (result == RADIO_OK) {
|
||||
usb_transfer_schedule_ack(endpoint->in);
|
||||
return USB_REQUEST_STATUS_OK;
|
||||
|
||||
@@ -35,7 +35,6 @@ typedef struct {
|
||||
|
||||
extern volatile transceiver_request_t transceiver_request;
|
||||
|
||||
void set_hw_sync_mode(const hw_sync_mode_t new_hw_sync_mode);
|
||||
usb_request_status_t usb_vendor_request_set_transceiver_mode(
|
||||
usb_endpoint_t* const endpoint,
|
||||
const usb_transfer_stage_t stage);
|
||||
|
||||
@@ -1238,7 +1238,7 @@ int ADDCALL hackrf_read_selftest(hackrf_device* device, hackrf_selftest* selftes
|
||||
sizeof(hackrf_selftest),
|
||||
0);
|
||||
|
||||
if (result < sizeof(hackrf_selftest)) {
|
||||
if (result < 2) {
|
||||
last_libusb_error = result;
|
||||
return HACKRF_ERROR_LIBUSB;
|
||||
} else {
|
||||
|
||||
@@ -1081,7 +1081,7 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
bool pass;
|
||||
char msg[511];
|
||||
char msg[4095];
|
||||
} hackrf_selftest;
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user