diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1cb8b7df5a53d3ae8288e4c4c926e2d89e134a19..2cdba5fe17beac41331e917fb33499c85b1a12b6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -57,13 +57,25 @@ sbs_target(runcam-settings stm32f407vg_stm32f4discovery)
 add_executable(sdcard-benchmark src/entrypoints/sdcard-benchmark.cpp)
 sbs_target(sdcard-benchmark stm32f429zi_skyward_death_stack_x)
 
-add_executable(sx1278fsk-serial src/entrypoints/sx1278-serial.cpp)
-target_compile_definitions(sx1278fsk-serial PRIVATE SX1278_IS_FSK)
-sbs_target(sx1278fsk-serial stm32f429zi_skyward_groundstation_v2)
+add_executable(sx1278fsk-ra01-serial src/entrypoints/sx1278-serial.cpp)
+target_compile_definitions(sx1278fsk-ra01-serial PRIVATE SX1278_IS_FSK)
+sbs_target(sx1278fsk-ra01-serial stm32f429zi_skyward_groundstation_v2)
 
-add_executable(sx1278lora-serial src/entrypoints/sx1278-serial.cpp)
-target_compile_definitions(sx1278lora-serial PRIVATE SX1278_IS_LORA)
-sbs_target(sx1278lora-serial stm32f429zi_skyward_groundstation_v2)
+add_executable(sx1278lora-ra01-serial src/entrypoints/sx1278-serial.cpp)
+target_compile_definitions(sx1278lora-ra01-serial PRIVATE SX1278_IS_LORA)
+sbs_target(sx1278lora-ra01-serial stm32f429zi_skyward_groundstation_v2)
+
+add_executable(sx1278fsk-skyward433-serial src/entrypoints/sx1278-serial.cpp)
+target_compile_definitions(sx1278fsk-skyward433-serial PRIVATE SX1278_IS_FSK SX1278_IS_SKYWARD433)
+sbs_target(sx1278fsk-skyward433-serial stm32f429zi_skyward_groundstation_v2)
+
+add_executable(sx1278lora-skyward433-serial src/entrypoints/sx1278-serial.cpp)
+target_compile_definitions(sx1278lora-skyward433-serial PRIVATE SX1278_IS_LORA SX1278_IS_SKYWARD433)
+sbs_target(sx1278lora-skyward433-serial stm32f429zi_skyward_groundstation_v2)
+
+add_executable(sx1278fsk-ebyterig-serial src/entrypoints/sx1278-serial.cpp)
+target_compile_definitions(sx1278fsk-ebyterig-serial PRIVATE SX1278_IS_FSK)
+sbs_target(sx1278fsk-ebyterig-serial stm32f429zi_skyward_rig)
 
 #-----------------------------------------------------------------------------#
 #                                    Tests                                    #
@@ -288,14 +300,14 @@ add_executable(test-sx1278fsk-rx src/tests/radio/sx1278/test-sx1278-bench-serial
 target_compile_definitions(test-sx1278fsk-rx PRIVATE DISABLE_TX)
 sbs_target(test-sx1278fsk-rx stm32f429zi_skyward_groundstation_v2)
 
-add_executable(test-sx1278fsk-gui-rx src/tests/radio/sx1278/test-sx1278-bench-gui.cpp)
-target_compile_definitions(test-sx1278fsk-gui-rx PRIVATE DISABLE_TX)
-sbs_target(test-sx1278fsk-gui-rx stm32f429zi_skyward_groundstation_v2)
-
 add_executable(test-sx1278fsk-gui-tx src/tests/radio/sx1278/test-sx1278-bench-gui.cpp)
 target_compile_definitions(test-sx1278fsk-gui-tx PRIVATE DISABLE_RX)
 sbs_target(test-sx1278fsk-gui-tx stm32f429zi_skyward_groundstation_v2)
 
+add_executable(test-sx1278fsk-gui-rx src/tests/radio/sx1278/test-sx1278-bench-gui.cpp)
+target_compile_definitions(test-sx1278fsk-gui-rx PRIVATE DISABLE_TX)
+sbs_target(test-sx1278fsk-gui-rx stm32f429zi_skyward_groundstation_v2)
+
 add_executable(test-sx1278fsk-mavlink src/tests/radio/sx1278/fsk/test-sx1278-mavlink.cpp)
 sbs_target(test-sx1278fsk-mavlink stm32f429zi_skyward_groundstation_v2)
 
diff --git a/src/entrypoints/sx1278-serial.cpp b/src/entrypoints/sx1278-serial.cpp
index fdd565e83e0ddf5ead9adddf02fa118d90c7671c..db464cd40ece4dfccfeecd8235fcf0e1cddfbafa 100644
--- a/src/entrypoints/sx1278-serial.cpp
+++ b/src/entrypoints/sx1278-serial.cpp
@@ -42,6 +42,8 @@ using namespace miosix;
 
 // Uncomment the following line to enable Ebyte module
 // #define SX1278_IS_EBYTE
+// Uncomment the following line to ebable Skyward433 module
+// #define SX1278_IS_SKYWARD433
 
 using cs   = peripherals::ra01::pc13::cs;
 using dio0 = peripherals::ra01::pc13::dio0;
@@ -63,6 +65,29 @@ using rxen = Gpio<GPIOD_BASE, 4>;
 #define SX1278_IRQ_DIO1 EXTI2_IRQHandlerImpl
 #define SX1278_IRQ_DIO3 EXTI11_IRQHandlerImpl
 
+#elif defined _BOARD_STM32F429ZI_SKYWARD_RIG
+#include "interfaces-impl/hwmapping.h"
+
+#define SX1278_IS_EBYTE
+
+using cs   = radio::cs;
+using dio0 = radio::dio0;
+using dio1 = radio::dio1;
+using dio3 = radio::dio3;
+
+using sck  = radio::sck;
+using miso = radio::miso;
+using mosi = radio::mosi;
+
+using txen = radio::txEn;
+using rxen = radio::rxEn;
+
+#define SX1278_SPI SPI4
+
+#define SX1278_IRQ_DIO0 EXTI5_IRQHandlerImpl
+#define SX1278_IRQ_DIO1 EXTI12_IRQHandlerImpl
+#define SX1278_IRQ_DIO3 EXTI13_IRQHandlerImpl
+
 #else
 #error "Target not supported"
 #endif
@@ -162,10 +187,15 @@ int main()
     SPIBus bus(SX1278_SPI);
     GpioPin cs = cs::getPin();
 
-#ifdef IS_EBYTE
+#if defined SX1278_IS_EBYTE
+    printf("[sx1278] Confuring Ebyte frontend...\n");
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(
         new EbyteFrontend(txen::getPin(), rxen::getPin()));
+#elif defined SX1278_IS_SKYWARD433
+    printf("[sx1278] Confuring Skyward 433 frontend...\n");
+    std::unique_ptr<SX1278::ISX1278Frontend> frontend(new Skyward433Frontend());
 #else
+    printf("[sx1278] Confuring RA01 frontend...\n");
     std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend());
 #endif
 
