h1r9: use single SSP configuration for MAX283x

During r9 hardware development it was thought that the MAX2839 would use
a different GPIO pin for chip select, but it ended up being the same pin
as is used for MAX2837 on other hardware revisions.

This takes the MAX283x abstraction a bit further and fixes a bug with
hackrf_debug -m.
This commit is contained in:
Michael Ossmann
2023-01-08 08:21:27 -05:00
parent 8051675c60
commit c19f85ef24
8 changed files with 25 additions and 72 deletions

View File

@ -60,8 +60,8 @@ static struct gpio_t gpio_led[] = {
// clang-format off // clang-format off
static struct gpio_t gpio_1v8_enable = GPIO(3, 6); static struct gpio_t gpio_1v8_enable = GPIO(3, 6);
/* MAX2837 GPIO (XCVR_CTL) PinMux */ /* MAX283x GPIO (XCVR_CTL) PinMux */
static struct gpio_t gpio_max2837_select = GPIO(0, 15); static struct gpio_t gpio_max283x_select = GPIO(0, 15);
/* MAX5864 SPI chip select (AD_CS) GPIO PinMux */ /* MAX5864 SPI chip select (AD_CS) GPIO PinMux */
static struct gpio_t gpio_max5864_select = GPIO(2, 7); static struct gpio_t gpio_max5864_select = GPIO(2, 7);
@ -172,7 +172,7 @@ si5351c_driver_t clock_gen = {
.i2c_address = 0x60, .i2c_address = 0x60,
}; };
const ssp_config_t ssp_config_max2837 = { const ssp_config_t ssp_config_max283x = {
/* FIXME speed up once everything is working reliably */ /* FIXME speed up once everything is working reliably */
/* /*
// Freq About 0.0498MHz / 49.8KHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz // Freq About 0.0498MHz / 49.8KHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
@ -183,21 +183,7 @@ const ssp_config_t ssp_config_max2837 = {
.data_bits = SSP_DATA_16BITS, .data_bits = SSP_DATA_16BITS,
.serial_clock_rate = 21, .serial_clock_rate = 21,
.clock_prescale_rate = 2, .clock_prescale_rate = 2,
.gpio_select = &gpio_max2837_select, .gpio_select = &gpio_max283x_select,
};
const ssp_config_t ssp_config_max2839 = {
/* FIXME speed up once everything is working reliably */
/*
// Freq About 0.0498MHz / 49.8KHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
const uint8_t serial_clock_rate = 32;
const uint8_t clock_prescale_rate = 128;
*/
// Freq About 4.857MHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
.data_bits = SSP_DATA_16BITS,
.serial_clock_rate = 21,
.clock_prescale_rate = 2,
.gpio_select = &gpio_max2837_select,
}; };
const ssp_config_t ssp_config_max5864 = { const ssp_config_t ssp_config_max5864 = {
@ -868,14 +854,9 @@ clock_source_t activate_best_clock_source(void)
return source; return source;
} }
void ssp1_set_mode_max2837(void) void ssp1_set_mode_max283x(void)
{ {
spi_bus_start(max2837.bus, &ssp_config_max2837); spi_bus_start(&spi_bus_ssp1, &ssp_config_max283x);
}
void ssp1_set_mode_max2839(void)
{
spi_bus_start(max2839.bus, &ssp_config_max2839);
} }
void ssp1_set_mode_max5864(void) void ssp1_set_mode_max5864(void)
@ -974,11 +955,7 @@ void pin_setup(void)
/* enable input on SCL and SDA pins */ /* enable input on SCL and SDA pins */
SCU_SFSI2C0 = SCU_I2C0_NOMINAL; SCU_SFSI2C0 = SCU_I2C0_NOMINAL;
if (detected_platform() == BOARD_ID_HACKRF1_R9) { spi_bus_start(&spi_bus_ssp1, &ssp_config_max283x);
spi_bus_start(&spi_bus_ssp1, &ssp_config_max2839);
} else {
spi_bus_start(&spi_bus_ssp1, &ssp_config_max2837);
}
mixer_bus_setup(&mixer); mixer_bus_setup(&mixer);

View File

