diff --git a/firmware/common/clock_gen.c b/firmware/common/clock_gen.c index 3080c4365..b62308ceb 100644 --- a/firmware/common/clock_gen.c +++ b/firmware/common/clock_gen.c @@ -23,7 +23,7 @@ #include -#include "hackrf_core.h" +#include "drivers.h" #include "hackrf_ui.h" #include "i2c_bus.h" #include "platform_detect.h" diff --git a/firmware/common/clock_io.c b/firmware/common/clock_io.c index 0a8b48d9b..279eb8c5e 100644 --- a/firmware/common/clock_io.c +++ b/firmware/common/clock_io.c @@ -30,9 +30,9 @@ #include #include +#include "drivers.h" #include "gpdma.h" #include "gpio.h" -#include "hackrf_core.h" #ifdef IS_PRALINE #include "fpga.h" #include "platform_gpio.h" diff --git a/firmware/common/cpu_clock.c b/firmware/common/cpu_clock.c index 1bbd95718..b69f0773b 100644 --- a/firmware/common/cpu_clock.c +++ b/firmware/common/cpu_clock.c @@ -29,7 +29,7 @@ #endif #include "delay.h" -#include "hackrf_core.h" +#include "drivers.h" #include "i2c_bus.h" #ifdef IS_NOT_RAD1O #include "platform_detect.h" diff --git a/firmware/common/da7219.c b/firmware/common/da7219.c index 376e04a5e..5af022d2c 100644 --- a/firmware/common/da7219.c +++ b/firmware/common/da7219.c @@ -22,7 +22,7 @@ #include #include "da7219.h" -#include "hackrf_core.h" +#include "drivers.h" #include "i2c_bus.h" #define DA7219_REG_CHIP_ID1 0x81 diff --git a/firmware/common/drivers.c b/firmware/common/drivers.c new file mode 100644 index 000000000..a6bd536a3 --- /dev/null +++ b/firmware/common/drivers.c @@ -0,0 +1,178 @@ +/* + * Copyright 2026 Great Scott Gadgets + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "drivers.h" + +#include + +#include +#include + +#include "clock_gen.h" +#include "i2c_lpc.h" +#include "max283x.h" +#include "max5864_target.h" +#include "spi_bus.h" +#include "w25q80bv_target.h" +#if defined(IS_PRALINE) + #include "fpga.h" + #include "ice40_spi.h" +#endif + +i2c_bus_t i2c0 = { + .obj = (void*) I2C0_BASE, + .start = i2c_lpc_start, + .stop = i2c_lpc_stop, + .transfer = i2c_lpc_transfer, +}; + +i2c_bus_t i2c1 = { + .obj = (void*) I2C1_BASE, + .start = i2c_lpc_start, + .stop = i2c_lpc_stop, + .transfer = i2c_lpc_transfer, +}; + +// const i2c_lpc_config_t i2c_config_si5351c_slow_clock = { +// .duty_cycle_count = 15, +// }; + +const i2c_lpc_config_t i2c_config_si5351c_fast_clock = { + .duty_cycle_count = 255, +}; + +si5351c_driver_t clock_gen = { + .bus = &i2c0, + .i2c_address = 0x60, +}; + +ssp_config_t ssp_config_max283x = { + /* 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 + .serial_clock_rate = 21, + .clock_prescale_rate = 2, +}; + +max283x_driver_t max283x = {}; + +ssp_config_t ssp_config_max5864 = { + /* 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_8BITS, + .serial_clock_rate = 21, + .clock_prescale_rate = 2, +}; + +spi_bus_t spi_bus_ssp1 = { + .obj = (void*) SSP1_BASE, + .config = &ssp_config_max5864, + .start = spi_ssp_start, + .stop = spi_ssp_stop, + .transfer = spi_ssp_transfer, + .transfer_gather = spi_ssp_transfer_gather, +}; + +max5864_driver_t max5864 = { + .bus = &spi_bus_ssp1, + .target_init = max5864_target_init, +}; + +ssp_config_t ssp_config_w25q80bv = { + .data_bits = SSP_DATA_8BITS, + .serial_clock_rate = 2, + .clock_prescale_rate = 2, +}; + +spi_bus_t spi_bus_ssp0 = { + .obj = (void*) SSP0_BASE, + .config = &ssp_config_w25q80bv, + .start = spi_ssp_start, + .stop = spi_ssp_stop, + .transfer = spi_ssp_transfer, + .transfer_gather = spi_ssp_transfer_gather, +}; + +w25q80bv_driver_t spi_flash = { + .bus = &spi_bus_ssp0, + .target_init = w25q80bv_target_init, +}; + +sgpio_config_t sgpio_config = { + .slice_mode_multislice = true, +}; + +#ifdef IS_PRALINE +ssp_config_t ssp_config_ice40_fpga = { + .data_bits = SSP_DATA_8BITS, + .spi_mode = SSP_CPOL_1_CPHA_1, + .serial_clock_rate = 21, + .clock_prescale_rate = 2, +}; + +ice40_spi_driver_t ice40 = { + .bus = &spi_bus_ssp1, +}; + +fpga_driver_t fpga = { + .bus = &ice40, +}; +#endif + +radio_t radio = { + .sample_rate_cb = sample_rate_set, +}; + +rf_path_t rf_path = { + .switchctrl = 0, +}; + +jtag_gpio_t jtag_gpio_cpld = {}; + +jtag_t jtag_cpld = { + .gpio = &jtag_gpio_cpld, +}; + +void ssp1_set_mode_max283x(void) +{ + spi_bus_start(&spi_bus_ssp1, &ssp_config_max283x); +} + +void ssp1_set_mode_max5864(void) +{ + spi_bus_start(max5864.bus, &ssp_config_max5864); +} + +#ifdef IS_PRALINE +void ssp1_set_mode_ice40(void) +{ + spi_bus_start(&spi_bus_ssp1, &ssp_config_ice40_fpga); +} +#endif diff --git a/firmware/common/drivers.h b/firmware/common/drivers.h new file mode 100644 index 000000000..6aa45f87d --- /dev/null +++ b/firmware/common/drivers.h @@ -0,0 +1,77 @@ +/* + * Copyright 2026 Great Scott Gadgets + * + * This file is part of HackRF. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cpld_jtag.h" +#include "i2c_bus.h" +#include "i2c_lpc.h" +#include "max283x.h" +#include "max5864.h" +#include "mixer.h" +#include "platform_detect.h" // IWYU pragma: keep +#include "radio.h" +#include "rf_path.h" +#include "sgpio.h" +#include "si5351c.h" +#include "spi_ssp.h" +#include "w25q80bv.h" +#if defined(IS_PRALINE) + #include "fpga.h" + #include "ice40_spi.h" +#endif + +/* TODO: Hide these configurations */ +extern const i2c_lpc_config_t i2c_config_si5351c_fast_clock; +extern si5351c_driver_t clock_gen; +extern ssp_config_t ssp_config_max283x; +extern ssp_config_t ssp_config_max5864; +extern ssp_config_t ssp_config_w25q80bv; + +#if defined(IS_PRALINE) +extern ssp_config_t ssp_config_ice40_fpga; +extern ice40_spi_driver_t ice40; +extern fpga_driver_t fpga; +#endif +extern max283x_driver_t max283x; +extern max5864_driver_t max5864; +extern mixer_driver_t mixer; +extern w25q80bv_driver_t spi_flash; +extern sgpio_config_t sgpio_config; +extern radio_t radio; +extern rf_path_t rf_path; +extern jtag_gpio_t jtag_gpio_cpld; +extern jtag_t jtag_cpld; +extern i2c_bus_t i2c0; + +void ssp1_set_mode_max283x(void); +void ssp1_set_mode_max5864(void); +#if defined(IS_PRALINE) +void ssp1_set_mode_ice40(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/firmware/common/fpga.c b/firmware/common/fpga.c index 9c4d55f2d..172810a82 100644 --- a/firmware/common/fpga.c +++ b/firmware/common/fpga.c @@ -20,11 +20,11 @@ */ #include "fpga.h" +#include "fpga_regs.def" #include -#include "fpga_regs.def" -#include "hackrf_core.h" +#include "drivers.h" #include "ice40_spi.h" /* Set up all registers according to the loaded bitstream's defaults. */ diff --git a/firmware/common/fpga_image.c b/firmware/common/fpga_image.c index dc88556b7..989d16b2f 100644 --- a/firmware/common/fpga_image.c +++ b/firmware/common/fpga_image.c @@ -23,8 +23,8 @@ #include #include +#include "drivers.h" #include "fpga.h" -#include "hackrf_core.h" #include "ice40_spi.h" #include "lz4_blk.h" #include "selftest.h" diff --git a/firmware/common/fpga_selftest.c b/firmware/common/fpga_selftest.c index fe0a96f93..30e70ea27 100644 --- a/firmware/common/fpga_selftest.c +++ b/firmware/common/fpga_selftest.c @@ -25,9 +25,9 @@ #include "clock_gen.h" #include "delay.h" +#include "drivers.h" #include "fixed_point.h" #include "fpga.h" -#include "hackrf_core.h" #include "ice40_spi.h" #include "m0_state.h" #include "max283x.h" diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 086e3961d..2a7bc3763 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -21,167 +21,23 @@ * Boston, MA 02110-1301, USA. */ -#include +#include "hackrf_core.h" -#include #include #include -#include "platform_detect.h" - -#include "clock_gen.h" +#include "drivers.h" #include "gpio.h" -#include "hackrf_core.h" -#include "i2c_lpc.h" #include "leds.h" -#include "max283x.h" -#include "max5864_target.h" +#include "mixer.h" +#include "platform_detect.h" #include "platform_gpio.h" #include "platform_scu.h" #include "power.h" -#include "spi_bus.h" -#include "w25q80bv_target.h" -#ifdef IS_PRALINE +#include "rf_path.h" +#include "sgpio.h" +#if defined(IS_PRALINE) #include "clock_io.h" - #include "ice40_spi.h" -#endif - -i2c_bus_t i2c0 = { - .obj = (void*) I2C0_BASE, - .start = i2c_lpc_start, - .stop = i2c_lpc_stop, - .transfer = i2c_lpc_transfer, -}; - -i2c_bus_t i2c1 = { - .obj = (void*) I2C1_BASE, - .start = i2c_lpc_start, - .stop = i2c_lpc_stop, - .transfer = i2c_lpc_transfer, -}; - -// const i2c_lpc_config_t i2c_config_si5351c_slow_clock = { -// .duty_cycle_count = 15, -// }; - -const i2c_lpc_config_t i2c_config_si5351c_fast_clock = { - .duty_cycle_count = 255, -}; - -si5351c_driver_t clock_gen = { - .bus = &i2c0, - .i2c_address = 0x60, -}; - -static ssp_config_t ssp_config_max283x = { - /* 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 - .serial_clock_rate = 21, - .clock_prescale_rate = 2, -}; - -max283x_driver_t max283x = {}; - -static ssp_config_t ssp_config_max5864 = { - /* 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_8BITS, - .serial_clock_rate = 21, - .clock_prescale_rate = 2, -}; - -spi_bus_t spi_bus_ssp1 = { - .obj = (void*) SSP1_BASE, - .config = &ssp_config_max5864, - .start = spi_ssp_start, - .stop = spi_ssp_stop, - .transfer = spi_ssp_transfer, - .transfer_gather = spi_ssp_transfer_gather, -}; - -max5864_driver_t max5864 = { - .bus = &spi_bus_ssp1, - .target_init = max5864_target_init, -}; - -ssp_config_t ssp_config_w25q80bv = { - .data_bits = SSP_DATA_8BITS, - .serial_clock_rate = 2, - .clock_prescale_rate = 2, -}; - -static spi_bus_t spi_bus_ssp0 = { - .obj = (void*) SSP0_BASE, - .config = &ssp_config_w25q80bv, - .start = spi_ssp_start, - .stop = spi_ssp_stop, - .transfer = spi_ssp_transfer, - .transfer_gather = spi_ssp_transfer_gather, -}; - -w25q80bv_driver_t spi_flash = { - .bus = &spi_bus_ssp0, - .target_init = w25q80bv_target_init, -}; - -sgpio_config_t sgpio_config = { - .slice_mode_multislice = true, -}; - -#ifdef IS_PRALINE -static ssp_config_t ssp_config_ice40_fpga = { - .data_bits = SSP_DATA_8BITS, - .spi_mode = SSP_CPOL_1_CPHA_1, - .serial_clock_rate = 21, - .clock_prescale_rate = 2, -}; - -ice40_spi_driver_t ice40 = { - .bus = &spi_bus_ssp1, -}; - -fpga_driver_t fpga = { - .bus = &ice40, -}; -#endif - -radio_t radio = { - .sample_rate_cb = sample_rate_set, -}; - -rf_path_t rf_path; - -jtag_gpio_t jtag_gpio_cpld; - -jtag_t jtag_cpld = { - .gpio = &jtag_gpio_cpld, -}; - -void ssp1_set_mode_max283x(void) -{ - spi_bus_start(&spi_bus_ssp1, &ssp_config_max283x); -} - -void ssp1_set_mode_max5864(void) -{ - spi_bus_start(max5864.bus, &ssp_config_max5864); -} - -#ifdef IS_PRALINE -void ssp1_set_mode_ice40(void) -{ - spi_bus_start(&spi_bus_ssp1, &ssp_config_ice40_fpga); -} #endif void pin_shutdown(void) diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 6e0c1cc0a..20ae76f04 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -27,50 +27,6 @@ extern "C" { #endif -#include "cpld_jtag.h" -#include "i2c_bus.h" -#include "i2c_lpc.h" -#include "max283x.h" -#include "max5864.h" -#include "mixer.h" -#include "platform_detect.h" // IWYU pragma: keep -#include "radio.h" -#include "rf_path.h" -#include "sgpio.h" -#include "si5351c.h" -#include "spi_ssp.h" -#include "w25q80bv.h" -#ifdef IS_PRALINE - #include "fpga.h" - #include "ice40_spi.h" -#endif - -/* TODO: Hide these configurations */ -extern const i2c_lpc_config_t i2c_config_si5351c_fast_clock; -extern si5351c_driver_t clock_gen; -extern ssp_config_t ssp_config_w25q80bv; - -extern max283x_driver_t max283x; -#ifdef IS_PRALINE -extern ice40_spi_driver_t ice40; -extern fpga_driver_t fpga; -#endif -extern max283x_driver_t max283x; -extern max5864_driver_t max5864; -extern mixer_driver_t mixer; -extern w25q80bv_driver_t spi_flash; -extern sgpio_config_t sgpio_config; -extern radio_t radio; -extern rf_path_t rf_path; -extern jtag_t jtag_cpld; -extern i2c_bus_t i2c0; - -void ssp1_set_mode_max283x(void); -void ssp1_set_mode_max5864(void); -#ifdef IS_PRALINE -void ssp1_set_mode_ice40(void); -#endif - void pin_shutdown(void); void pin_setup(void); diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index 61d785120..24ca6541b 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -26,9 +26,9 @@ #include +#include "drivers.h" #include "gpio.h" #include "gpio_lpc.h" -#include "hackrf_core.h" #include "i2c_bus.h" #include "operacake_sctimer.h" #include "platform_scu.h" diff --git a/firmware/common/portapack.c b/firmware/common/portapack.c index 455df8712..f25a4a6e8 100644 --- a/firmware/common/portapack.c +++ b/firmware/common/portapack.c @@ -26,9 +26,9 @@ #include "cpld_jtag.h" #include "delay.h" +#include "drivers.h" #include "gpio.h" #include "gpio_lpc.h" -#include "hackrf_core.h" #include "platform_gpio.h" #include "platform_scu.h" diff --git a/firmware/common/radio.c b/firmware/common/radio.c index 65412c4b7..2d3ce8c38 100644 --- a/firmware/common/radio.c +++ b/firmware/common/radio.c @@ -26,10 +26,10 @@ #include #include "clock_io.h" +#include "drivers.h" #include "fixed_point.h" -#include "hackrf_core.h" -#include "mixer.h" #include "max283x.h" +#include "mixer.h" #include "platform_detect.h" #include "rf_path.h" #include "transceiver_mode.h" diff --git a/firmware/common/rf_path.c b/firmware/common/rf_path.c index 6cadea1c7..0506a3bfa 100644 --- a/firmware/common/rf_path.c +++ b/firmware/common/rf_path.c @@ -23,7 +23,7 @@ #include "rf_path.h" -#include "hackrf_core.h" +#include "drivers.h" #include "max283x.h" #include "max5864.h" #include "mixer.h" diff --git a/firmware/common/rom_iap.c b/firmware/common/rom_iap.c index a8f185ad1..09da0b7cc 100644 --- a/firmware/common/rom_iap.c +++ b/firmware/common/rom_iap.c @@ -22,7 +22,7 @@ #include -#include "hackrf_core.h" +#include "drivers.h" #include "rom_iap.h" #include "spi_bus.h" #include "w25q80bv.h" diff --git a/firmware/common/ui_rad1o.c b/firmware/common/ui_rad1o.c index 878e9e746..757e11f1e 100644 --- a/firmware/common/ui_rad1o.c +++ b/firmware/common/ui_rad1o.c @@ -27,7 +27,7 @@ #include #include "clock_gen.h" -#include "hackrf_core.h" +#include "drivers.h" #include "rf_path.h" #include "transceiver_mode.h" #ifdef IS_NOT_RAD1O diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 6384acdc0..664f23f19 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -168,6 +168,7 @@ endmacro() macro(DeclareTargets) SET(SRC_M4 ${SRC_M4} + ${PATH_HACKRF_FIRMWARE_COMMON}/drivers.c ${PATH_HACKRF_FIRMWARE_COMMON}/power.c ${PATH_HACKRF_FIRMWARE_COMMON}/cpu_clock.c ${PATH_HACKRF_FIRMWARE_COMMON}/delay.c diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index bd2c59649..982a84bf3 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include diff --git a/firmware/hackrf_usb/usb_api_cpld.c b/firmware/hackrf_usb/usb_api_cpld.c index 7381601d2..ed2beeda6 100644 --- a/firmware/hackrf_usb/usb_api_cpld.c +++ b/firmware/hackrf_usb/usb_api_cpld.c @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include #include diff --git a/firmware/hackrf_usb/usb_api_register.c b/firmware/hackrf_usb/usb_api_register.c index 632ce0e51..58c1684c7 100644 --- a/firmware/hackrf_usb/usb_api_register.c +++ b/firmware/hackrf_usb/usb_api_register.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include #include diff --git a/firmware/hackrf_usb/usb_api_spiflash.c b/firmware/hackrf_usb/usb_api_spiflash.c index d422836eb..2c944a104 100644 --- a/firmware/hackrf_usb/usb_api_spiflash.c +++ b/firmware/hackrf_usb/usb_api_spiflash.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include #include diff --git a/firmware/hackrf_usb/usb_api_sweep.c b/firmware/hackrf_usb/usb_api_sweep.c index 4f7d8e571..ae3b399d1 100644 --- a/firmware/hackrf_usb/usb_api_sweep.c +++ b/firmware/hackrf_usb/usb_api_sweep.c @@ -25,8 +25,8 @@ #include +#include #include -#include #include #include #include diff --git a/firmware/hackrf_usb/usb_api_transceiver.c b/firmware/hackrf_usb/usb_api_transceiver.c index 153b760bf..b6c6782be 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.c +++ b/firmware/hackrf_usb/usb_api_transceiver.c @@ -27,8 +27,8 @@ #include #include +#include #include -#include #include #include #include