From 79045ac77fb19a5bd719278460031e89eb2b73ba Mon Sep 17 00:00:00 2001
From: Stephan Fabry <stephan.fabry@eq-3.com>
Date: Tue, 21 May 2024 14:45:55 +0200
Subject: [PATCH 1/2] variants(wl): added Support for ELV-BM-TRX1

Signed-off-by: Stephan Fabry <stephan.fabry@eq-3.com>
Co-Authored-by: Frederic Pillon <frederic.pillon@st.com>
---
 README.md                                     |   7 +
 boards.txt                                    |  78 +++++++
 cmake/boards_db.cmake                         |  54 +++++
 .../CMakeLists.txt                            |   1 +
 .../PeripheralPins_ELV_BM_TRX1.c              | 176 +++++++++++++++
 .../variant_ELV_BM_TRX1.cpp                   | 105 +++++++++
 .../variant_ELV_BM_TRX1.h                     | 201 ++++++++++++++++++
 7 files changed, 622 insertions(+)
 create mode 100644 variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/PeripheralPins_ELV_BM_TRX1.c
 create mode 100644 variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.cpp
 create mode 100644 variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.h

diff --git a/README.md b/README.md
index 2d4a13cc9f..a0f494024d 100644
--- a/README.md
+++ b/README.md
@@ -84,6 +84,7 @@ User can add a STM32 based board following this [wiki](https://github.com/stm32d
  - [LoRa boards](#lora-boards)
  - [Midatronics boards](#midatronics-boards)
  - [SparkFun boards](#sparkfun-boards)
+ - [ELV Boards](#elv-boards)
 
 **Note about Status**:
   - :green_heart: board support is available since the specified release version.
@@ -831,6 +832,12 @@ User can add a STM32 based board following this [wiki](https://github.com/stm32d
 | :green_heart: | STM32F405RG | [SparkFun MicroMod Processor Board - STM32F405](https://www.sparkfun.com/products/21326) | *2.6.0* |  |
 | :green_heart: | STM32WB5MMG | [SparkFun MicroMod Processor Board - STM32WB5MMG](https://www.sparkfun.com/products/21438) | *2.6.0* |  |
 
+### [ELV Boards](https://de.elv.com/lorawan)
+
+| Status | Device(s) | Name | Release | Notes |
+| :----: | :-------: | ---- | :-----: | :---- |
+| :yellow_heart:  | STM32WLE5JB | ELV-BM-TRX1 | **2.8.0** |  |
+
 ## Next release
 
 See [milestones](https://github.com/stm32duino/Arduino_Core_STM32/milestones) to have an overview of the next release content.
diff --git a/boards.txt b/boards.txt
index a7ec72b2a4..5176037595 100644
--- a/boards.txt
+++ b/boards.txt
@@ -11277,6 +11277,40 @@ SparkFun.menu.upload_method.dfuMethod.upload.protocol=2
 SparkFun.menu.upload_method.dfuMethod.upload.options=
 SparkFun.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
 
+################################################################################
+# ELV Modular System boards
+
+ELV_Modular_System.name=ELV Modular System boards
+ELV_Modular_System.build.core=arduino
+ELV_Modular_System.build.board=ELV_Modular_System
+ELV_Modular_System.build.variant_h=variant_{build.board}.h
+ELV_Modular_System.upload.maximum_size=0
+ELV_Modular_System.upload.maximum_data_size=0
+
+# ELV-BM-TRX1 board
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1=ELV-LW-Base ELV_BM_TRX1
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.upload.maximum_size=129024
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.upload.maximum_data_size=49152
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.mcu=cortex-m4
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.board=ELV_BM_TRX1
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.series=STM32WLxx
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.product_line=STM32WLE5xx
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.variant=STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.peripheral_pins=-DCUSTOM_PERIPHERAL_PINS
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.flash_offset=0x800
+ELV_Modular_System.menu.pnum.ELV_BM_TRX1.build.st_extra_flags=-D{build.product_line} -DUSE_CM4_STARTUP_FILE {build.xSerial}
+
+# Upload menu
+ELV_Modular_System.menu.upload_method.swdMethod=STM32CubeProgrammer (SWD) with Bootloader
+ELV_Modular_System.menu.upload_method.swdMethod.upload.protocol=0
+ELV_Modular_System.menu.upload_method.swdMethod.upload.tool=stm32CubeProg
+
+
+ELV_Modular_System.menu.upload_method.serialMethod=STM32CubeProgrammer (Serial) with Bootloader
+ELV_Modular_System.menu.upload_method.serialMethod.upload.protocol=1
+ELV_Modular_System.menu.upload_method.serialMethod.upload.options={serial.port.file}
+ELV_Modular_System.menu.upload_method.serialMethod.upload.tool=stm32CubeProg
+
 ################################################################################
 # Serialx activation
 Nucleo_144.menu.xserial.generic=Enabled (generic 'Serial')
@@ -11497,6 +11531,12 @@ SparkFun.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NO
 SparkFun.menu.xserial.disabled=Disabled (no Serial support)
 SparkFun.menu.xserial.disabled.build.xSerial=
 
+ELV_Modular_System.menu.xserial.generic=Enabled (generic 'Serial')
+ELV_Modular_System.menu.xserial.none=Enabled (no generic 'Serial')
+ELV_Modular_System.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
+ELV_Modular_System.menu.xserial.disabled=Disabled (no Serial support)
+ELV_Modular_System.menu.xserial.disabled.build.xSerial=
+
 # USB connectivity
 Nucleo_144.menu.usb.none=None
 Nucleo_144.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART)
@@ -12547,6 +12587,26 @@ SparkFun.menu.opt.ogstd.build.flags.optimize=-Og
 SparkFun.menu.opt.o0std=No Optimization (-O0)
 SparkFun.menu.opt.o0std.build.flags.optimize=-O0
 
+ELV_Modular_System.menu.opt.osstd=Smallest (-Os default)
+ELV_Modular_System.menu.opt.oslto=Smallest (-Os) with LTO
+ELV_Modular_System.menu.opt.oslto.build.flags.optimize=-Os -flto
+ELV_Modular_System.menu.opt.o1std=Fast (-O1)
+ELV_Modular_System.menu.opt.o1std.build.flags.optimize=-O1
+ELV_Modular_System.menu.opt.o1lto=Fast (-O1) with LTO
+ELV_Modular_System.menu.opt.o1lto.build.flags.optimize=-O1 -flto
+ELV_Modular_System.menu.opt.o2std=Faster (-O2)
+ELV_Modular_System.menu.opt.o2std.build.flags.optimize=-O2
+ELV_Modular_System.menu.opt.o2lto=Faster (-O2) with LTO
+ELV_Modular_System.menu.opt.o2lto.build.flags.optimize=-O2 -flto
+ELV_Modular_System.menu.opt.o3std=Fastest (-O3)
+ELV_Modular_System.menu.opt.o3std.build.flags.optimize=-O3
+ELV_Modular_System.menu.opt.o3lto=Fastest (-O3) with LTO
+ELV_Modular_System.menu.opt.o3lto.build.flags.optimize=-O3 -flto
+ELV_Modular_System.menu.opt.ogstd=Debug (-Og)
+ELV_Modular_System.menu.opt.ogstd.build.flags.optimize=-Og
+ELV_Modular_System.menu.opt.o0std=No Optimization (-O0)
+ELV_Modular_System.menu.opt.o0std.build.flags.optimize=-O0
+
 # Debug information
 Nucleo_144.menu.dbg.none=None
 Nucleo_144.menu.dbg.enable_sym=Symbols Enabled (-g)
@@ -12816,6 +12876,14 @@ SparkFun.menu.dbg.enable_log.build.flags.debug=
 SparkFun.menu.dbg.enable_all=Core Logs and Symbols Enabled (-g)
 SparkFun.menu.dbg.enable_all.build.flags.debug=-g
 
+ELV_Modular_System.menu.dbg.none=None
+ELV_Modular_System.menu.dbg.enable_sym=Symbols Enabled (-g)
+ELV_Modular_System.menu.dbg.enable_sym.build.flags.debug=-g -DNDEBUG
+ELV_Modular_System.menu.dbg.enable_log=Core logs Enabled
+ELV_Modular_System.menu.dbg.enable_log.build.flags.debug=
+ELV_Modular_System.menu.dbg.enable_all=Core Logs and Symbols Enabled (-g)
+ELV_Modular_System.menu.dbg.enable_all.build.flags.debug=-g
+
 # C Runtime Library
 Nucleo_144.menu.rtlib.nano=Newlib Nano (default)
 Nucleo_144.menu.rtlib.nanofp=Newlib Nano + Float Printf
@@ -13166,3 +13234,13 @@ SparkFun.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
 SparkFun.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
 SparkFun.menu.rtlib.full=Newlib Standard
 SparkFun.menu.rtlib.full.build.flags.ldspecs=
+
+ELV_Modular_System.menu.rtlib.nano=Newlib Nano (default)
+ELV_Modular_System.menu.rtlib.nanofp=Newlib Nano + Float Printf
+ELV_Modular_System.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+ELV_Modular_System.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+ELV_Modular_System.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+ELV_Modular_System.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+ELV_Modular_System.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+ELV_Modular_System.menu.rtlib.full=Newlib Standard
+ELV_Modular_System.menu.rtlib.full.build.flags.ldspecs=
diff --git a/cmake/boards_db.cmake b/cmake/boards_db.cmake
index ed27ecbb3d..6cf6b65092 100644
--- a/cmake/boards_db.cmake
+++ b/cmake/boards_db.cmake
@@ -5884,6 +5884,60 @@ target_compile_options(ELEKTOR_F072CB_serial_none INTERFACE
   "SHELL:-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE"
 )
 
+# ELV_BM_TRX1
+# -----------------------------------------------------------------------------
+
+set(ELV_BM_TRX1_VARIANT_PATH "${CMAKE_CURRENT_LIST_DIR}/../variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I")
+set(ELV_BM_TRX1_MAXSIZE 124927)
+set(ELV_BM_TRX1_MAXDATASIZE 16383)
+set(ELV_BM_TRX1_MCU cortex-m4)
+set(ELV_BM_TRX1_FPCONF "-")
+add_library(ELV_BM_TRX1 INTERFACE)
+target_compile_options(ELV_BM_TRX1 INTERFACE
+  "SHELL:-DSTM32WLE5xx -DUSE_CM4_STARTUP_FILE "
+  "SHELL:"
+  "SHELL:"
+  "SHELL: "
+  -mcpu=${ELV_BM_TRX1_MCU}
+)
+target_compile_definitions(ELV_BM_TRX1 INTERFACE
+  "STM32WLxx"
+	"ARDUINO_ELV_BM_TRX1"
+	"BOARD_NAME=\"ELV_BM_TRX1\""
+	"BOARD_ID=ELV_BM_TRX1"
+	"VARIANT_H=\"variant_ELV_BM_TRX1.h\""
+)
+target_include_directories(ELV_BM_TRX1 INTERFACE
+  ${CMAKE_CURRENT_LIST_DIR}/../system/STM32WLxx
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/STM32WLxx_HAL_Driver/Inc
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/STM32WLxx_HAL_Driver/Src
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/CMSIS/Device/ST/STM32WLxx/Include/
+  ${CMAKE_CURRENT_LIST_DIR}/../system/Drivers/CMSIS/Device/ST/STM32WLxx/Source/Templates/gcc/
+  ${ELV_BM_TRX1_VARIANT_PATH}
+)
+
+target_link_options(ELV_BM_TRX1 INTERFACE
+  "LINKER:--default-script=${ELV_BM_TRX1_VARIANT_PATH}/ldscript.ld"
+  "LINKER:--defsym=LD_FLASH_OFFSET=0x0800"
+	"LINKER:--defsym=LD_MAX_SIZE=124927"
+	"LINKER:--defsym=LD_MAX_DATA_SIZE=16383"
+  "SHELL: "
+  -mcpu=${ELV_BM_TRX1_MCU}
+)
+
+add_library(ELV_BM_TRX1_serial_disabled INTERFACE)
+target_compile_options(ELV_BM_TRX1_serial_disabled INTERFACE
+  "SHELL:"
+)
+add_library(ELV_BM_TRX1_serial_generic INTERFACE)
+target_compile_options(ELV_BM_TRX1_serial_generic INTERFACE
+  "SHELL:-DHAL_UART_MODULE_ENABLED"
+)
+add_library(ELV_BM_TRX1_serial_none INTERFACE)
+target_compile_options(ELV_BM_TRX1_serial_none INTERFACE
+  "SHELL:-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE"
+)
+
 # ETHERCAT_DUINO
 # -----------------------------------------------------------------------------
 
diff --git a/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/CMakeLists.txt b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/CMakeLists.txt
index b74b6b9dde..1bb69e4deb 100644
--- a/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/CMakeLists.txt
+++ b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/CMakeLists.txt
@@ -22,6 +22,7 @@ add_library(variant_bin STATIC EXCLUDE_FROM_ALL
   generic_clock.c
   PeripheralPins.c
   PeripheralPins_LORA_E5_MINI.c
+  variant_ELV_BM_TRX1.cpp
   variant_generic.cpp
   variant_LORA_E5_MINI.cpp
   variant_NUCLEO_WL55JC1.cpp
diff --git a/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/PeripheralPins_ELV_BM_TRX1.c b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/PeripheralPins_ELV_BM_TRX1.c
new file mode 100644
index 0000000000..78e45dd607
--- /dev/null
+++ b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/PeripheralPins_ELV_BM_TRX1.c
@@ -0,0 +1,176 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2024, 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
+ *
+ *******************************************************************************
+ */
+/*
+ * Automatically generated from STM32WL54JCIx.xml, STM32WL55JCIx.xml
+ * STM32WLE4J8Ix.xml, STM32WLE4JBIx.xml
+ * STM32WLE4JCIx.xml, STM32WLE5J8Ix.xml
+ * STM32WLE5JBIx.xml, STM32WLE5JCIx.xml
+ * CubeMX DB release 6.0.100
+ */
+#if defined(ARDUINO_ELV_BM_TRX1)
+#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_13, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC_IN9
+  {PA_14, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC_IN10
+  {PB_14, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC_IN1
+  {NC,    NP,   0}
+};
+#endif
+
+//*** DAC ***
+
+#ifdef HAL_DAC_MODULE_ENABLED
+WEAK const PinMap PinMap_DAC[] = {
+  {PA_10, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1
+  {NC,    NP,   0}
+};
+#endif
+
+//*** I2C ***
+
+#ifdef HAL_I2C_MODULE_ENABLED
+WEAK const PinMap PinMap_I2C_SDA[] = {
+  {PA_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
+  {PA_15, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
+  {PB_14, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
+  {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)},
+  {PA_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
+  {NC,    NP,   0}
+};
+#endif
+
+//*** No I3C ***
+
+//*** TIM ***
+
+#ifdef HAL_TIM_MODULE_ENABLED
+WEAK const PinMap PinMap_TIM[] = {
+  {PA_2,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
+  {PA_3,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
+  {PA_5,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
+  {PA_6,      TIM16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1
+  {PA_7,      TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
+  {PA_7_ALT1, TIM17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1
+  {PA_11,     TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
+  {PB_3,      TIM2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
+  {PB_14,     TIM1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
+  {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)},
+  {PA_2_ALT1, USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
+  {PA_9,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+  {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)},
+  {PA_3_ALT1, USART2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
+  {PA_10,     USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+  {NC,        NP,      0}
+};
+#endif
+
+#ifdef HAL_UART_MODULE_ENABLED
+WEAK const PinMap PinMap_UART_RTS[] = {
+  {PA_12,     USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+  {PB_3,      USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+  {PB_12,     LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)},
+  {NC,        NP,      0}
+};
+#endif
+
+#ifdef HAL_UART_MODULE_ENABLED
+WEAK const PinMap PinMap_UART_CTS[] = {
+  {PA_6,  LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)},
+  {PA_11, USART1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+  {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)},
+  {PA_7_ALT1, SUBGHZSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF13_DEBUG_SUBGHZSPI)},
+  {PA_12,     SPI1,      STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
+  {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)},
+  {PA_6_ALT1, SUBGHZSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF13_DEBUG_SUBGHZSPI)},
+  {PA_11,     SPI1,      STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
+  {NC,        NP,        0}
+};
+#endif
+
+#ifdef HAL_SPI_MODULE_ENABLED
+WEAK const PinMap PinMap_SPI_SCLK[] = {
+  {PA_5,      SPI1,      STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
+  {PA_5_ALT1, SUBGHZSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF13_DEBUG_SUBGHZSPI)},
+  {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)},
+  {PA_4_ALT1, SUBGHZSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF13_DEBUG_SUBGHZSPI)},
+  {NC,        NP,        0}
+};
+#endif
+
+//*** No CAN ***
+
+//*** No ETHERNET ***
+
+//*** No QUADSPI ***
+
+//*** No USB ***
+
+//*** No SD ***
+
+#endif /* ARDUINO_ELV_BM_TRX1 */
diff --git a/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.cpp b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.cpp
new file mode 100644
index 0000000000..427f118333
--- /dev/null
+++ b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.cpp
@@ -0,0 +1,105 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2024, 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_ELV_BM_TRX1)
+#include "pins_arduino.h"
+// Digital PinName array
+const PinName digitalPin[] = {
+  NC,      // D0
+  PB_12,   // D1
+  PA_0,    // D2
+  PB_14,   // D3/A0
+  PC_13,   // D4
+  PA_9,    // D5
+  PA_10,   // D6
+  PA_11,   // D7
+  PA_12,   // D8
+  NC,      // D9
+  NC,      // D10
+  NC,      // D11
+  NC,      // D12
+  NC,      // D13
+  NC,      // D14
+  NC,      // D15
+  NC,      // D16
+  PA_14,   // D17/A2
+  PA_13,   // D18/A3
+  PA_2,    // D19
+  PA_3,    // D20
+  PA_4,    // D21
+  PA_5,    // D22
+  PA_6,    // D23
+  PA_7,    // D24
+  PA_15,   // D25
+  PB_3,    // D26
+  PC_4,    // D27
+  PC_5     // D28
+};
+
+// Analog (Ax) pin number array
+const uint32_t analogInputPin[] = {
+  3,  // A0,  PB14
+  11, // A1,  PA14
+  12  // A2,  PA13
+};
+
+// ----------------------------------------------------------------------------
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+  * @brief  System Clock Configuration
+  * @param  None
+  * @retval None
+ */
+WEAK void SystemClock_Config(void)
+{
+  RCC_OscInitTypeDef RCC_OscInitStruct = {};
+  RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
+  /* Configure the main internal regulator output voltage*/
+
+  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+
+  /* Initializes the CPU, AHB and APB busses clocks*/
+  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+  RCC_OscInitStruct.HSEDiv = RCC_HSE_DIV1;
+  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+  RCC_OscInitStruct.PLL.PLLN = 6;
+  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
+  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
+  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
+    Error_Handler();
+  }
+  /* Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers*/
+
+  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3 | RCC_CLOCKTYPE_HCLK
+                                | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1
+                                | RCC_CLOCKTYPE_PCLK2;
+  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+  RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1;
+
+  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
+    Error_Handler();
+  }
+}
+#ifdef __cplusplus
+}
+#endif
+#endif /* ARDUINO_ELV_BM_TRX1 */
diff --git a/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.h b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.h
new file mode 100644
index 0000000000..fa13e9d1fb
--- /dev/null
+++ b/variants/STM32WLxx/WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I/variant_ELV_BM_TRX1.h
@@ -0,0 +1,201 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2024, 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
+
+/*----------------------------------------------------------------------------
+ *        STM32 pins number
+ *----------------------------------------------------------------------------*/
+
+// J2
+#define PB12                    1
+#define PA0                     2
+#define PB14                    PIN_A0
+#define PC13                    4
+#define PA9                     5
+#define PA10                    6
+#define PA11                    7
+#define PA12                    8
+// J1
+#define PA14                    PIN_A1
+#define PA13                    PIN_A2
+#define PA2                     19
+#define PA3                     20
+#define PA4                     21
+#define PA5                     22
+#define PA6                     23
+#define PA7                     24
+// Not on connectors
+#define PA15                    25
+#define PB3                     26
+#define PC4                     27
+#define PC5                     28
+
+// Not connected
+// PA1
+// PA8
+// PB0
+// PB1
+// PB2
+// PB4
+// PB5
+// PB6
+// PB7
+// PB8
+// PB9
+// PB10
+// PB11
+// PB13
+// PB15
+// PC0
+// PC1
+// PC2
+// PC3
+// PC6
+// PC14
+// PC15
+// PH3
+
+// Alternate pins number
+#define PA2_ALT1                (PA2 | ALT1)
+#define PA3_ALT1                (PA3 | ALT1)
+#define PA4_ALT1                (PA4 | ALT1)
+#define PA5_ALT1                (PA5 | ALT1)
+#define PA6_ALT1                (PA6 | ALT1)
+#define PA7_ALT1                (PA7 | ALT1)
+
+#define NUM_DIGITAL_PINS        29
+#define NUM_ANALOG_INPUTS       3
+
+// On-board LED pin number
+#define LED1                    PB3
+#define LED2                    PA15
+#ifndef LED_BUILTIN
+  #define LED_BUILTIN           LED1
+#endif
+#define LED_GREEN               LED1
+#define LED_RED                 LED2
+
+// On-board user button
+#ifndef USER_BTN
+  #define USER_BTN              PA0
+#endif
+
+// SPI definitions
+#ifndef PIN_SPI_SS
+  #define PIN_SPI_SS            PA4
+#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          PA7
+#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          PA11
+#endif
+#ifndef PIN_WIRE_SCL
+  #define PIN_WIRE_SCL          PA12
+#endif
+
+// Timer Definitions
+// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin
+#ifndef TIMER_TONE
+  #define TIMER_TONE            TIM16
+#endif
+#ifndef TIMER_SERVO
+  #define TIMER_SERVO           TIM17
+#endif
+
+// UART Definitions
+#ifndef SERIAL_UART_INSTANCE
+  #define SERIAL_UART_INSTANCE  1
+#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
+
+// Alias
+#ifndef DEBUG_SUBGHZSPI_MOSI
+  #define DEBUG_SUBGHZSPI_MOSI  PA7_ALT1
+#endif
+#ifndef DEBUG_SUBGHZSPI_MISO
+  #define DEBUG_SUBGHZSPI_MISO  PA6_ALT1
+#endif
+#ifndef DEBUG_SUBGHZSPI_SCLK
+  #define DEBUG_SUBGHZSPI_SCLK  PA5_ALT1
+#endif
+#ifndef DEBUG_SUBGHZSPI_SS
+  #define DEBUG_SUBGHZSPI_SS    PA4_ALT1
+#endif
+
+// LORAWAN settings
+#define LORAWAN_RFSWITCH_PINS           PC4,PC5
+#define LORAWAN_RFSWITCH_PIN_COUNT      2
+#define LORAWAN_RFSWITCH_OFF_VALUES     LOW,LOW
+#define LORAWAN_RFSWITCH_RX_VALUES      HIGH,LOW
+#define LORAWAN_RFSWITCH_RFO_LP_VALUES  HIGH,HIGH
+#define LORAWAN_RFSWITCH_RFO_HP_VALUES  LOW,HIGH
+#define XTAL_DEFAULT_CAP_VALUE          ( 0x14UL )
+#define LORAWAN_BOARD_HAS_TCXO          0
+#define LORAWAN_BOARD_HAS_DCDC          1
+#define LORAWAN_TX_CONFIG               RBI_CONF_RFO_LP
+#define EU868_TX_MAX_DATARATE           DR_5
+#define EU868_RX_MAX_DATARATE           DR_5
+#define EU868_DEFAULT_ANTENNA_GAIN      2.0f
+/*----------------------------------------------------------------------------
+ *        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

From 49caa994829dd0e772e3fd09f581f79b23b335bd Mon Sep 17 00:00:00 2001
From: Frederic Pillon <frederic.pillon@st.com>
Date: Thu, 23 May 2024 16:29:44 +0200
Subject: [PATCH 2/2] ci: skip elv.com

Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
---
 .github/workflows/MarkdwonLinksCheck.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/MarkdwonLinksCheck.yml b/.github/workflows/MarkdwonLinksCheck.yml
index e2199eb47f..c68646ef78 100644
--- a/.github/workflows/MarkdwonLinksCheck.yml
+++ b/.github/workflows/MarkdwonLinksCheck.yml
@@ -20,4 +20,4 @@ jobs:
         with:
           paths: '*.md ./CI/**/*.md, ./variants/**/*.md, ./libraries/**/*.md'
           verbosity: 'INFO'
-          skip: 'www.st.com'
+          linksToSkip: 'www.st.com, de.elv.com/lorawan'