diff --git a/README.md b/README.md
index 2d4a13cc9f..5c9b8f4888 100644
--- a/README.md
+++ b/README.md
@@ -75,7 +75,7 @@ User can add a STM32 based board following this [wiki](https://github.com/stm32d
  - [Generic STM32WBA boards](#generic-stm32wba-boards)
  - [Generic STM32WL boards](#generic-stm32wl-boards)
  - [3D printer boards](#3d-printer-boards)
- - [Blues Wireless boards](#blues-wireless-boards)
+ - [Blues boards](#blues-boards)
  - [Elecgator boards](#elecgator-boards)
  - [Electronic Speed Controller boards](#electronic-speed-controller-boards)
  - [Garatronic/McHobby boards](#garatronicmchobby-boards)
@@ -766,11 +766,12 @@ User can add a STM32 based board following this [wiki](https://github.com/stm32d
 | :green_heart:  | STM32F446VE | [FYSETC_S6](https://wiki.fysetc.com/FYSETC_S6/) | *1.9.0* | |
 | :green_heart:  | STM32G0B1CB | [BTT EBB42 CAN V1.1](https://github.com/bigtreetech/EBB/tree/master/EBB%20CAN%20V1.1%20(STM32G0B1)/EBB42%20CAN%20V1.1) | *2.4.0* |  |
 
-### [Blues Wireless](https://blues.io/) boards
+### [Blues](https://blues.com/) boards
 
 | Status | Device(s) | Name | Release | Notes |
 | :----: | :-------: | ---- | :-----: | :---- |
-| :green_heart:  | STM32L4R5ZIYx | [Swan R5](https://blues.io/products/swan) | *2.1.0* |  |
+| :green_heart:  | STM32L4R5ZIYx | [Swan R5](https://blues.com/products/swan) | *3.0.0* |  |
+| :green_heart:  | STM32L431CC | [Cygnet L4](https://blues.com/products/cygnet) | *1.1.0* |  |
 
 ### [Elecgator](https://www.elecgator.com/) boards
 
diff --git a/boards.txt b/boards.txt
index a7ec72b2a4..cf19f0ef03 100644
--- a/boards.txt
+++ b/boards.txt
@@ -10707,46 +10707,63 @@ GenWL.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
 3dprinter.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
 
 ################################################################################
-# Blues Wireless boards
-
-BluesW.name=Blues Wireless boards
-
-BluesW.build.core=arduino
-BluesW.build.board=BluesWireless
-BluesW.build.variant_h=variant_{build.board}.h
-BluesW.build.st_extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
-BluesW.build.flash_offset=0x0
-BluesW.upload.maximum_size=0
-BluesW.upload.maximum_data_size=0
-
-# Swan R5 board
-BluesW.menu.pnum.SWAN_R5=Swan R5
-BluesW.menu.pnum.SWAN_R5.upload.maximum_size=2097152
-BluesW.menu.pnum.SWAN_R5.upload.maximum_data_size=655360
-BluesW.menu.pnum.SWAN_R5.build.mcu=cortex-m4
-BluesW.menu.pnum.SWAN_R5.build.fpu=-mfpu=fpv4-sp-d16
-BluesW.menu.pnum.SWAN_R5.build.float-abi=-mfloat-abi=hard
-BluesW.menu.pnum.SWAN_R5.build.board=SWAN_R5
-BluesW.menu.pnum.SWAN_R5.build.series=STM32L4xx
-BluesW.menu.pnum.SWAN_R5.build.product_line=STM32L4R5xx
-BluesW.menu.pnum.SWAN_R5.build.variant=STM32L4xx/L4R5Z(G-I)Y_L4R9Z(G-I)Y_L4S5ZIY_L4S9ZIY
-BluesW.menu.pnum.SWAN_R5.build.peripheral_pins=-DCUSTOM_PERIPHERAL_PINS
+# Blues boards
+
+Blues.name=Blues boards
+
+Blues.build.core=arduino
+Blues.build.board=Blues
+Blues.build.variant_h=variant_{build.board}.h
+Blues.build.st_extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
+Blues.build.flash_offset=0x0
+Blues.upload.maximum_size=0
+Blues.upload.maximum_data_size=0
+
+# Swan board
+Blues.menu.pnum.SWAN_R5=Swan R5
+Blues.menu.pnum.SWAN_R5.upload.maximum_size=2097152
+Blues.menu.pnum.SWAN_R5.upload.maximum_data_size=655360
+Blues.menu.pnum.SWAN_R5.build.mcu=cortex-m4
+Blues.menu.pnum.SWAN_R5.build.fpu=-mfpu=fpv4-sp-d16
+Blues.menu.pnum.SWAN_R5.build.float-abi=-mfloat-abi=hard
+Blues.menu.pnum.SWAN_R5.build.board=SWAN_R5
+Blues.menu.pnum.SWAN_R5.build.series=STM32L4xx
+Blues.menu.pnum.SWAN_R5.build.product_line=STM32L4R5xx
+Blues.menu.pnum.SWAN_R5.build.variant=STM32L4xx/L4R5Z(G-I)Y_L4R9Z(G-I)Y_L4S5ZIY_L4S9ZIY
+Blues.menu.pnum.SWAN_R5.build.peripheral_pins=-DCUSTOM_PERIPHERAL_PINS
+Blues.menu.pnum.SWAN_R5.build.vid=0x30A4
+Blues.menu.pnum.SWAN_R5.build.pid=0x0002
+
+# Cygnet board
+Blues.menu.pnum.CYGNET_L4=Cygnet L4
+Blues.menu.pnum.CYGNET_L4.upload.maximum_size=262144
+Blues.menu.pnum.CYGNET_L4.upload.maximum_data_size=65536
+Blues.menu.pnum.CYGNET_L4.build.mcu=cortex-m4
+Blues.menu.pnum.CYGNET_L4.build.fpu=-mfpu=fpv4-sp-d16
+Blues.menu.pnum.CYGNET_L4.build.float-abi=-mfloat-abi=hard
+Blues.menu.pnum.CYGNET_L4.build.board=CYGNET_L4
+Blues.menu.pnum.CYGNET_L4.build.series=STM32L4xx
+Blues.menu.pnum.CYGNET_L4.build.product_line=STM32L431xx
+Blues.menu.pnum.CYGNET_L4.build.variant=STM32L4xx/L431C(B-C)(T-U)
+Blues.menu.pnum.CYGNET_L4.build.peripheral_pins=-DCUSTOM_PERIPHERAL_PINS
+Blues.menu.pnum.CYGNET_L4.build.vid=0x30A4
+Blues.menu.pnum.CYGNET_L4.build.pid=0x0003
 
 # Upload menu
-BluesW.menu.upload_method.swdMethod=STM32CubeProgrammer (SWD)
-BluesW.menu.upload_method.swdMethod.upload.protocol=0
-BluesW.menu.upload_method.swdMethod.upload.options=
-BluesW.menu.upload_method.swdMethod.upload.tool=stm32CubeProg
+Blues.menu.upload_method.swdMethod=STM32CubeProgrammer (SWD)
+Blues.menu.upload_method.swdMethod.upload.protocol=0
+Blues.menu.upload_method.swdMethod.upload.options=
+Blues.menu.upload_method.swdMethod.upload.tool=stm32CubeProg
 
-BluesW.menu.upload_method.serialMethod=STM32CubeProgrammer (Serial)
-BluesW.menu.upload_method.serialMethod.upload.protocol=1
-BluesW.menu.upload_method.serialMethod.upload.options={serial.port.file}
-BluesW.menu.upload_method.serialMethod.upload.tool=stm32CubeProg
+Blues.menu.upload_method.serialMethod=STM32CubeProgrammer (Serial)
+Blues.menu.upload_method.serialMethod.upload.protocol=1
+Blues.menu.upload_method.serialMethod.upload.options={serial.port.file}
+Blues.menu.upload_method.serialMethod.upload.tool=stm32CubeProg
 
-BluesW.menu.upload_method.dfuMethod=STM32CubeProgrammer (DFU)
-BluesW.menu.upload_method.dfuMethod.upload.protocol=2
-BluesW.menu.upload_method.dfuMethod.upload.options=
-BluesW.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
+Blues.menu.upload_method.dfuMethod=STM32CubeProgrammer (DFU)
+Blues.menu.upload_method.dfuMethod.upload.protocol=2
+Blues.menu.upload_method.dfuMethod.upload.options=
+Blues.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
 
 ################################################################################
 # Elecgator boards
@@ -11443,11 +11460,11 @@ GenWL.menu.xserial.disabled.build.xSerial=
 3dprinter.menu.xserial.disabled=Disabled (no Serial support)
 3dprinter.menu.xserial.disabled.build.xSerial=
 
-BluesW.menu.xserial.generic=Enabled (generic 'Serial')
-BluesW.menu.xserial.none=Enabled (no generic 'Serial')
-BluesW.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
-BluesW.menu.xserial.disabled=Disabled (no Serial support)
-BluesW.menu.xserial.disabled.build.xSerial=
+Blues.menu.xserial.generic=Enabled (generic 'Serial')
+Blues.menu.xserial.none=Enabled (no generic 'Serial')
+Blues.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
+Blues.menu.xserial.disabled=Disabled (no Serial support)
+Blues.menu.xserial.disabled.build.xSerial=
 
 Elecgator.menu.xserial.generic=Enabled (generic 'Serial')
 Elecgator.menu.xserial.none=Enabled (no generic 'Serial')
@@ -11762,18 +11779,18 @@ GenWB.menu.xusb.HSFS.build.usb_speed=-DUSE_USB_HS -DUSE_USB_HS_IN_FS
 3dprinter.menu.xusb.HSFS=High Speed in Full Speed mode
 3dprinter.menu.xusb.HSFS.build.usb_speed=-DUSE_USB_HS -DUSE_USB_HS_IN_FS
 
-BluesW.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART)
-BluesW.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC
-BluesW.menu.usb.CDC=CDC (no generic 'Serial')
-BluesW.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB
-BluesW.menu.usb.HID=HID (keyboard and mouse)
-BluesW.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE
-BluesW.menu.usb.none=None
-BluesW.menu.xusb.FS=Low/Full Speed
-BluesW.menu.xusb.HS=High Speed
-BluesW.menu.xusb.HS.build.usb_speed=-DUSE_USB_HS
-BluesW.menu.xusb.HSFS=High Speed in Full Speed mode
-BluesW.menu.xusb.HSFS.build.usb_speed=-DUSE_USB_HS -DUSE_USB_HS_IN_FS
+Blues.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART)
+Blues.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC
+Blues.menu.usb.CDC=CDC (no generic 'Serial')
+Blues.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB
+Blues.menu.usb.HID=HID (keyboard and mouse)
+Blues.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE
+Blues.menu.usb.none=None
+Blues.menu.xusb.FS=Low/Full Speed
+Blues.menu.xusb.HS=High Speed
+Blues.menu.xusb.HS.build.usb_speed=-DUSE_USB_HS
+Blues.menu.xusb.HSFS=High Speed in Full Speed mode
+Blues.menu.xusb.HSFS.build.usb_speed=-DUSE_USB_HS -DUSE_USB_HS_IN_FS
 
 Elecgator.menu.usb.none=None
 Elecgator.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART)
@@ -12367,25 +12384,25 @@ GenWL.menu.opt.o0std.build.flags.optimize=-O0
 3dprinter.menu.opt.o0std=No Optimization (-O0)
 3dprinter.menu.opt.o0std.build.flags.optimize=-O0
 
-BluesW.menu.opt.osstd=Smallest (-Os default)
-BluesW.menu.opt.oslto=Smallest (-Os) with LTO
-BluesW.menu.opt.oslto.build.flags.optimize=-Os -flto
-BluesW.menu.opt.o1std=Fast (-O1)
-BluesW.menu.opt.o1std.build.flags.optimize=-O1
-BluesW.menu.opt.o1lto=Fast (-O1) with LTO
-BluesW.menu.opt.o1lto.build.flags.optimize=-O1 -flto
-BluesW.menu.opt.o2std=Faster (-O2)
-BluesW.menu.opt.o2std.build.flags.optimize=-O2
-BluesW.menu.opt.o2lto=Faster (-O2) with LTO
-BluesW.menu.opt.o2lto.build.flags.optimize=-O2 -flto
-BluesW.menu.opt.o3std=Fastest (-O3)
-BluesW.menu.opt.o3std.build.flags.optimize=-O3
-BluesW.menu.opt.o3lto=Fastest (-O3) with LTO
-BluesW.menu.opt.o3lto.build.flags.optimize=-O3 -flto
-BluesW.menu.opt.ogstd=Debug (-Og)
-BluesW.menu.opt.ogstd.build.flags.optimize=-Og
-BluesW.menu.opt.o0std=No Optimization (-O0)
-BluesW.menu.opt.o0std.build.flags.optimize=-O0
+Blues.menu.opt.osstd=Smallest (-Os default)
+Blues.menu.opt.oslto=Smallest (-Os) with LTO
+Blues.menu.opt.oslto.build.flags.optimize=-Os -flto
+Blues.menu.opt.o1std=Fast (-O1)
+Blues.menu.opt.o1std.build.flags.optimize=-O1
+Blues.menu.opt.o1lto=Fast (-O1) with LTO
+Blues.menu.opt.o1lto.build.flags.optimize=-O1 -flto
+Blues.menu.opt.o2std=Faster (-O2)
+Blues.menu.opt.o2std.build.flags.optimize=-O2
+Blues.menu.opt.o2lto=Faster (-O2) with LTO
+Blues.menu.opt.o2lto.build.flags.optimize=-O2 -flto
+Blues.menu.opt.o3std=Fastest (-O3)
+Blues.menu.opt.o3std.build.flags.optimize=-O3
+Blues.menu.opt.o3lto=Fastest (-O3) with LTO
+Blues.menu.opt.o3lto.build.flags.optimize=-O3 -flto
+Blues.menu.opt.ogstd=Debug (-Og)
+Blues.menu.opt.ogstd.build.flags.optimize=-Og
+Blues.menu.opt.o0std=No Optimization (-O0)
+Blues.menu.opt.o0std.build.flags.optimize=-O0
 
 Elecgator.menu.opt.osstd=Smallest (-Os default)
 Elecgator.menu.opt.oslto=Smallest (-Os) with LTO
@@ -12744,13 +12761,13 @@ GenWL.menu.dbg.enable_all.build.flags.debug=-g
 3dprinter.menu.dbg.enable_all=Core Logs and Symbols Enabled (-g)
 3dprinter.menu.dbg.enable_all.build.flags.debug=-g
 
-BluesW.menu.dbg.none=None
-BluesW.menu.dbg.enable_sym=Symbols Enabled (-g)
-BluesW.menu.dbg.enable_sym.build.flags.debug=-g -DNDEBUG
-BluesW.menu.dbg.enable_log=Core logs Enabled
-BluesW.menu.dbg.enable_log.build.flags.debug=
-BluesW.menu.dbg.enable_all=Core Logs and Symbols Enabled (-g)
-BluesW.menu.dbg.enable_all.build.flags.debug=-g
+Blues.menu.dbg.none=None
+Blues.menu.dbg.enable_sym=Symbols Enabled (-g)
+Blues.menu.dbg.enable_sym.build.flags.debug=-g -DNDEBUG
+Blues.menu.dbg.enable_log=Core logs Enabled
+Blues.menu.dbg.enable_log.build.flags.debug=
+Blues.menu.dbg.enable_all=Core Logs and Symbols Enabled (-g)
+Blues.menu.dbg.enable_all.build.flags.debug=-g
 
 Elecgator.menu.dbg.none=None
 Elecgator.menu.dbg.enable_sym=Symbols Enabled (-g)
@@ -13077,15 +13094,15 @@ GenWL.menu.rtlib.full.build.flags.ldspecs=
 3dprinter.menu.rtlib.full=Newlib Standard
 3dprinter.menu.rtlib.full.build.flags.ldspecs=
 
-BluesW.menu.rtlib.nano=Newlib Nano (default)
-BluesW.menu.rtlib.nanofp=Newlib Nano + Float Printf
-BluesW.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
-BluesW.menu.rtlib.nanofs=Newlib Nano + Float Scanf
-BluesW.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
-BluesW.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
-BluesW.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
-BluesW.menu.rtlib.full=Newlib Standard
-BluesW.menu.rtlib.full.build.flags.ldspecs=
+Blues.menu.rtlib.nano=Newlib Nano (default)
+Blues.menu.rtlib.nanofp=Newlib Nano + Float Printf
+Blues.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+Blues.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+Blues.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+Blues.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+Blues.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+Blues.menu.rtlib.full=Newlib Standard
+Blues.menu.rtlib.full.build.flags.ldspecs=
 
 Elecgator.menu.rtlib.nano=Newlib Nano (default)
 Elecgator.menu.rtlib.nanofp=Newlib Nano + Float Printf
diff --git a/cmake/boards_db.cmake b/cmake/boards_db.cmake
index 17af4f861d..df7b8b178b 100644
--- a/cmake/boards_db.cmake
+++ b/cmake/boards_db.cmake
@@ -105964,6 +105964,88 @@ target_compile_options(SWAN_R5_xusb_HSFS INTERFACE
   "SHELL:-DUSE_USB_HS -DUSE_USB_HS_IN_FS"
 )
 
+# CYGNET_L4
+# -----------------------------------------------------------------------------
+
+set(CYGNET_L4_VARIANT_PATH "${CMAKE_CURRENT_LIST_DIR}/../variants/STM32L4xx/L431C(B-C)(T-U)")
+set(CYGNET_L4_MAXSIZE 262144)
+set(CYGNET_L4_MAXDATASIZE 65536)
+set(CYGNET_L4_MCU cortex-m4)
+set(CYGNET_L4_FPCONF "fpv4-sp-d16-hard")
+add_library(CYGNET_L4 INTERFACE)
+target_compile_options(CYGNET_L4 INTERFACE
+  "SHELL:-DSTM32L4xx  "
+  "SHELL:-DCUSTOM_PERIPHERAL_PINS"
+  "SHELL:"
+  "SHELL:-mfpu=fpv4-sp-d16 -mfloat-abi=hard"
+  -mcpu=${CYGNET_L4_MCU}
+)
+target_compile_definitions(CYGNET_L4 INTERFACE
+  "STM32L4xx"
+	"ARDUINO_CYGNET_L4"
+	"BOARD_NAME=\"CYGNET_L4\""
+	"BOARD_ID=CYGNET_L4"
+	"VARIANT_H=\"variant_CYGNET_L4.h\""
+)
+target_include_directories(CYGNET_L4 INTERFACE
+  ${CMAKE_CURRENT_LIST_DIR}/../system/STM32L4xx
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/STM32L4xx_HAL_Driver/Inc
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/STM32L4xx_HAL_Driver/Src
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/
+  ${CYGNET_L4_VARIANT_PATH}
+)
+
+target_link_options(CYGNET_L4 INTERFACE
+  "LINKER:--default-script=${CYGNET_L4_VARIANT_PATH}/ldscript.ld"
+  "LINKER:--defsym=LD_FLASH_OFFSET=0x0"
+	"LINKER:--defsym=LD_MAX_SIZE=262144"
+	"LINKER:--defsym=LD_MAX_DATA_SIZE=65536"
+  "SHELL:-mfpu=fpv4-sp-d16 -mfloat-abi=hard"
+  -mcpu=${CYGNET_L4_MCU}
+)
+
+add_library(CYGNET_L4_serial_disabled INTERFACE)
+target_compile_options(CYGNET_L4_serial_disabled INTERFACE
+  "SHELL:"
+)
+add_library(CYGNET_L4_serial_generic INTERFACE)
+target_compile_options(CYGNET_L4_serial_generic INTERFACE
+  "SHELL:-DHAL_UART_MODULE_ENABLED"
+)
+add_library(CYGNET_L4_serial_none INTERFACE)
+target_compile_options(CYGNET_L4_serial_none INTERFACE
+  "SHELL:-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE"
+)
+add_library(CYGNET_L4_usb_CDC INTERFACE)
+target_compile_options(CYGNET_L4_usb_CDC INTERFACE
+  "SHELL:-DUSBCON  -DUSBD_VID=0 -DUSBD_PID=-1 -DHAL_PCD_MODULE_ENABLED -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB"
+)
+add_library(CYGNET_L4_usb_CDCgen INTERFACE)
+target_compile_options(CYGNET_L4_usb_CDCgen INTERFACE
+  "SHELL:-DUSBCON  -DUSBD_VID=0 -DUSBD_PID=-1 -DHAL_PCD_MODULE_ENABLED -DUSBD_USE_CDC"
+)
+add_library(CYGNET_L4_usb_HID INTERFACE)
+target_compile_options(CYGNET_L4_usb_HID INTERFACE
+  "SHELL:-DUSBCON  -DUSBD_VID=0 -DUSBD_PID=-1 -DHAL_PCD_MODULE_ENABLED -DUSBD_USE_HID_COMPOSITE"
+)
+add_library(CYGNET_L4_usb_none INTERFACE)
+target_compile_options(CYGNET_L4_usb_none INTERFACE
+  "SHELL:"
+)
+add_library(CYGNET_L4_xusb_FS INTERFACE)
+target_compile_options(CYGNET_L4_xusb_FS INTERFACE
+  "SHELL:"
+)
+add_library(CYGNET_L4_xusb_HS INTERFACE)
+target_compile_options(CYGNET_L4_xusb_HS INTERFACE
+  "SHELL:-DUSE_USB_HS"
+)
+add_library(CYGNET_L4_xusb_HSFS INTERFACE)
+target_compile_options(CYGNET_L4_xusb_HSFS INTERFACE
+  "SHELL:-DUSE_USB_HS -DUSE_USB_HS_IN_FS"
+)
+
 # THUNDERPACK_F411
 # -----------------------------------------------------------------------------
 
diff --git a/tools/platformio/boards_remap.json b/tools/platformio/boards_remap.json
index 9a622e4666..c9297556ab 100644
--- a/tools/platformio/boards_remap.json
+++ b/tools/platformio/boards_remap.json
@@ -30,7 +30,8 @@
     "thunder_pack_f411": "THUNDERPACK_F411",
     "vccgnd_f103zet6": "VCCGND_F103ZET6_MINI",
     "waveshare_open103z": "GENERIC_F103ZEHX",
-    "bw_swan_r5": "SWAN_R5",
+    "blues_swan_r5": "SWAN_R5",
+    "blues_cygnet_l4": "CYGNET_L4",
     "disco_b_g431b_esc1": "B_G431B_ESC1",
     "disco_b_u585i_iot02a": "B_U585I_IOT02A",
     "nucleo_wl55jc": "NUCLEO_WL55JC1"
diff --git a/variants/STM32L4xx/L431C(B-C)(T-U)/CMakeLists.txt b/variants/STM32L4xx/L431C(B-C)(T-U)/CMakeLists.txt
index 2a4d55b6b1..6d912fd619 100644
--- a/variants/STM32L4xx/L431C(B-C)(T-U)/CMakeLists.txt
+++ b/variants/STM32L4xx/L431C(B-C)(T-U)/CMakeLists.txt
@@ -21,7 +21,9 @@ target_link_libraries(variant INTERFACE variant_usage)
 add_library(variant_bin STATIC EXCLUDE_FROM_ALL
   generic_clock.c
   PeripheralPins.c
+  PeripheralPins_CYGNET_L4.c
   variant_generic.cpp
+  variant_CYGNET_L4.cpp
 )
 target_link_libraries(variant_bin PUBLIC variant_usage)
 
diff --git a/variants/STM32L4xx/L431C(B-C)(T-U)/PeripheralPins_CYGNET_L4.c b/variants/STM32L4xx/L431C(B-C)(T-U)/PeripheralPins_CYGNET_L4.c
new file mode 100644
index 0000000000..9dacf7d3eb
--- /dev/null
+++ b/variants/STM32L4xx/L431C(B-C)(T-U)/PeripheralPins_CYGNET_L4.c
@@ -0,0 +1,296 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2020, STMicroelectronics
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *                        opensource.org/licenses/BSD-3-Clause
+ *
+ *******************************************************************************
+ */
+/*
+ * Manually generated by Blues with knowledge of the CYGNET schematic
+ */
+#if defined(ARDUINO_CYGNET_L4)
+#include "Arduino.h"
+#include "PeripheralPins.h"
+
+/* =====
+ * Notes:
+ * - The pins mentioned Px_y_ALTz are alternative possibilities which use other
+ *   HW peripheral instances. You can use them the same way as any other "normal"
+ *   pin (i.e. analogWrite(PA7_ALT1, 128);).
+ *
+ * - Commented lines are alternative possibilities which are not used per default.
+ *   If you change them, you will have to know what you do
+ * =====
+ */
+
+//*** ADC ***
+
+#ifdef HAL_ADC_MODULE_ENABLED
+WEAK const PinMap PinMap_ADC[] = {
+  {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - A0
+  {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - A1
+  {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - A2
+  {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - A3
+  {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - BAT_VOLTAGE
+  {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - CK
+  {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - MI
+  {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - A5
+  {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - D11
+  {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16 - A4
+  {NC,   NP,   0}
+};
+#endif
+
+//*** DAC ***
+
+#ifdef HAL_DAC_MODULE_ENABLED
+WEAK const PinMap PinMap_DAC[] = {
+//  {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 - BAT_VOLTAGE
+  {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 - CK
+  {NC,   NP,   0}
+};
+#endif
+
+//*** I2C ***
+
+#ifdef HAL_I2C_MODULE_ENABLED
+WEAK const PinMap PinMap_I2C_SDA[] = {
+  {PA_10, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // - RX
+  {PB_4,  I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // - D13
+  {PB_7,  I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // - SDA
+  {PB_9,  I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // - D6
+//  {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // - LPUART1_VCP_TX
+  {PB_14, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // - D9
+  {NC,    NP,   0}
+};
+#endif
+
+#ifdef HAL_I2C_MODULE_ENABLED
+WEAK const PinMap PinMap_I2C_SCL[] = {
+  {PA_7,  I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // - A5
+  {PA_9,  I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // - TX
+  {PB_6,  I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // - SCL
+  {PB_8,  I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // - D5
+//  {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // - LPUART1_VCP_RX
+  {PB_13, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // - D10
+  {NC,    NP,   0}
+};
+#endif
+
+//*** No I3C ***
+
+//*** TIM ***
+
+#ifdef HAL_TIM_MODULE_ENABLED
+WEAK const PinMap PinMap_TIM[] = {
+  {PA_0,       TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - A0
+  {PA_1,       TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - A1
+  {PA_1_ALT1,  TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N - A1
+  {PA_2,       TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - A2
+  {PA_2_ALT1,  TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 - A2
+  {PA_3,       TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - A3
+  {PA_3_ALT1,  TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 - A3
+  {PA_5,       TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - CK
+  {PA_6,       TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 - MI
+  {PA_7,       TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - A5
+  {PA_8,       TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - LED_BUILTIN
+  {PA_9,       TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - TX
+  {PA_10,      TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - RX
+//  {PA_11,      TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - USB_DM
+//  {PA_15,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - CHARGE_DETECT
+  {PB_0,       TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - D11
+  {PB_1,       TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - A4
+//  {PB_3,       TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - USER_BTN
+  {PB_6,       TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 1)}, // TIM16_CH1N - SCL
+  {PB_8,       TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 - D5
+//  {PB_10,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - LPUART1_VCP_RX
+//  {PB_11,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - LPUART1_VCP_TX
+  {PB_13,      TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - D10
+  {PB_13_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N - D10
+  {PB_14,      TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - D9
+  {PB_14_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 - D9
+  {PB_15,      TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - D12
+  {PB_15_ALT1, TIM15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 - D12
+  {NC,         NP,    0}
+};
+#endif
+
+//*** UART ***
+
+#ifdef HAL_UART_MODULE_ENABLED
+WEAK const PinMap PinMap_UART_TX[] = {
+  {PA_2,      LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - A2
+  {PA_2_ALT1, USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // - A2
+  {PA_9,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - TX
+  {PB_6,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - SCL
+  {PB_10,     USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - LPUART1_VCP_RX
+  {PB_11,     LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - LPUART1_VCP_TX
+  {NC,        NP,      0}
+};
+#endif
+
+#ifdef HAL_UART_MODULE_ENABLED
+WEAK const PinMap PinMap_UART_RX[] = {
+  {PA_3,      LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - A3
+  {PA_3_ALT1, USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // - A3
+  {PA_10,     USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - RX
+//  {PA_15,     USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART2)}, // - CHARGE_DETECT
+  {PB_7,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - SDA
+  {PB_10,     LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - LPUART1_VCP_RX
+  {PB_11,     USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - LPUART1_VCP_TX
+  {NC,        NP,      0}
+};
+#endif
+
+#ifdef HAL_UART_MODULE_ENABLED
+WEAK const PinMap PinMap_UART_RTS[] = {
+  {PA_1,      USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // - A1
+//  {PA_12,     USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - USB_DP
+//  {PA_15,     USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - CHARGE_DETECT
+  {PB_1,      LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - A4
+  {PB_1_ALT1, USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - A4
+//  {PB_3,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - USER_BTN
+//  {PB_12,     LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - NC
+  {PB_14,     USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - D9
+  {NC,        NP,      0}
+};
+#endif
+
+#ifdef HAL_UART_MODULE_ENABLED
+WEAK const PinMap PinMap_UART_CTS[] = {
+  {PA_0,       USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // - A0
+  {PA_6,       LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - MI
+  {PA_6_ALT1,  USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - MI
+//  {PA_11,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - USB_DM
+  {PB_4,       USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // - D13
+  {PB_13,      LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // - D10
+  {PB_13_ALT1, USART3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // - D10
+  {NC,         NP,      0}
+};
+#endif
+
+//*** SPI ***
+
+#ifdef HAL_SPI_MODULE_ENABLED
+WEAK const PinMap PinMap_SPI_MOSI[] = {
+  {PA_7,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - A5
+//  {PA_12,     SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - USB_DP
+  {PB_5,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - MO
+  {PB_5_ALT1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // - MO
+  {PB_15,     SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // - D12
+  {NC,        NP,   0}
+};
+#endif
+
+#ifdef HAL_SPI_MODULE_ENABLED
+WEAK const PinMap PinMap_SPI_MISO[] = {
+  {PA_6,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - MI
+//  {PA_11,     SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - USB_DM
+  {PB_4,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - D13
+  {PB_4_ALT1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // - D13
+  {PB_14,     SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // - D9
+  {NC,        NP,   0}
+};
+#endif
+
+#ifdef HAL_SPI_MODULE_ENABLED
+WEAK const PinMap PinMap_SPI_SCLK[] = {
+  {PA_1,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - A1
+  {PA_5,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - CK
+//  {PB_3,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - USER_BTN
+//  {PB_3_ALT1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // - USER_BTN
+//  {PB_10,     SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // - LPUART1_VCP_RX
+  {PB_13,     SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // - D10
+  {NC,        NP,   0}
+};
+#endif
+
+#ifdef HAL_SPI_MODULE_ENABLED
+WEAK const PinMap PinMap_SPI_SSEL[] = {
+//  {PA_4,       SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - BAT_VOLTAGE
+//  {PA_4_ALT1,  SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // - BAT_VOLTAGE
+//  {PA_15,      SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - CHARGE_DETECT
+//  {PA_15_ALT1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // - CHARGE_DETECT
+  {PB_0,       SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // - D11
+  {PB_9,       SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // - D6
+//  {PB_12,      SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // - NC
+  {NC,         NP,   0}
+};
+#endif
+
+//*** CAN ***
+
+#if defined(HAL_CAN_MODULE_ENABLED) || defined(HAL_CAN_LEGACY_MODULE_ENABLED)
+WEAK const PinMap PinMap_CAN_RD[] = {
+//  {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // - USB_DM
+  {PB_8,  CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // - D5
+  {NC,    NP,   0}
+};
+#endif
+
+#if defined(HAL_CAN_MODULE_ENABLED) || defined(HAL_CAN_LEGACY_MODULE_ENABLED)
+WEAK const PinMap PinMap_CAN_TD[] = {
+//  {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // - USB_DP
+  {PB_9,  CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // - D6
+  {NC,    NP,   0}
+};
+#endif
+
+//*** No ETHERNET ***
+
+//*** QUADSPI ***
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+WEAK const PinMap PinMap_QUADSPI_DATA0[] = {
+  {PB_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 - A4
+  {NC,   NP,      0}
+};
+#endif
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+WEAK const PinMap PinMap_QUADSPI_DATA1[] = {
+  {PB_0, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 - D11
+  {NC,   NP,      0}
+};
+#endif
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+WEAK const PinMap PinMap_QUADSPI_DATA2[] = {
+  {PA_7, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 - A5
+  {NC,   NP,      0}
+};
+#endif
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+WEAK const PinMap PinMap_QUADSPI_DATA3[] = {
+  {PA_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 - MI
+  {NC,   NP,      0}
+};
+#endif
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+WEAK const PinMap PinMap_QUADSPI_SCLK[] = {
+  {PA_3,  QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK - A3
+//  {PB_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK - LPUART1_VCP_RX
+  {NC,    NP,      0}
+};
+#endif
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+WEAK const PinMap PinMap_QUADSPI_SSEL[] = {
+  {PA_2,  QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_NCS - A2
+//  {PB_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_NCS - LPUART1_VCP_TX
+  {NC,    NP,      0}
+};
+#endif
+
+//*** No USB ***
+
+//*** No SD ***
+
+#endif /* !CUSTOM_PERIPHERAL_PINS */
diff --git a/variants/STM32L4xx/L431C(B-C)(T-U)/variant_CYGNET_L4.cpp b/variants/STM32L4xx/L431C(B-C)(T-U)/variant_CYGNET_L4.cpp
new file mode 100644
index 0000000000..25eac01a26
--- /dev/null
+++ b/variants/STM32L4xx/L431C(B-C)(T-U)/variant_CYGNET_L4.cpp
@@ -0,0 +1,168 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2020, STMicroelectronics
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *                        opensource.org/licenses/BSD-3-Clause
+ *
+ *******************************************************************************
+ */
+#if defined(ARDUINO_CYGNET_L4)
+#include "pins_arduino.h"
+
+// Digital PinName array
+const PinName digitalPin[] = {
+  PA_0,   // 0 - A0/D0
+  PA_1,   // 1 - A1/D1
+  PA_2,   // 2 - A2/D2
+  PA_3,   // 3 - A3/D3
+  PB_1,   // 4 - A4/D4
+  PB_8,   // 5 - D5
+  PB_9,   // 6 - D6
+  PA_4,   // 7 - BAT_VOLTAGE
+  PA_8,   // 8 - LED_BUILTIN
+  PB_14,  // 9 - D9
+  PB_13,  // 10 - D10
+  PB_0,	  // 11 - D11
+  PB_15,  // 12 - D12
+  PB_4,   // 13 - D13
+  PA_5,   // 14 - CK
+  PA_6,	  // 15 - MI
+  PA_7,   // 16 - A5
+  PA_9,   // 17 - TX
+  PA_10,  // 18 - RX
+  PA_11,  // 19 - USB_DM
+  PA_12,  // 20 - USB_DP
+  PA_13,  // 21 - SWDIO
+  PA_14,  // 22 - SWCLK
+  PA_15,  // 23 - CHARGE_DETECT
+  PB_3,   // 24 - USER_BTN
+  PB_5,   // 25 - MO
+  PB_6,   // 26 - SCL
+  PB_7,   // 27 - SDA
+  PB_10,  // 28 - LPUART1_VCP_RX
+  PB_11,  // 29 - LPUART1_VCP_TX
+  PC_13,  // 30 - USB_DETECT
+  PC_14,  // 31 - OSC32_IN
+  PC_15,  // 32 - OSC32_OUT
+  PH_0,   // 33 - ENABLE_3V3
+  PH_1,   // 34 - DISCHARGE_3V3
+  PH_3    // 35 - B
+};
+
+// Analog (Ax) to digital pin number array
+const uint32_t analogInputPin[] = {
+  0,  // A0,  PA0
+  1,  // A1,  PA1
+  2,  // A2,  PA2
+  3,  // A3,  PA3
+  4,  // A4,  PB1
+  16  // A5,  PA7
+};
+
+// ----------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+WEAK void initVariant(void)
+{
+  GPIO_InitTypeDef  GPIO_InitStruct;
+
+  // Init lines that we'll be using below
+  __HAL_RCC_GPIOA_CLK_ENABLE();
+  __HAL_RCC_GPIOC_CLK_ENABLE();
+  __HAL_RCC_GPIOH_CLK_ENABLE();
+
+  /* Set DISCHARGE_3V3 as well as the pins we're not initially using to FLOAT */
+  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Pin = GPIO_PIN_1;
+  HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); /* PH1 DISCHARGE_3V3 */
+  GPIO_InitStruct.Pin = GPIO_PIN_13;
+  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* PC13 is USB_DETECT */
+  GPIO_InitStruct.Pin = GPIO_PIN_15;
+  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* PA15 is CHARGE_DETECT */
+  GPIO_InitStruct.Pin = GPIO_PIN_4;
+  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* PA4 is BAT_VOLTAGE */
+
+  /* Turn on the 3V3 regulator */
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
+  GPIO_InitStruct.Pin = GPIO_PIN_0;
+  HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
+  HAL_GPIO_WritePin(GPIOH, GPIO_InitStruct.Pin, GPIO_PIN_SET);
+
+}
+
+/**
+  * @brief  System Clock Configuration
+  * @param  None
+  * @retval None
+  */
+WEAK void SystemClock_Config(void)
+{
+  RCC_OscInitTypeDef RCC_OscInitStruct = {};
+  RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
+  RCC_PeriphCLKInitTypeDef PeriphClkInit = {};
+
+  /** Configure the main internal regulator output voltage
+  */
+  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {
+    Error_Handler();
+  }
+  /** Configure LSE Drive Capability
+  */
+  HAL_PWR_EnableBkUpAccess();
+  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+  /** Initializes the RCC Oscillators according to the specified parameters
+  * in the RCC_OscInitTypeDef structure.
+  */
+  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_MSI;
+  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
+  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
+    Error_Handler();
+  }
+  /** Initializes the CPU, AHB and APB buses clocks
+  */
+  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
+                                | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+
+  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
+    Error_Handler();
+  }
+  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB | RCC_PERIPHCLK_SDMMC1
+                                       | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_OSPI;
+  PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;
+  PeriphClkInit.OspiClockSelection = RCC_OSPICLKSOURCE_SYSCLK;
+  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_MSI;
+  PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_MSI;
+  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
+    Error_Handler();
+  }
+  /** Enable MSI Auto calibration
+  */
+  HAL_RCCEx_EnableMSIPLLMode();
+
+  /** Ensure that MSI is wake-up system clock
+  */
+  __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ARDUINO_CYGNET_L4 */
diff --git a/variants/STM32L4xx/L431C(B-C)(T-U)/variant_CYGNET_L4.h b/variants/STM32L4xx/L431C(B-C)(T-U)/variant_CYGNET_L4.h
new file mode 100644
index 0000000000..ed0e3810e6
--- /dev/null
+++ b/variants/STM32L4xx/L431C(B-C)(T-U)/variant_CYGNET_L4.h
@@ -0,0 +1,208 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2020, STMicroelectronics
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *                        opensource.org/licenses/BSD-3-Clause
+ *
+ *******************************************************************************
+ */
+#pragma once
+
+/*----------------------------------------------------------------------------
+ *        Arduino digital pin numbers on the right (indexes into the digitalPin[] array)
+ *        and the STM32 pins they correspond to on the left.  The only apparent
+ *        function I can see is to reference a pin in a sketch in something
+ *        like digitalWrite() and have it index into digitalPin[] to find the
+ *        actual pin.  On the other hand, PIN_A* are numbers offset by PNUM_ANALOG_BASE,
+ *		  which serves to say that this IS an analog pin and which tells analogWrite
+ *        to index into the digitalPin[] array to find the actual pin.
+ *----------------------------------------------------------------------------*/
+#define PA0                     PIN_A0	// A0/D0
+#define PA1                     PIN_A1	// A1/D1
+#define PA2                     PIN_A2	// A2/D2
+#define PA3                     PIN_A3	// A3/D3
+#define PB1                     PIN_A4	// A4/D4
+#define PB8                     5		// D5
+#define PB9                     6		// D6
+#define PA4                     7		// BAT_VOLTAGE
+#define PA8                     8		// LED_BUILTIN
+#define PB14                    9		// D9
+#define PB13                    10		// D10
+#define PB0                     11		// D11
+#define PB15                    12		// D12
+#define PB4                     13		// D13
+#define PA5                     14		// CK
+#define PA6                     15		// MI
+#define PA7                     PIN_A5	// A5
+#define PA9                     17		// TX
+#define PA10                    18		// RX
+#define PA11                    19		// USB_DM
+#define PA12                    20		// USB_DP
+#define PA13                    21		// SWDIO
+#define PA14                    22		// SWCLK
+#define PA15                    23		// CHARGE_DETECT
+#define PB3                     24		// USER_BTN
+#define PB5                     25		// MO
+#define PB6                     26		// SCL
+#define PB7                     27		// SDA
+#define PB10                    28		// LPUART1_VCP_RX
+#define PB11                    29		// LPUART1_VCP_TX
+#define PC13                    30		// USB_DETECT
+#define PC14                    31		// OSC32_IN
+#define PC15                    32		// OSC32_OUT
+#define PH0                     33		// ENABLE_3V3
+#define PH1                     34		// DISCHARGE_3V3
+#define PH3                     35		// B
+
+// Alternate pins number
+#define PA1_ALT1                (PA1  | ALT1)
+#define PA2_ALT1                (PA2  | ALT1)
+#define PA3_ALT1                (PA3  | ALT1)
+#define PA4_ALT1                (PA4  | ALT1)
+#define PA6_ALT1                (PA6  | ALT1)
+#define PA15_ALT1               (PA15 | ALT1)
+#define PB1_ALT1                (PB1  | ALT1)
+#define PB3_ALT1                (PB3  | ALT1)
+#define PB4_ALT1                (PB4  | ALT1)
+#define PB5_ALT1                (PB5  | ALT1)
+#define PB13_ALT1               (PB13 | ALT1)
+#define PB14_ALT1               (PB14 | ALT1)
+#define PB15_ALT1               (PB15 | ALT1)
+
+#define NUM_DIGITAL_PINS        36
+#define NUM_ANALOG_INPUTS       6
+
+// On-board LED pin number
+#ifndef LED_BUILTIN
+  #define LED_BUILTIN           PA8
+#endif
+
+// On-board user button
+#ifndef USER_BTN
+  #define USER_BTN              PB3
+#endif
+
+// Power switch ENABLE and DISCHARGE pins                                                                               
+#ifndef ENABLE_3V3
+#define ENABLE_3V3				PH0
+#endif
+#ifndef DISCHARGE_3V3
+  #define DISCHARGE_3V3         PH1
+  #define DISABLE_DISCHARGING   HIGH
+  #define ENABLE_DISCHARGING    LOW
+#endif
+#ifndef CHARGE_DETECT
+#define CHARGE_DETECT			PA15
+#endif
+
+// SPI definitions
+#ifndef PIN_SPI_SS
+#define PIN_SPI_SS              PB8	// Just default to D5, because we don't have a CS pin
+#endif
+#ifndef PIN_SPI_SS1
+  #define PIN_SPI_SS1           PNUM_NOT_DEFINED
+#endif
+#ifndef PIN_SPI_SS2
+  #define PIN_SPI_SS2           PNUM_NOT_DEFINED
+#endif
+#ifndef PIN_SPI_SS3
+  #define PIN_SPI_SS3           PNUM_NOT_DEFINED
+#endif
+#ifndef PIN_SPI_MOSI
+  #define PIN_SPI_MOSI          PB5
+#endif
+#ifndef PIN_SPI_MISO
+  #define PIN_SPI_MISO          PA6
+#endif
+#ifndef PIN_SPI_SCK
+  #define PIN_SPI_SCK           PA5
+#endif
+
+// I2C definitions
+#ifndef PIN_WIRE_SDA
+  #define PIN_WIRE_SDA          PB7
+#endif
+#ifndef PIN_WIRE_SCL
+  #define PIN_WIRE_SCL          PB6
+#endif
+
+// Timer Definitions
+// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin
+#ifndef TIMER_TONE
+  #define TIMER_TONE            TIM6
+#endif
+#ifndef TIMER_SERVO
+  #define TIMER_SERVO           TIM7
+#endif
+
+// UART Definitions
+#ifndef SERIAL_UART_INSTANCE
+  #define SERIAL_UART_INSTANCE  101
+#endif
+
+// Default pin used for generic 'Serial' instance
+// Mandatory for Firmata
+#ifndef PIN_SERIAL_RX
+  #define PIN_SERIAL_RX         PA10
+#endif
+#ifndef PIN_SERIAL_TX
+  #define PIN_SERIAL_TX         PA9
+#endif
+
+// LPUART1                                                                                                              
+#ifndef PIN_SERIAL_LP1_RX
+  #define PIN_SERIAL_LP1_RX     PB10
+#endif
+#ifndef PIN_SERIAL_LP1_TX
+  #define PIN_SERIAL_LP1_TX     PB11
+#endif
+
+// Virtual COM Port for Cygnet with a 14-pin STLink Connector mounted.                                                   
+// To use the STLINK's Virtual COM port, this would be added to an Arduino project:                                     
+//     HardwareSerial SerialVCP(PIN_VCP_RX, PIN_VCP_TX);                                                                
+#ifndef PIN_VCP_RX
+  #define PIN_VCP_RX     PIN_SERIAL_LP1_RX
+#endif
+#ifndef PIN_VCP_TX
+  #define PIN_VCP_TX     PIN_SERIAL_LP1_TX
+#endif
+
+// Extra HAL modules
+#if !defined(HAL_DAC_MODULE_DISABLED)
+  #define HAL_DAC_MODULE_ENABLED
+#endif
+#if !defined(HAL_QSPI_MODULE_DISABLED)
+  #define HAL_QSPI_MODULE_ENABLED
+#endif
+
+/*----------------------------------------------------------------------------
+ *        Arduino objects - C++ only
+ *----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+  // These serial port names are intended to allow libraries and architecture-neutral
+  // sketches to automatically default to the correct port name for a particular type
+  // of use.  For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
+  // the first hardware serial port whose RX/TX pins are not dedicated to another use.
+  //
+  // SERIAL_PORT_MONITOR        Port which normally prints to the Arduino Serial Monitor
+  //
+  // SERIAL_PORT_USBVIRTUAL     Port which is USB virtual serial
+  //
+  // SERIAL_PORT_LINUXBRIDGE    Port which connects to a Linux system via Bridge library
+  //
+  // SERIAL_PORT_HARDWARE       Hardware serial port, physical RX & TX pins.
+  //
+  // SERIAL_PORT_HARDWARE_OPEN  Hardware serial ports which are open for use.  Their RX & TX
+  //                            pins are NOT connected to anything by default.
+  #ifndef SERIAL_PORT_MONITOR
+    #define SERIAL_PORT_MONITOR   Serial
+  #endif
+  #ifndef SERIAL_PORT_HARDWARE
+    #define SERIAL_PORT_HARDWARE  Serial
+  #endif
+#endif