diff --git a/src/shared/radio/SX1278/SX1278Fsk.cpp b/src/shared/radio/SX1278/SX1278Fsk.cpp
index f56b3c912d5c7cc6e069a072f9077664449ca4bf..9179b9aaca63787c47b33445f563b38708d9e77c 100644
--- a/src/shared/radio/SX1278/SX1278Fsk.cpp
+++ b/src/shared/radio/SX1278/SX1278Fsk.cpp
@@ -46,7 +46,6 @@ SX1278Fsk::Error SX1278Fsk::init(const Config &config)
     // First probe for the device
     if (!checkVersion())
     {
-        TRACE("[sx1278] Wrong chipid\n");
         return Error::BAD_VALUE;
     }
 
@@ -62,7 +61,10 @@ bool SX1278Fsk::checkVersion()
     Lock guard(*this);
     SPITransaction spi(getSpiSlave());
 
-    return spi.readRegister(REG_VERSION) == 0x12;
+    uint8_t version = spi.readRegister(REG_VERSION);
+    TRACE("[sx1278] Chip id: %d\n", version);
+
+    return version == 0x12;
 }
 
 SX1278Fsk::Error SX1278Fsk::configure(const Config &config)
@@ -70,15 +72,19 @@ SX1278Fsk::Error SX1278Fsk::configure(const Config &config)
     // First cycle the device to bring it into Fsk mode (can only be changed in
     // sleep)
     setDefaultMode(RegOpMode::MODE_SLEEP, DEFAULT_MAPPING, false, false);
+    miosix::Thread::sleep(1);
+
     // Make sure the device remains in standby and not in sleep
     setDefaultMode(RegOpMode::MODE_STDBY, DEFAULT_MAPPING, false, false);
+    miosix::Thread::sleep(1);
 
     // Lock the bus
     Lock guard(*this);
     LockMode guard_mode(*this, guard, RegOpMode::MODE_STDBY, DEFAULT_MAPPING);
 
-    if (!waitForIrqBusy(guard_mode, RegIrqFlags::MODE_READY, 1000))
-        return Error::IRQ_TIMEOUT;
+    // The datasheet lies, this IRQ is unreliable, it doesn't always trigger
+    // if (!waitForIrqBusy(guard_mode, RegIrqFlags::MODE_READY, 1000))
+    //     return Error::IRQ_TIMEOUT;
 
     int bitrate              = config.bitrate;
     int freq_dev             = config.freq_dev;
diff --git a/src/shared/radio/SX1278/SX1278Lora.cpp b/src/shared/radio/SX1278/SX1278Lora.cpp
index 5948b78d86be9f1e7c20a9f8e8053f2968c96bf6..682f1dc39daf9eadf063b14cedb6f819fd32ccbe 100644
--- a/src/shared/radio/SX1278/SX1278Lora.cpp
+++ b/src/shared/radio/SX1278/SX1278Lora.cpp
@@ -151,7 +151,10 @@ bool SX1278Lora::checkVersion()
     Lock guard(*this);
     SPITransaction spi(getSpiSlave());
 