@ -35,8 +35,6 @@ extern "C" {
#include "spi_ssp.h" #include "spi_ssp.h"
#include "max283x.h" #include "max283x.h"
#include "max2837.h"
#include "max2839.h"
#include "max5864.h" #include "max5864.h"
#include "mixer.h" #include "mixer.h"
#include "w25q80bv.h" #include "w25q80bv.h"
@ -270,13 +268,10 @@ void delay_us_at_mhz(uint32_t us, uint32_t mhz);
/* TODO: Hide these configurations */ /* TODO: Hide these configurations */
extern si5351c_driver_t clock_gen; extern si5351c_driver_t clock_gen;
extern const ssp_config_t ssp_config_w25q80bv; extern const ssp_config_t ssp_config_w25q80bv;
extern const ssp_config_t ssp_config_max2837; extern const ssp_config_t ssp_config_max283x;
extern const ssp_config_t ssp_config_max2839;
extern const ssp_config_t ssp_config_max5864; extern const ssp_config_t ssp_config_max5864;
extern max283x_driver_t max283x; extern max283x_driver_t max283x;
extern max2837_driver_t max2837;
extern max2839_driver_t max2839; //FIXME xcvr hal
extern max5864_driver_t max5864; extern max5864_driver_t max5864;
extern mixer_driver_t mixer; extern mixer_driver_t mixer;
extern w25q80bv_driver_t spi_flash; extern w25q80bv_driver_t spi_flash;
@ -286,8 +281,7 @@ extern jtag_t jtag_cpld;
extern i2c_bus_t i2c0; extern i2c_bus_t i2c0;
void cpu_clock_init(void); void cpu_clock_init(void);
void ssp1_set_mode_max2837(void); void ssp1_set_mode_max283x(void);
void ssp1_set_mode_max2839(void);
void ssp1_set_mode_max5864(void); void ssp1_set_mode_max5864(void);
void pin_setup(void); void pin_setup(void);

View File

@ -76,9 +76,6 @@ void max283x_reg_write(max283x_driver_t* const drv, uint8_t r, uint16_t v);
* provided routines for those operations. */ * provided routines for those operations. */
void max283x_regs_commit(max283x_driver_t* const drv); void max283x_regs_commit(max283x_driver_t* const drv);
//max283x_mode_t max283x_mode(max283x_driver_t* const drv);
//void max283x_set_mode(max283x_driver_t* const drv, const max283x_mode_t new_mode);
max283x_mode_t max283x_mode(max283x_driver_t* const drv); max283x_mode_t max283x_mode(max283x_driver_t* const drv);
void max283x_set_mode(max283x_driver_t* const drv, const max283x_mode_t new_mode); void max283x_set_mode(max283x_driver_t* const drv, const max283x_mode_t new_mode);

View File

@ -32,8 +32,6 @@
#include "platform_detect.h" #include "platform_detect.h"
#include "mixer.h" #include "mixer.h"
#include "max283x.h" #include "max283x.h"
#include "max2837.h"
#include "max2839.h"
#include "max5864.h" #include "max5864.h"
#include "sgpio.h" #include "sgpio.h"
@ -369,11 +367,10 @@ void rf_path_init(rf_path_t* const rf_path)
max5864_setup(&max5864); max5864_setup(&max5864);
max5864_shutdown(&max5864); max5864_shutdown(&max5864);
ssp1_set_mode_max283x();
if (detected_platform() == BOARD_ID_HACKRF1_R9) { if (detected_platform() == BOARD_ID_HACKRF1_R9) {
ssp1_set_mode_max2839();
max283x_setup(&max283x, MAX2839_VARIANT); max283x_setup(&max283x, MAX2839_VARIANT);
} else { } else {
ssp1_set_mode_max2837();
max283x_setup(&max283x, MAX2837_VARIANT); max283x_setup(&max283x, MAX2837_VARIANT);
} }
max283x_start(&max283x); max283x_start(&max283x);
@ -404,11 +401,7 @@ void rf_path_set_direction(rf_path_t* const rf_path, const rf_path_direction_t d
} }
ssp1_set_mode_max5864(); ssp1_set_mode_max5864();
max5864_tx(&max5864); max5864_tx(&max5864);
if (detected_platform() == BOARD_ID_HACKRF1_R9) { ssp1_set_mode_max283x();
ssp1_set_mode_max2839();
} else {
ssp1_set_mode_max2837();
}
max283x_tx(&max283x); max283x_tx(&max283x);
sgpio_configure(&sgpio_config, SGPIO_DIRECTION_TX); sgpio_configure(&sgpio_config, SGPIO_DIRECTION_TX);
break; break;
@ -427,11 +420,7 @@ void rf_path_set_direction(rf_path_t* const rf_path, const rf_path_direction_t d
} }
ssp1_set_mode_max5864(); ssp1_set_mode_max5864();
max5864_rx(&max5864); max5864_rx(&max5864);
if (detected_platform() == BOARD_ID_HACKRF1_R9) { ssp1_set_mode_max283x();
ssp1_set_mode_max2839();
} else {
ssp1_set_mode_max2837();
}
max283x_rx(&max283x); max283x_rx(&max283x);
sgpio_configure(&sgpio_config, SGPIO_DIRECTION_RX); sgpio_configure(&sgpio_config, SGPIO_DIRECTION_RX);
break; break;
@ -447,11 +436,7 @@ void rf_path_set_direction(rf_path_t* const rf_path, const rf_path_direction_t d
mixer_disable(&mixer); mixer_disable(&mixer);
ssp1_set_mode_max5864(); ssp1_set_mode_max5864();
max5864_standby(&max5864); max5864_standby(&max5864);
if (detected_platform() == BOARD_ID_HACKRF1_R9) { ssp1_set_mode_max283x();
ssp1_set_mode_max2839();
} else {
ssp1_set_mode_max2837();
}
max283x_set_mode(&max283x, MAX283x_MODE_STANDBY); max283x_set_mode(&max283x, MAX283x_MODE_STANDBY);
sgpio_configure(&sgpio_config, SGPIO_DIRECTION_RX); sgpio_configure(&sgpio_config, SGPIO_DIRECTION_RX);
break; break;

View File

@ -202,7 +202,7 @@ static void ui_update(void)
rad1o_lcdDisplay(); rad1o_lcdDisplay();
// Don't ask... // Don't ask...
ssp1_set_mode_max2837(); ssp1_set_mode_max283x();
} }
static void rad1o_ui_init(void) static void rad1o_ui_init(void)
@ -217,7 +217,7 @@ static void rad1o_ui_deinit(void)
rad1o_lcdDeInit(); rad1o_lcdDeInit();
enabled = false; enabled = false;
// Don't ask... // Don't ask...
ssp1_set_mode_max2837(); ssp1_set_mode_max283x();
} }
static void rad1o_ui_set_frequency(uint64_t frequency) static void rad1o_ui_set_frequency(uint64_t frequency)

