diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index b03da947bb50aa0ccca1a19367ce32dcec19a1b8..895903d9393dbc530e59f77112078e50f5c70426 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -339,6 +339,29 @@
                 "${workspaceFolder}/libs/miosix-kernel/miosix/config/arch/cortexM7_stm32f7/stm32f767zi_compute_unit"
             ]
         },
+        {
+            "name": "stm32f767zi_gemini_gs",
+            "cStandard": "c11",
+            "cppStandard": "c++14",
+            "compilerPath": "/opt/arm-miosix-eabi/bin/arm-miosix-eabi-g++",
+            "defines": [
+                "{defaultDefines}",
+                "_MIOSIX_BOARDNAME=stm32f767zi_gemini_gs",
+                "_BOARD_STM32F767ZI_GEMINI_GS",
+                "_ARCH_CORTEXM7_STM32F7",
+                "STM32F769xx",
+                "HSE_VALUE=25000000",
+                "SYSCLK_FREQ_216MHz=216000000",
+                "__ENABLE_XRAM",
+                "V_DDA_VOLTAGE=3.3f"
+            ],
+            "includePath": [
+                "${defaultIncludePaths}",
+                "${workspaceFolder}/libs/miosix-kernel/miosix/arch/cortexM7_stm32f7/common",
+                "${workspaceFolder}/libs/miosix-kernel/miosix/arch/cortexM7_stm32f7/stm32f767zi_gemini_gs",
+                "${workspaceFolder}/libs/miosix-kernel/miosix/config/arch/cortexM7_stm32f7/stm32f767zi_gemini_gs"
+            ]
+        },
         {
             "name": "stm32f756zg_nucleo",
             "cStandard": "c11",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aa77eb3c61a48e5fa2cc9baa1d4e060e12638a29..f68982e702648600f8708cf237568fffbf807ffd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -294,11 +294,19 @@ sbs_target(test-sx1278fsk-bidir stm32f429zi_skyward_groundstation_v2)
 
 add_executable(test-sx1278fsk-tx src/tests/radio/sx1278/test-sx1278-bench-serial.cpp)
 target_compile_definitions(test-sx1278fsk-tx PRIVATE DISABLE_RX)
-sbs_target(test-sx1278fsk-tx stm32f767zi_compute_unit)
+sbs_target(test-sx1278fsk-tx stm32f767zi_gemini_gs)
 
 add_executable(test-sx1278fsk-rx src/tests/radio/sx1278/test-sx1278-bench-serial.cpp)
 target_compile_definitions(test-sx1278fsk-rx PRIVATE DISABLE_TX)
-sbs_target(test-sx1278fsk-rx stm32f767zi_compute_unit)
+sbs_target(test-sx1278fsk-rx stm32f429zi_skyward_groundstation_v2)
+
+# add_executable(test-sx1278fsk-tx src/tests/radio/sx1278/test-sx1278-bench-serial.cpp)
+# target_compile_definitions(test-sx1278fsk-tx PRIVATE DISABLE_RX)
+# sbs_target(test-sx1278fsk-tx stm32f429zi_skyward_groundstation_v2)
+# 
+# add_executable(test-sx1278fsk-rx src/tests/radio/sx1278/test-sx1278-bench-serial.cpp)
+# target_compile_definitions(test-sx1278fsk-rx PRIVATE DISABLE_TX)
+# sbs_target(test-sx1278fsk-rx stm32f767zi_gemini_gs)
 
 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)
@@ -330,7 +338,7 @@ sbs_target(test-sx1278lora-simple-tx stm32f429zi_skyward_groundstation_v2)
 
 add_executable(test-sx1278lora-tx src/tests/radio/sx1278/test-sx1278-bench-serial.cpp)
 target_compile_definitions(test-sx1278lora-tx PRIVATE DISABLE_RX SX1278_IS_LORA)
-sbs_target(test-sx1278lora-tx stm32f429zi_skyward_groundstation_v2)
+sbs_target(test-sx1278lora-tx stm32f767zi_compute_unit)
 
 add_executable(test-sx1278lora-rx src/tests/radio/sx1278/test-sx1278-bench-serial.cpp)
 target_compile_definitions(test-sx1278lora-rx PRIVATE DISABLE_TX SX1278_IS_LORA)
