From c9646b63b532d2f39590780e7cda8a0fa9c8b10b Mon Sep 17 00:00:00 2001 From: Aymane Bahssain Date: Wed, 21 Jan 2026 09:52:20 +0100 Subject: [PATCH] feat(spi): make SPISettings constructors constexpr SPISettings was originally implemented with init_AlwaysInline / init_MightInline helpers, using runtime initialization only. This change: - removes init_AlwaysInline / init_MightInline helpers, - replaces them with constexpr constructors that directly initialize the members, - keeps the existing API surface refs: stm32duino/Arduino_Core_STM32#2204 stm32duino/Arduino_Core_STM32#2201 --- api/HardwareSPI.h | 47 ++++++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/api/HardwareSPI.h b/api/HardwareSPI.h index 6be2b927..70a1d435 100644 --- a/api/HardwareSPI.h +++ b/api/HardwareSPI.h @@ -45,24 +45,25 @@ typedef enum { class SPISettings { public: - SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER) { - if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode, busMode); - } else { - init_MightInline(clock, bitOrder, dataMode, busMode); - } - } - - SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER) { - if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode, busMode); - } else { - init_MightInline(clock, bitOrder, (SPIMode)dataMode, busMode); - } - } - + constexpr SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER) + : clockFreq(clock), + dataMode(dataMode), + bitOrder(bitOrder), + busMode(busMode) + { } + constexpr SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER) + : clockFreq(clock), + dataMode((SPIMode)dataMode), + bitOrder(bitOrder), + busMode(busMode) + { } // Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first. - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, SPI_CONTROLLER); } + constexpr SPISettings() + : clockFreq(4000000), + dataMode(SPI_MODE0), + bitOrder(MSBFIRST), + busMode(SPI_CONTROLLER) + { } bool operator==(const SPISettings& rhs) const { @@ -94,18 +95,6 @@ class SPISettings { } private: - void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode) { - init_AlwaysInline(clock, bitOrder, dataMode, busMode); - } - - // Core developer MUST use an helper function in beginTransaction() to use this data - void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode) __attribute__((__always_inline__)) { - this->clockFreq = clock; - this->dataMode = dataMode; - this->bitOrder = bitOrder; - this->busMode = busMode; - } - uint32_t clockFreq; SPIMode dataMode; BitOrder bitOrder;