View File

@ -66,8 +66,8 @@ extern uint32_t _etext_ram, _text_ram, _etext_rom;
static usb_request_handler_fn vendor_request_handler[] = { static usb_request_handler_fn vendor_request_handler[] = {
NULL, NULL,
usb_vendor_request_set_transceiver_mode, usb_vendor_request_set_transceiver_mode,
usb_vendor_request_write_max2837, usb_vendor_request_write_max283x,
usb_vendor_request_read_max2837, usb_vendor_request_read_max283x,
usb_vendor_request_write_si5351c, usb_vendor_request_write_si5351c,
usb_vendor_request_read_si5351c, usb_vendor_request_read_si5351c,
usb_vendor_request_set_sample_rate_frac, usb_vendor_request_set_sample_rate_frac,

View File

@ -25,7 +25,7 @@
#include <hackrf_core.h> #include <hackrf_core.h>
#include <usb_queue.h> #include <usb_queue.h>
#include <max2837.h> #include <max283x.h>
#include <rffc5071.h> #include <rffc5071.h>
#include <stddef.h> #include <stddef.h>
@ -33,15 +33,15 @@
#include <hackrf_core.h> #include <hackrf_core.h>
usb_request_status_t usb_vendor_request_write_max2837( usb_request_status_t usb_vendor_request_write_max283x(
usb_endpoint_t* const endpoint, usb_endpoint_t* const endpoint,
const usb_transfer_stage_t stage) const usb_transfer_stage_t stage)
{ {
if (stage == USB_TRANSFER_STAGE_SETUP) { if (stage == USB_TRANSFER_STAGE_SETUP) {
if (endpoint->setup.index < MAX2837_NUM_REGS) { if (endpoint->setup.index < MAX2837_NUM_REGS) {
if (endpoint->setup.value < MAX2837_DATA_REGS_MAX_VALUE) { if (endpoint->setup.value < MAX2837_DATA_REGS_MAX_VALUE) {
max2837_reg_write( max283x_reg_write(
&max2837, &max283x,
endpoint->setup.index, endpoint->setup.index,
endpoint->setup.value); endpoint->setup.value);
usb_transfer_schedule_ack(endpoint->in); usb_transfer_schedule_ack(endpoint->in);
@ -54,14 +54,14 @@ usb_request_status_t usb_vendor_request_write_max2837(
} }
} }
usb_request_status_t usb_vendor_request_read_max2837( usb_request_status_t usb_vendor_request_read_max283x(
usb_endpoint_t* const endpoint, usb_endpoint_t* const endpoint,
const usb_transfer_stage_t stage) const usb_transfer_stage_t stage)
{ {
if (stage == USB_TRANSFER_STAGE_SETUP) { if (stage == USB_TRANSFER_STAGE_SETUP) {
if (endpoint->setup.index < MAX2837_NUM_REGS) { if (endpoint->setup.index < MAX2837_NUM_REGS) {
const uint16_t value = const uint16_t value =
max2837_reg_read(&max2837, endpoint->setup.index); max283x_reg_read(&max283x, endpoint->setup.index);
endpoint->buffer[0] = value & 0xff; endpoint->buffer[0] = value & 0xff;
endpoint->buffer[1] = value >> 8; endpoint->buffer[1] = value >> 8;
usb_transfer_schedule_block( usb_transfer_schedule_block(

View File

@ -27,10 +27,10 @@
#include <usb_type.h> #include <usb_type.h>
#include <usb_request.h> #include <usb_request.h>
usb_request_status_t usb_vendor_request_write_max2837( usb_request_status_t usb_vendor_request_write_max283x(
usb_endpoint_t* const endpoint, usb_endpoint_t* const endpoint,
const usb_transfer_stage_t stage); const usb_transfer_stage_t stage);
usb_request_status_t usb_vendor_request_read_max2837( usb_request_status_t usb_vendor_request_read_max283x(
usb_endpoint_t* const endpoint, usb_endpoint_t* const endpoint,
const usb_transfer_stage_t stage); const usb_transfer_stage_t stage);
usb_request_status_t usb_vendor_request_write_si5351c( usb_request_status_t usb_vendor_request_write_si5351c(