diff --git a/src/shared/drivers/i2c/I2CDriver-f7.cpp b/src/shared/drivers/i2c/I2CDriver-f7.cpp
index 23678afbd7df6f49b97294273d4ede0a212ee372..7c25dca9f8374e7622743bf9ba37ed3fd905a399 100644
--- a/src/shared/drivers/i2c/I2CDriver-f7.cpp
+++ b/src/shared/drivers/i2c/I2CDriver-f7.cpp
@@ -77,6 +77,7 @@ I2CTimings calculateTimings(uint32_t f, uint32_t fi2c)
 #if defined(_BOARD_STM32F756ZG_NUCLEO)
     const uint16_t correction = 10;
 #elif defined(_BOARD_STM32F767ZI_COMPUTE_UNIT) || \
+    defined(_BOARD_STM32F767ZI_GEMINI_GS) || \
     defined(_BOARD_STM32F767ZI_NUCLEO)
     const uint16_t correction = 7;
 #else
diff --git a/src/tests/radio/sx1278/sx1278-init.h b/src/tests/radio/sx1278/sx1278-init.h
index 36fc26a286ccb4cadf7e1f23c9ca4b1bb3da4c25..9f26bf0796db7ae422d2e366eaf7b73c99d682d7 100644
--- a/src/tests/radio/sx1278/sx1278-init.h
+++ b/src/tests/radio/sx1278/sx1278-init.h
@@ -86,7 +86,8 @@ using rxen                         = miosix::radio::rxEn;
 #define SX1278_IRQ_DIO1 EXTI12_IRQHandlerImpl
 #define SX1278_IRQ_DIO3 EXTI13_IRQHandlerImpl
 
-#elif defined _BOARD_STM32F767ZI_COMPUTE_UNIT
+#elif defined _BOARD_STM32F767ZI_GEMINI_GS
+#include "interfaces-impl/hwmapping.h"
 
 #define SX1278_IS_SKYWARD433
 
@@ -94,41 +95,41 @@ using rxen                         = miosix::radio::rxEn;
 // #define SX1278_1
 
 #ifdef SX1278_1
-using cs   = miosix::Gpio<GPIOA_BASE, 4>;
-using dio0 = miosix::Gpio<GPIOC_BASE, 6>;
-using dio1 = miosix::Gpio<GPIOD_BASE, 4>;
-using dio3 = miosix::Gpio<GPIOD_BASE, 5>;
+using cs   = miosix::radio1::cs;
+using dio0 = miosix::radio1::dio0;
+using dio1 = miosix::radio1::dio1;
+using dio3 = miosix::radio1::dio3;
 
-using sck  = miosix::Gpio<GPIOA_BASE, 5>;
-using miso = miosix::Gpio<GPIOA_BASE, 6>;
-using mosi = miosix::Gpio<GPIOA_BASE, 7>;
+using sck  = miosix::radio1::spi::sck;
+using miso = miosix::radio1::spi::miso;
+using mosi = miosix::radio1::spi::mosi;
 
 #define SX1278_NRST
-using rst = miosix::Gpio<GPIOA_BASE, 0>;
+using rst = miosix::radio1::nrst;
 
-#define SX1278_SPI SPI1
+#define SX1278_SPI MIOSIX_RADIO1_SPI
 
-#define SX1278_IRQ_DIO0 EXTI6_IRQHandlerImpl
-#define SX1278_IRQ_DIO1 EXTI4_IRQHandlerImpl
-#define SX1278_IRQ_DIO3 EXTI5_IRQHandlerImpl
+#define SX1278_IRQ_DIO0 MIOSIX_RADIO1_DIO0_IRQ
+#define SX1278_IRQ_DIO1 MIOSIX_RADIO1_DIO1_IRQ
+#define SX1278_IRQ_DIO3 MIOSIX_RADIO1_DIO3_IRQ
 #else
-using cs   = miosix::Gpio<GPIOA_BASE, 15>;
-using dio0 = miosix::Gpio<GPIOC_BASE, 8>;
-using dio1 = miosix::Gpio<GPIOC_BASE, 10>;
-using dio3 = miosix::Gpio<GPIOC_BASE, 12>;
+using cs   = miosix::radio2::cs;
+using dio0 = miosix::radio2::dio0;
+using dio1 = miosix::radio2::dio1;
+using dio3 = miosix::radio2::dio3;
 