-    return spi.readRegister(REG_VERSION) == 0x12;
+    uint8_t version = spi.readRegister(REG_VERSION);
+    TRACE("[sx1278] Chip id: %d\n", version);
+
+    return version == 0x12;
 }
 
 SX1278Lora::Error SX1278Lora::configure(const Config &config)
diff --git a/src/tests/radio/sx1278/sx1278-init.h b/src/tests/radio/sx1278/sx1278-init.h
index 0cdcfd2e6e75e255352220b32e5562611fe0f707..75672862a91faf564ff326b3c5da491e81e2f6b0 100644
--- a/src/tests/radio/sx1278/sx1278-init.h
+++ b/src/tests/radio/sx1278/sx1278-init.h
@@ -38,6 +38,8 @@
 
 // Uncomment the following line to enable Ebyte module
 // #define SX1278_IS_EBYTE
+// Uncomment the following line to ebable Skyward433 module
+#define SX1278_IS_SKYWARD433
 
 using cs   = miosix::peripherals::ra01::pc13::cs;
 using dio0 = miosix::peripherals::ra01::pc13::dio0;
@@ -59,6 +61,29 @@ using rxen = miosix::Gpio<GPIOD_BASE, 4>;
 #define SX1278_IRQ_DIO1 EXTI2_IRQHandlerImpl
 #define SX1278_IRQ_DIO3 EXTI11_IRQHandlerImpl
 
+#elif defined _BOARD_STM32F429ZI_SKYWARD_RIG
+#include "interfaces-impl/hwmapping.h"
+
+#define SX1278_IS_EBYTE
+
+using cs   = miosix::radio::cs;
+using dio0 = miosix::radio::dio0;
+using dio1 = miosix::radio::dio1;
+using dio3 = miosix::radio::dio3;
+
+using sck  = miosix::radio::sck;
+using miso = miosix::radio::miso;
+using mosi = miosix::radio::mosi;
+
+using txen = miosix::radio::txEn;
+using rxen = miosix::radio::rxEn;
+
+#define SX1278_SPI SPI4
+
+#define SX1278_IRQ_DIO0 EXTI5_IRQHandlerImpl
+#define SX1278_IRQ_DIO1 EXTI12_IRQHandlerImpl
+#define SX1278_IRQ_DIO3 EXTI13_IRQHandlerImpl
+
 #else
 #error "Target not supported"
 #endif
@@ -123,28 +148,34 @@ void initBoard()
 #endif
 }
 
+Boardcore::SPIBus sx1278_bus(SX1278_SPI);
+
 bool initRadio()
 {
     // Initialize frontend (if any)
-#ifdef IS_EBYTE
+#if defined SX1278_IS_EBYTE
+    printf("[sx1278] Confuring Ebyte frontend...\n");
     std::unique_ptr<Boardcore::SX1278::ISX1278Frontend> frontend(
         new Boardcore::EbyteFrontend(txen::getPin(), rxen::getPin()));
+#elif defined SX1278_IS_SKYWARD433
+    printf("[sx1278] Confuring Skyward 433 frontend...\n");
+    std::unique_ptr<Boardcore::SX1278::ISX1278Frontend> frontend(
+        new Boardcore::Skyward433Frontend());
 #else
+    printf("[sx1278] Confuring RA01 frontend...\n");
     std::unique_ptr<Boardcore::SX1278::ISX1278Frontend> frontend(
         new Boardcore::RA01Frontend());
 #endif
 
-    Boardcore::SPIBus bus(SX1278_SPI);
-    miosix::GpioPin cs = cs::getPin();
-
     // Initialize actual radio driver
 #ifdef SX1278_IS_LORA
     // Run default configuration
     Boardcore::SX1278Lora::Config config;
     Boardcore::SX1278Lora::Error err;
 
-    sx1278 = new Boardcore::SX1278Lora(
-        bus, cs, Boardcore::SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new Boardcore::SX1278Lora(sx1278_bus, cs::getPin(),
+                                       Boardcore::SPI::ClockDivider::DIV_64,
+                                       std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278 lora...\n");
     if ((err = sx1278->init(config)) != Boardcore::SX1278Lora::Error::NONE)
@@ -159,8 +190,9 @@ bool initRadio()
     Boardcore::SX1278Fsk::Config config;
     Boardcore::SX1278Fsk::Error err;
 
-    sx1278 = new Boardcore::SX1278Fsk(
-        bus, cs, Boardcore::SPI::ClockDivider::DIV_64, std::move(frontend));
+    sx1278 = new Boardcore::SX1278Fsk(sx1278_bus, cs::getPin(),
+                                            Boardcore::SPI::ClockDivider::DIV_64,
+                                            std::move(frontend));
 
     printf("\n[sx1278] Configuring sx1278 fsk...\n");
     if ((err = sx1278->init(config)) != Boardcore::SX1278Fsk::Error::NONE)