diff --git a/variants/modular_mesh_maker/MMMBoard.cpp b/variants/modular_mesh_maker/MMMBoard.cpp new file mode 100644 index 0000000000..f88dfdd1b9 --- /dev/null +++ b/variants/modular_mesh_maker/MMMBoard.cpp @@ -0,0 +1,25 @@ +#include +#include + +#include "MMMBoard.h" + +void MMMBoard::begin() { + NRF52Board::begin(); + btn_prev_state = HIGH; + + pinMode(PIN_VBAT_READ, INPUT); + + #ifdef BUTTON_PIN + pinMode(BUTTON_PIN, INPUT_PULLUP); + #endif + + #if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) + Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL); + #endif + + Wire.begin(); + + pinMode(P_LORA_POWER_EN, OUTPUT); + digitalWrite(P_LORA_POWER_EN, HIGH); + delay(10); +} diff --git a/variants/modular_mesh_maker/MMMBoard.h b/variants/modular_mesh_maker/MMMBoard.h new file mode 100644 index 0000000000..a3ba5e2442 --- /dev/null +++ b/variants/modular_mesh_maker/MMMBoard.h @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include + +#define PIN_VBAT_READ 17 +#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking + +class MMMBoard : public NRF52BoardDCDC { +protected: + uint8_t btn_prev_state; + float adc_mult = ADC_MULTIPLIER; + +public: + MMMBoard() : NRF52Board("MMM_OTA") {} + void begin(); + + #define BATTERY_SAMPLES 8 + + uint16_t getBattMilliVolts() override { + analogReadResolution(12); + + uint32_t raw = 0; + for (int i = 0; i < BATTERY_SAMPLES; i++) { + raw += analogRead(PIN_VBAT_READ); + } + raw = raw / BATTERY_SAMPLES; + return (adc_mult * raw); + } + + bool setAdcMultiplier(float multiplier) override { + if (multiplier == 0.0f) { + adc_mult = ADC_MULTIPLIER;} + else { + adc_mult = multiplier; + } + return true; + } + float getAdcMultiplier() const override { + if (adc_mult == 0.0f) { + return ADC_MULTIPLIER; + } else { + return adc_mult; + } + } + + const char* getManufacturerName() const override { + return MANUFACTURER_STRING; + } + + int buttonStateChanged() { + #ifdef BUTTON_PIN + uint8_t v = digitalRead(BUTTON_PIN); + if (v != btn_prev_state) { + btn_prev_state = v; + return (v == LOW) ? 1 : -1; + } + #endif + return 0; + } +}; diff --git a/variants/modular_mesh_maker/platformio.ini b/variants/modular_mesh_maker/platformio.ini new file mode 100644 index 0000000000..f51d488c59 --- /dev/null +++ b/variants/modular_mesh_maker/platformio.ini @@ -0,0 +1,197 @@ +[modular_mesh_maker] +build_flags = ${nrf52_base.build_flags} + -I variants/modular_mesh_maker + -D MANUFACTURER_STRING='"Modular Mesh Maker"' + -D ENV_INCLUDE_AHTX0=1 + -D ENV_INCLUDE_BME280=1 + -D ENV_INCLUDE_BMP280=1 + -D ENV_INCLUDE_INA3221=1 + -D ENV_INCLUDE_INA219=1 +build_src_filter = ${nrf52_base.build_src_filter} + + + +<../variants/modular_mesh_maker> +lib_deps= ${nrf52_base.lib_deps} + adafruit/Adafruit SSD1306 @ ^2.5.13 + adafruit/Adafruit INA3221 Library @ ^1.0.1 + adafruit/Adafruit INA219 @ ^1.2.3 + adafruit/Adafruit AHTX0 @ ^2.0.5 + adafruit/Adafruit BME280 Library @ ^2.3.0 + adafruit/Adafruit BMP280 Library@^2.6.8 + +[mmm_promicro] +extends = nrf52_base +board = promicro_nrf52840 +build_src_filter = ${modular_mesh_maker.build_src_filter} +build_flags = ${modular_mesh_maker.build_flags} + -D PROMICRO + -D P_LORA_POWER_EN=2 + -D P_LORA_DIO_1=11 + -D P_LORA_NSS=13 + -D P_LORA_SCLK=12 + -D P_LORA_MOSI=14 + -D P_LORA_MISO=15 + -D P_LORA_RESET=10 + -D P_LORA_BUSY=16 + -D PIN_BOARD_SCL=7 + -D PIN_BOARD_SDA=8 + -D PIN_OLED_RESET=-1 + -D PIN_USER_BTN=6 +; GPS RX and TX are defined backwards by Meshcore +; PIN_GPS_RX is output to GPS uart +; PIN_GPS_TX is input from GPS uart + -D PIN_GPS_RX=4 + -D PIN_GPS_TX=3 + -D PIN_GPS_EN=5 + -D GPS_BAUD_RATE=115200 + -D ENV_INCLUDE_GPS=1 +lib_deps = ${modular_mesh_maker.lib_deps} + stevemarple/MicroNMEA @ ^2.0.6 + +[mmm_xiaonrf52] +extends = nrf52_base +board = seeed-xiao-afruitnrf52-nrf52840 +board_build.ldscript = boards/nrf52840_s140_v7.ld +build_src_filter = ${modular_mesh_maker.build_src_filter} +build_flags = ${modular_mesh_maker.build_flags} + -D NRF52_PLATFORM + -D XIAO_NRF52 + -I lib/nrf52/s140_nrf52_7.3.0_API/include + -I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52 + -I src/helpers/nrf52 + -D P_LORA_TX_LED=D11 + -D DISPLAY_CLASS=SSD1306Display + -D DISPLAY_ROTATION=2 + -D P_LORA_DIO_1=1 + -D P_LORA_RESET=2 + -D P_LORA_BUSY=3 + -D P_LORA_NSS=4 + -D P_LORA_POWER_EN=5 + -D PIN_USER_BTN=0 + -D PIN_WIRE_SCL=7 + -D PIN_WIRE_SDA=6 + -UENV_INCLUDE_GPS +lib_deps = ${modular_mesh_maker.lib_deps} + +[mmm_lr2021] +extends = modular_mesh_maker +build_src_filter = ${modular_mesh_maker} +build_flags = + -D USE_LR2021 + -D RADIO_CLASS=CustomLR2021 + -D WRAPPER_CLASS=CustomLR2021Wrapper + -D LR2021_IRQ_DIO=9 + -D LR2021_TCXO_VOLTAGE=3.3f + -D RF_SWITCH_TABLE + -D LORA_TX_POWER=22 + +[mmm_e22p] +extends = modular_mesh_maker +build_src_filter = ${modular_mesh_maker} +build_flags = + -D USE_SX1262 + -D RADIO_CLASS=CustomSX1262 + -D WRAPPER_CLASS=CustomSX1262Wrapper + -D SX126X_POWER_EN=D5 + -D SX126X_TXEN=RADIOLIB_NC + -D SX126X_DIO2_AS_RF_SWITCH=1 + -D SX126X_DIO3_TCXO_VOLTAGE=1.8 + -D SX126X_CURRENT_LIMIT=140 + -D SX126X_RX_BOOSTED_GAIN=1 + -D LORA_TX_POWER=18 + +[env:mmm_promicro_e22p_repeater] +extends = mmm_promicro +build_src_filter = ${modular_mesh_maker.build_src_filter} + ${mmm_promicro.build_src_filter} + ${mmm_e22p.build_src_filter} + +<../examples/simple_repeater> + + + + +build_flags = + ${modular_mesh_maker.build_flags} + ${mmm_promicro.build_flags} + ${mmm_e22p.build_flags} + -D ADVERT_NAME='"Modular Mesh Maker Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=SSD1306Display +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = ${modular_mesh_maker.lib_deps} + ${mmm_promicro.lib_deps} + adafruit/RTClib @ ^2.1.3 + + +[env:mmm_promicro_lr2021_repeater] +extends = mmm_promicro +build_src_filter = ${modular_mesh_maker.build_src_filter} + ${mmm_promicro.build_src_filter} + ${mmm_lr2021.build_src_filter} + +<../examples/simple_repeater> + + + + +build_flags = + ${modular_mesh_maker.build_flags} + ${mmm_promicro.build_flags} + ${mmm_lr2021.build_flags} + -D ADVERT_NAME='"Modular Mesh Maker Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=SSD1306Display +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = ${modular_mesh_maker.lib_deps} + ${mmm_promicro.lib_deps} + adafruit/RTClib @ ^2.1.3 + +[env:mmm_xiaonrf52_e22p_repeater] +extends = mmm_xiaonrf52 +build_src_filter = ${modular_mesh_maker.build_src_filter} + ${mmm_xiaonrf52.build_src_filter} + ${mmm_e22p.build_src_filter} + +<../examples/simple_repeater> + + + + +build_flags = + ${modular_mesh_maker.build_flags} + ${mmm_xiaonrf52.build_flags} + ${mmm_e22p.build_flags} + -D ADVERT_NAME='"Modular Mesh Maker Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=SSD1306Display +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = ${modular_mesh_maker.lib_deps} + ${mmm_xiaonrf52.lib_deps} + adafruit/RTClib @ ^2.1.3 + +[env:mmm_xiaonrf52_lr2021_repeater] +extends = mmm_xiaonrf52 +build_src_filter = ${modular_mesh_maker.build_src_filter} + ${mmm_xiaonrf52.build_src_filter} + ${mmm_lr2021.build_src_filter} + +<../examples/simple_repeater> + + + + +build_flags = + ${modular_mesh_maker.build_flags} + ${mmm_xiaonrf52.build_flags} + ${mmm_lr2021.build_flags} + -D ADVERT_NAME='"Modular Mesh Maker Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=SSD1306Display +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = ${modular_mesh_maker.lib_deps} + ${mmm_xiaonrf52.lib_deps} + adafruit/RTClib @ ^2.1.3 diff --git a/variants/modular_mesh_maker/target.cpp b/variants/modular_mesh_maker/target.cpp new file mode 100644 index 0000000000..0385abeefb --- /dev/null +++ b/variants/modular_mesh_maker/target.cpp @@ -0,0 +1,64 @@ +#include +#include "target.h" +#include + +MMMBoard board; + +RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); + +WRAPPER_CLASS radio_driver(radio, board); + +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); +#if ENV_INCLUDE_GPS + #include + MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock); + EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea); +#else + EnvironmentSensorManager sensors; +#endif + +#ifdef DISPLAY_CLASS + DISPLAY_CLASS display; + MomentaryButton user_btn(PIN_USER_BTN, 1000, true, true); +#endif + +#ifdef RF_SWITCH_TABLE + + const uint32_t rfswitch_dios[] = { + RADIOLIB_LR2021_DIO5, + RADIOLIB_LR2021_DIO6, + RADIOLIB_LR2021_DIO7, + RADIOLIB_LR2021_DIO8, + RADIOLIB_NC + }; + + static const Module::RfSwitchMode_t rfswitch_table[] = { + // mode DIO5 DIO6 DIO7 DIO8 + { LR2021::MODE_STBY, {LOW, LOW, LOW, LOW }}, + { LR2021::MODE_RX, {LOW, LOW, LOW, LOW }}, // sub-GHz RX is passive on the F33 + { LR2021::MODE_TX, {LOW, HIGH, LOW, LOW }}, // DIO6 = sub-GHz TXEN (PA key) + { LR2021::MODE_RX_HF, {HIGH, LOW, LOW, LOW}}, // 2.4G TX (never selected at 915MHz) + { LR2021::MODE_TX_HF, {LOW, LOW, HIGH, HIGH}}, // 2.4G TX (never selected at 915MHz) + END_OF_MODE_TABLE, + }; + +#endif + +bool radio_init() { + rtc_clock.begin(Wire); + + int err = radio.std_init(&SPI); + if (err != 1) return err; + +#ifdef RF_SWITCH_TABLE + radio.setRfSwitchTable(rfswitch_dios, rfswitch_table); +#endif + + return true; +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/modular_mesh_maker/target.h b/variants/modular_mesh_maker/target.h new file mode 100644 index 0000000000..aa66e34449 --- /dev/null +++ b/variants/modular_mesh_maker/target.h @@ -0,0 +1,33 @@ +#pragma once + +#define RADIOLIB_STATIC_ONLY 1 +#include +#include +#include + +#if defined(USE_LR2021) + #include +#elif defined(USE_SX1262) + #include +#endif + +#include +#ifdef DISPLAY_CLASS + #include + #include +#endif + +#include + +extern MMMBoard board; +extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; +extern EnvironmentSensorManager sensors; + +#ifdef DISPLAY_CLASS + extern DISPLAY_CLASS display; + extern MomentaryButton user_btn; +#endif + +bool radio_init(); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/modular_mesh_maker/variant.cpp b/variants/modular_mesh_maker/variant.cpp new file mode 100644 index 0000000000..0045131a14 --- /dev/null +++ b/variants/modular_mesh_maker/variant.cpp @@ -0,0 +1,85 @@ +#include "variant.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +#if defined(PROMICRO) + const uint32_t g_ADigitalPinMap[] = { + 8, // P0.08 = 0 + 6, // P0.06 = 1 + 17, // P0.17 = 2 + 20, // P0.20 = 3 + 22, // P0.22 = 4 + 24, // P0.24 = 5 + 32, // P1.00 = 6 + 11, // P0.11 = 7 + 36, // P1.04 = 8 + 38, // P1.06 = 9 + 9, // P0.09 = 10 + 10, // P0.10 = 11 + 43, // P1.11 = 12 + 45, // P1.13 = 13 + 47, // P1.15 = 14 + 2, // P0.02 = 15 + 29, // P0.29 = 16 + 31, // P0.31 = 17 + 33, // P1.01 = 18 + 34, // P1.02 = 19 + 37, // P1.05 = 20 + 13, // P0.13 = 21 + 15 // P0.15 = 22 + }; + +#elif defined(XIAO_NRF52) + const uint32_t g_ADigitalPinMap[] = { + // D0 .. D10 + 2, // D0 is P0.02 (A0) + 3, // D1 is P0.03 (A1) + 28, // D2 is P0.28 (A2) + 29, // D3 is P0.29 (A3) + 4, // D4 is P0.04 (A4,SDA) + 5, // D5 is P0.05 (A5,SCL) + 43, // D6 is P1.11 (TX) + 44, // D7 is P1.12 (RX) + 45, // D8 is P1.13 (SCK) + 46, // D9 is P1.14 (MISO) + 47, // D10 is P1.15 (MOSI) + + // LEDs + 26, // D11 is P0.26 (LED RED) + 6, // D12 is P0.06 (LED BLUE) + 30, // D13 is P0.30 (LED GREEN) + 14, // D14 is P0.14 (READ_BAT) + + // LSM6DS3TR + 40, // D15 is P1.08 (6D_PWR) + 27, // D16 is P0.27 (6D_I2C_SCL) + 7, // D17 is P0.07 (6D_I2C_SDA) + 11, // D18 is P0.11 (6D_INT1) + + // MIC + 42, // D19 is P1.10 (MIC_PWR) + 32, // D20 is P1.00 (PDM_CLK) + 16, // D21 is P0.16 (PDM_DATA) + + // BQ25100 + 13, // D22 is P0.13 (HICHG) + 17, // D23 is P0.17 (~CHG) + + // + 21, // D24 is P0.21 (QSPI_SCK) + 25, // D25 is P0.25 (QSPI_CSN) + 20, // D26 is P0.20 (QSPI_SIO_0 DI) + 24, // D27 is P0.24 (QSPI_SIO_1 DO) + 22, // D28 is P0.22 (QSPI_SIO_2 WP) + 23, // D29 is P0.23 (QSPI_SIO_3 HOLD) + + // NFC + 9, // D30 is P0.09 (NFC1) + 10, // D31 is P0.10 (NFC2) + + // VBAT + 31, // D32 is P0.31 (VBAT) + }; + +#endif +void initVariant() {} diff --git a/variants/modular_mesh_maker/variant.h b/variants/modular_mesh_maker/variant.h new file mode 100644 index 0000000000..fb1a750d9c --- /dev/null +++ b/variants/modular_mesh_maker/variant.h @@ -0,0 +1,207 @@ +/* + * variant.h + * Copyright (C) 2023 Seeed K.K. + * MIT License + */ + + #pragma once + + #include "WVariant.h" + + //////////////////////////////////////////////////////////////////////////////// + // Low frequency clock source + +#define VARIANT_MCK (64000000ul) + +#if defined(PROMICRO) + + //#define USE_LFXO // 32.768 kHz crystal oscillator + #define USE_LFRC // 32.768 kHz RC oscillator + + //////////////////////////////////////////////////////////////////////////////// + // Power + + #define PIN_EXT_VCC (21) + #define EXT_VCC (PIN_EXT_VCC) + + #define BATTERY_PIN (17) + #define ADC_RESOLUTION 12 + + //////////////////////////////////////////////////////////////////////////////// + // Number of pins + + #define PINS_COUNT (23) + #define NUM_DIGITAL_PINS (23) + #define NUM_ANALOG_INPUTS (3) + #define NUM_ANALOG_OUTPUTS (0) + + //////////////////////////////////////////////////////////////////////////////// + // UART pin definition + + #define PIN_SERIAL1_TX (1) + #define PIN_SERIAL1_RX (0) + + //////////////////////////////////////////////////////////////////////////////// + // I2C pin definition + + #define WIRE_INTERFACES_COUNT 2 + + #define PIN_WIRE_SDA (6) + #define PIN_WIRE_SCL (7) + #define PIN_WIRE1_SDA (13) + #define PIN_WIRE1_SCL (14) + + //////////////////////////////////////////////////////////////////////////////// + // SPI pin definition + + #define SPI_INTERFACES_COUNT 2 + + #define PIN_SPI_SCK (2) + #define PIN_SPI_MISO (3) + #define PIN_SPI_MOSI (4) + + #define PIN_SPI_NSS (5) + + #define PIN_SPI1_SCK (18) + #define PIN_SPI1_MISO (19) + #define PIN_SPI1_MOSI (20) + + //////////////////////////////////////////////////////////////////////////////// + // Builtin LEDs + + #define PIN_LED (22) + #define LED_PIN PIN_LED + #define LED_BLUE PIN_LED + #define LED_BUILTIN PIN_LED + #define LED_STATE_ON 1 + + //////////////////////////////////////////////////////////////////////////////// + // Builtin buttons + + #define PIN_BUTTON1 (6) + #define BUTTON_PIN PIN_BUTTON1 + +#elif defined(XIAO_NRF52) + #define USE_LFXO // Board uses 32khz crystal for LF + //#define USE_LFRC // Board uses RC for LF + + #define PINS_COUNT (33) + #define NUM_DIGITAL_PINS (33) + #define NUM_ANALOG_INPUTS (8) + #define NUM_ANALOG_OUTPUTS (0) + + // LEDs + #define PIN_LED (LED_RED) + #define LED_PWR (PINS_COUNT) + #define PIN_NEOPIXEL (PINS_COUNT) + #define NEOPIXEL_NUM (0) + + #define LED_BUILTIN (PIN_LED) + + #define LED_RED (11) + #define LED_GREEN (13) + #define LED_BLUE (12) + + #define LED_STATE_ON (0) // State when LED is litted + + // Buttons + #define PIN_BUTTON1 (PINS_COUNT) + + // Digital PINs + static const uint8_t D0 = 0 ; + static const uint8_t D1 = 1 ; + static const uint8_t D2 = 2 ; + static const uint8_t D3 = 3 ; + static const uint8_t D4 = 4 ; + static const uint8_t D5 = 5 ; + static const uint8_t D6 = 6 ; + static const uint8_t D7 = 7 ; + static const uint8_t D8 = 8 ; + static const uint8_t D9 = 9 ; + static const uint8_t D10 = 10; + + #define VBAT_ENABLE (14) // Output LOW to enable reading of the BAT voltage. + // https://wiki.seeedstudio.com/XIAO_BLE#q3-what-are-the-considerations-when-using-xiao-nrf52840-sense-for-battery-charging + + #define PIN_CHARGING_CURRENT (22) // Battery Charging current + // https://wiki.seeedstudio.com/XIAO_BLE#battery-charging-current + + // Analog pins + #define PIN_A0 (0) + #define PIN_A1 (1) + #define PIN_A2 (2) + #define PIN_A3 (3) + #define PIN_A4 (4) + #define PIN_A5 (5) + #define PIN_VBAT (32) // Read the BAT voltage. + // https://wiki.seeedstudio.com/XIAO_BLE#q3-what-are-the-considerations-when-using-xiao-nrf52840-sense-for-battery-charging + + #define BAT_NOT_CHARGING (23) // LOW when charging + + #define AREF_VOLTAGE (3.0) + #define ADC_MULTIPLIER (3.0F) // 1M, 512k divider bridge + + static const uint8_t A0 = PIN_A0; + static const uint8_t A1 = PIN_A1; + static const uint8_t A2 = PIN_A2; + static const uint8_t A3 = PIN_A3; + static const uint8_t A4 = PIN_A4; + static const uint8_t A5 = PIN_A5; + + #define ADC_RESOLUTION (12) + + // Other pins + #define PIN_NFC1 (30) + #define PIN_NFC2 (31) + + // Serial interfaces + #define PIN_SERIAL1_RX (7) + #define PIN_SERIAL1_TX (6) + + // SPI Interfaces + #define SPI_INTERFACES_COUNT (2) + + #define PIN_SPI_MISO (9) + #define PIN_SPI_MOSI (10) + #define PIN_SPI_SCK (8) + + #define PIN_SPI1_MISO (25) + #define PIN_SPI1_MOSI (26) + #define PIN_SPI1_SCK (29) + + // Lora SPI is on SPI0 + #define P_LORA_SCLK PIN_SPI_SCK + #define P_LORA_MISO PIN_SPI_MISO + #define P_LORA_MOSI PIN_SPI_MOSI + + // Wire Interfaces + #define WIRE_INTERFACES_COUNT (1) + + // #define PIN_WIRE_SDA (17) // 4 and 5 are used for the sx1262 ! + // #define PIN_WIRE_SCL (16) // use WIRE1_SDA + + static const uint8_t SDA = PIN_WIRE_SDA; + static const uint8_t SCL = PIN_WIRE_SCL; + + //#define PIN_WIRE1_SDA (17) + //#define PIN_WIRE1_SCL (16) + #define PIN_LSM6DS3TR_C_POWER (15) + #define PIN_LSM6DS3TR_C_INT1 (18) + + // PDM Interfaces + #define PIN_PDM_PWR (19) + #define PIN_PDM_CLK (20) + #define PIN_PDM_DIN (21) + + // QSPI Pins + #define PIN_QSPI_SCK (24) + #define PIN_QSPI_CS (25) + #define PIN_QSPI_IO0 (26) + #define PIN_QSPI_IO1 (27) + #define PIN_QSPI_IO2 (28) + #define PIN_QSPI_IO3 (29) + + // On-board QSPI Flash + #define EXTERNAL_FLASH_DEVICES (P25Q16H) + #define EXTERNAL_FLASH_USE_QSPI +#endif