-using sck  = miosix::Gpio<GPIOB_BASE, 3>;
-using miso = miosix::Gpio<GPIOB_BASE, 4>;
-using mosi = miosix::Gpio<GPIOD_BASE, 6>;
+using sck  = miosix::radio2::spi::sck;
+using miso = miosix::radio2::spi::miso;
+using mosi = miosix::radio2::spi::mosi;
 
 #define SX1278_NRST
-using rst = miosix::Gpio<GPIOA_BASE, 3>;
+using rst = miosix::radio2::nrst;
 
-#define SX1278_SPI SPI3
+#define SX1278_SPI MIOSIX_RADIO2_SPI
 
-#define SX1278_IRQ_DIO0 EXTI8_IRQHandlerImpl
-#define SX1278_IRQ_DIO1 EXTI10_IRQHandlerImpl
-#define SX1278_IRQ_DIO3 EXTI12_IRQHandlerImpl
+#define SX1278_IRQ_DIO0 MIOSIX_RADIO2_DIO0_IRQ
+#define SX1278_IRQ_DIO1 MIOSIX_RADIO2_DIO1_IRQ
+#define SX1278_IRQ_DIO3 MIOSIX_RADIO2_DIO3_IRQ
 #endif
 
 #else
@@ -143,9 +144,14 @@ static constexpr size_t SX1278_MTU = Boardcore::SX1278Fsk::MTU;
 Boardcore::SX1278Fsk *sx1278       = nullptr;
 #endif
 
+volatile int dio0_cnt = 0;
+volatile int dio1_cnt = 0;
+volatile int dio3_cnt = 0;
+
 #ifdef SX1278_IRQ_DIO0
 void __attribute__((used)) SX1278_IRQ_DIO0()
 {
+    dio0_cnt++;
     if (sx1278)
         sx1278->handleDioIRQ();
 }
@@ -154,6 +160,7 @@ void __attribute__((used)) SX1278_IRQ_DIO0()
 #ifdef SX1278_IRQ_DIO1
 void __attribute__((used)) SX1278_IRQ_DIO1()
 {
+    dio1_cnt++;
     if (sx1278)
         sx1278->handleDioIRQ();
 }
@@ -162,22 +169,14 @@ void __attribute__((used)) SX1278_IRQ_DIO1()
 #ifdef SX1278_IRQ_DIO3
 void __attribute__((used)) SX1278_IRQ_DIO3()
 {
+    dio3_cnt++;
     if (sx1278)
         sx1278->handleDioIRQ();
 }
 #endif
 
 void initBoard()
-{   
-    // sck::mode(miosix::Mode::ALTERNATE);
-    // sck::alternateFunction(6);
-    // miso::mode(miosix::Mode::ALTERNATE);
-    // miso::alternateFunction(6);
-    // mosi::mode(miosix::Mode::ALTERNATE);
-    // mosi::alternateFunction(5);
-    // cs::mode(miosix::Mode::OUTPUT);
-    // cs::high();
-
+{
 #ifdef SX1278_IS_EBYTE
     rxen::mode(miosix::Mode::OUTPUT);
     txen::mode(miosix::Mode::OUTPUT);
diff --git a/src/tests/radio/sx1278/test-sx1278-bench-serial.cpp b/src/tests/radio/sx1278/test-sx1278-bench-serial.cpp
index bd1da2674ab89ab364e08dfcaf81044791060c5b..0453afc3111c313633cc04c19561ef7b52102125 100644
--- a/src/tests/radio/sx1278/test-sx1278-bench-serial.cpp
+++ b/src/tests/radio/sx1278/test-sx1278-bench-serial.cpp
@@ -46,10 +46,15 @@ int main()
             "Corrupted packets: %d\n"
             "RSSI:              %.2f dBm\n"
             "FEI:               %.2f Hz\n"
-            "SNR:               %.2f\n",
+            "SNR:               %.2f\n"
+            "%d %d %d\n",
             static_cast<float>(stats.txBitrate()) / 1000.0f, stats.sent_count,
             static_cast<float>(stats.rxBitrate()) / 1000.0f, stats.recv_count,
-            stats.corrupted_count, stats.rssi, stats.fei, stats.snr);
+            stats.corrupted_count, stats.rssi, stats.fei, stats.snr, dio0_cnt, dio1_cnt, dio3_cnt);
+        dio0_cnt = 0;
+        dio1_cnt = 0;
+        dio3_cnt = 0;
+
 
         miosix::Thread::sleep(2000);
     }