Compare commits

...

11 Commits

Author SHA1 Message Date
Ben Meadors
978922296b Increase duration of chirp sound in playChirp 2026-01-08 08:13:57 -06:00
Ben Meadors
01ed5041df Derp 2026-01-08 08:13:16 -06:00
Ben Meadors
71eddb2d29 Fix T-LoRA rotary regression and tighten up playBeep 2026-01-08 07:50:56 -06:00
Wessel
6e110788fd 🔧 Fix LNA/PA power control for Heltec v4, wireless tracker v2 (#9029)
* Fix LNA/PA power control for Heltec v4, wireless tracker v2

* Stop using pin 46 as RF switch, just let DIO2 switch handle the RF path

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2026-01-08 05:42:01 -06:00
Heath Dutton🕴️
86326f294d Fix TSL2591 detection by adding command bit to register read (#9215) 2026-01-08 17:08:41 +11:00
Jonathan Bennett
fb7af18f4f Add needed support bits for the Meshstick (#9042)
* Add needed support bits for the Meshstick

* Portduino: Reduce allowed length by one byte to prevent possible overflow
2026-01-07 23:04:02 -06:00
Jonathan Bennett
4d303c95d1 Add list of text message packet IDs, and check for dupes (#9180)
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2026-01-07 16:17:38 -06:00
Ben Meadors
1a6cbb5caa Migrate all of the Meshtastic API attributes into the ini as a source of truth (#9214)
* Migrate all of the Meshtastic API attributes into the ini as a source of truth

* Cleanup garbage coalescing

* Another spot

* We already account for inkhud and mui

* Consolidate

* Removed them

* Boogers

* Infer

* Copying manifest should always succeed

* Remove portduino guards

* Rename

* None
2026-01-07 15:25:38 -06:00
Jason P
70f909d718 Fix Function + M in code (#9200) 2026-01-06 16:02:41 -06:00
Jason P
9c1d55c844 Add option to Mute/Unmute Channel to BaseUI (#9194) 2026-01-06 15:26:45 -06:00
Bob Reese
ba9d0e6fa3 RadioInterface::getRetransmissionMsec now handles encrypted packets correctly (#9184) 2026-01-06 12:34:48 -06:00
98 changed files with 1083 additions and 47 deletions

View File

@@ -38,4 +38,4 @@ cp bin/device-install.* $OUTDIR/
cp bin/device-update.* $OUTDIR/
echo "Copying manifest"
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true

View File

@@ -49,4 +49,4 @@ if (echo $1 | grep -q "rak4631"); then
fi
echo "Copying manifest"
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true

View File

@@ -30,4 +30,4 @@ echo "Copying uf2 file"
cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2
echo "Copying manifest"
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true

View File

@@ -30,4 +30,4 @@ echo "Copying STM32 bin file"
cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin
echo "Copying manifest"
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json
cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json || true

View File

@@ -0,0 +1,14 @@
Lora:
Module: sx1262
CS: 0
IRQ: 6
Reset: 2
Busy: 4
RXen: 1
DIO2_AS_RF_SWITCH: true
spidev: ch341
DIO3_TCXO_VOLTAGE: true
# USB_Serialnum: 12345678
USB_PID: 0x5512
USB_VID: 0x1A86
SX126X_MAX_POWER: 22

View File

@@ -2,11 +2,12 @@
# trunk-ignore-all(ruff/F821)
# trunk-ignore-all(flake8/F821): For SConstruct imports
import sys
from os.path import join, basename, isfile
from os.path import join
import subprocess
import json
import re
from datetime import datetime
from typing import Dict
from readprops import readProps
@@ -14,8 +15,47 @@ Import("env")
platform = env.PioPlatform()
progname = env.get("PROGNAME")
lfsbin = f"{progname.replace('firmware-', 'littlefs-')}.bin"
manifest_ran = False
def infer_architecture(board_cfg):
try:
mcu = board_cfg.get("build.mcu") if board_cfg else None
except KeyError:
mcu = None
except Exception:
mcu = None
if not mcu:
return None
mcu_l = str(mcu).lower()
if "esp32s3" in mcu_l:
return "esp32-s3"
if "esp32c6" in mcu_l:
return "esp32-c6"
if "esp32c3" in mcu_l:
return "esp32-c3"
if "esp32" in mcu_l:
return "esp32"
if "rp2040" in mcu_l:
return "rp2040"
if "rp2350" in mcu_l:
return "rp2350"
if "nrf52" in mcu_l or "nrf52840" in mcu_l:
return "nrf52840"
if "stm32" in mcu_l:
return "stm32"
return None
def manifest_gather(source, target, env):
global manifest_ran
if manifest_ran:
return
# Skip manifest generation if we cannot determine architecture (host/native builds)
board_arch = infer_architecture(env.BoardConfig())
if not board_arch:
print(f"Skipping mtjson generation for unknown architecture (env={env.get('PIOENV')})")
manifest_ran = True
return
manifest_ran = True
out = []
board_platform = env.BoardConfig().get("platform")
needs_ota_suffix = board_platform == "nordicnrf52"
@@ -47,14 +87,39 @@ def manifest_gather(source, target, env):
manifest_write(out, env)
def manifest_write(files, env):
# Defensive: also skip manifest writing if we cannot determine architecture
def get_project_option(name):
try:
return env.GetProjectOption(name)
except Exception:
return None
def get_project_option_any(names):
for name in names:
val = get_project_option(name)
if val is not None:
return val
return None
def as_bool(val):
return str(val).strip().lower() in ("1", "true", "yes", "on")
def as_int(val):
try:
return int(str(val), 10)
except (TypeError, ValueError):
return None
def as_list(val):
return [item.strip() for item in str(val).split(",") if item.strip()]
manifest = {
"version": verObj["long"],
"build_epoch": build_epoch,
"board": env.get("PIOENV"),
"platformioTarget": env.get("PIOENV"),
"mcu": env.get("BOARD_MCU"),
"repo": repo_owner,
"files": files,
"part": None,
"has_mui": False,
"has_inkhud": False,
}
@@ -69,6 +134,51 @@ def manifest_write(files, env):
if "MESHTASTIC_INCLUDE_INKHUD" in env.get("CPPDEFINES", []):
manifest["has_inkhud"] = True
pioenv = env.get("PIOENV")
device_meta = {}
device_meta_fields = [
("hwModel", ["custom_meshtastic_hw_model"], as_int),
("hwModelSlug", ["custom_meshtastic_hw_model_slug"], str),
("architecture", ["custom_meshtastic_architecture"], str),
("activelySupported", ["custom_meshtastic_actively_supported"], as_bool),
("displayName", ["custom_meshtastic_display_name"], str),
("supportLevel", ["custom_meshtastic_support_level"], as_int),
("images", ["custom_meshtastic_images"], as_list),
("tags", ["custom_meshtastic_tags"], as_list),
("requiresDfu", ["custom_meshtastic_requires_dfu"], as_bool),
("partitionScheme", ["custom_meshtastic_partition_scheme"], str),
("url", ["custom_meshtastic_url"], str),
("key", ["custom_meshtastic_key"], str),
("variant", ["custom_meshtastic_variant"], str),
]
for manifest_key, option_keys, caster in device_meta_fields:
raw_val = get_project_option_any(option_keys)
if raw_val is None:
continue
parsed = caster(raw_val) if callable(caster) else raw_val
if parsed is not None and parsed != "":
device_meta[manifest_key] = parsed
# Determine architecture once; if we can't infer it, skip manifest generation
board_arch = device_meta.get("architecture") or infer_architecture(env.BoardConfig())
if not board_arch:
print(f"Skipping mtjson write for unknown architecture (env={env.get('PIOENV')})")
return
device_meta["architecture"] = board_arch
# Always set requiresDfu: true for nrf52840 targets
if board_arch == "nrf52840":
device_meta["requiresDfu"] = True
device_meta.setdefault("displayName", pioenv)
device_meta.setdefault("activelySupported", False)
if device_meta:
manifest.update(device_meta)
# Write the manifest to the build directory
with open(env.subst("$BUILD_DIR/${PROGNAME}.mt.json"), "w") as f:
json.dump(manifest, f, indent=2)
@@ -166,8 +276,12 @@ def load_boot_logo(source, target, env):
if ("HAS_TFT", 1) in env.get("CPPDEFINES", []):
env.AddPreAction(f"$BUILD_DIR/{lfsbin}", load_boot_logo)
mtjson_deps = ["buildprog"]
if platform.name == "espressif32":
board_arch = infer_architecture(env.BoardConfig())
should_skip_manifest = board_arch is None
# For host/native envs, avoid depending on 'buildprog' (some targets don't define it)
mtjson_deps = [] if should_skip_manifest else ["buildprog"]
if not should_skip_manifest and platform.name == "espressif32":
# Build littlefs image as part of mtjson target
# Equivalent to `pio run -t buildfs`
target_lfs = env.DataToBin(
@@ -175,11 +289,27 @@ if platform.name == "espressif32":
)
mtjson_deps.append(target_lfs)
env.AddCustomTarget(
name="mtjson",
dependencies=mtjson_deps,
actions=[manifest_gather],
title="Meshtastic Manifest",
description="Generating Meshtastic manifest JSON + Checksums",
always_build=False,
)
if should_skip_manifest:
def skip_manifest(source, target, env):
print(f"mtjson: skipped for native environment: {env.get('PIOENV')}")
env.AddCustomTarget(
name="mtjson",
dependencies=mtjson_deps,
actions=[skip_manifest],
title="Meshtastic Manifest (skipped)",
description="mtjson generation is skipped for native environments",
always_build=True,
)
else:
env.AddCustomTarget(
name="mtjson",
dependencies=mtjson_deps,
actions=[manifest_gather],
title="Meshtastic Manifest",
description="Generating Meshtastic manifest JSON + Checksums",
always_build=True,
)
# Run manifest generation as part of the default build pipeline for non-native builds.
env.Default("mtjson")

View File

@@ -18,8 +18,9 @@ def readProps(prefsLoc):
# Try to find current build SHA if if the workspace is clean. This could fail if git is not installed
try:
# Pin abbreviation length to keep local builds and CI matching (avoid auto-shortening)
sha = (
subprocess.check_output(["git", "rev-parse", "--short", "HEAD"])
subprocess.check_output(["git", "rev-parse", "--short=7", "HEAD"])
.decode("utf-8")
.strip()
)

View File

@@ -22,15 +22,19 @@ int BuzzerFeedbackThread::handleInputEvent(const InputEvent *event)
// Handle different input events with appropriate buzzer feedback
switch (event->inputEvent) {
case INPUT_BROKER_USER_PRESS:
case INPUT_BROKER_ALT_PRESS:
playClick(); // Low delay feedback
break;
#ifdef INPUTDRIVER_ENCODER_TYPE
case INPUT_BROKER_SELECT:
case INPUT_BROKER_SELECT_LONG:
playBeep(); // Confirmation feedback
playClick();
break;
#else
case INPUT_BROKER_USER_PRESS:
case INPUT_BROKER_ALT_PRESS:
case INPUT_BROKER_SELECT:
case INPUT_BROKER_SELECT_LONG:
playBeep();
break;
#endif
case INPUT_BROKER_UP:
case INPUT_BROKER_UP_LONG:

View File

@@ -65,7 +65,7 @@ void playTones(const ToneDuration *tone_durations, int size)
void playBeep()
{
ToneDuration melody[] = {{NOTE_B3, DURATION_1_8}};
ToneDuration melody[] = {{NOTE_B3, DURATION_1_16}};
playTones(melody, sizeof(melody) / sizeof(ToneDuration));
}

View File

@@ -487,7 +487,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
}
break;
case TSL25911_ADDR:
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x12), 1);
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xA0 | 0x12), 1);
if (registerValue == 0x50) {
type = TSL2591;
logFoundDevice("TSL25911", (uint8_t)addr.address);

View File

@@ -449,13 +449,14 @@ void menuHandler::clockMenu()
}
void menuHandler::messageResponseMenu()
{
enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, ReplyMenu, Aloud, enumEnd };
enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, ReplyMenu, MuteChannel, Aloud, enumEnd };
static const char *optionsArray[enumEnd];
static int optionsEnumArray[enumEnd];
int options = 0;
auto mode = graphics::MessageRenderer::getThreadMode();
int threadChannel = graphics::MessageRenderer::getThreadChannel();
optionsArray[options] = "Back";
optionsEnumArray[options++] = Back;
@@ -467,6 +468,15 @@ void menuHandler::messageResponseMenu()
optionsArray[options] = "View Chats";
optionsEnumArray[options++] = ViewMode;
// If viewing ALL chats, hide “Mute Chat”
if (mode != graphics::MessageRenderer::ThreadMode::ALL && mode != graphics::MessageRenderer::ThreadMode::DIRECT) {
const uint8_t chIndex = (threadChannel != 0) ? (uint8_t)threadChannel : channels.getPrimaryIndex();
auto &chan = channels.getByIndex(chIndex);
optionsArray[options] = chan.settings.module_settings.is_muted ? "Unmute Channel" : "Mute Channel";
optionsEnumArray[options++] = MuteChannel;
}
// Delete submenu
optionsArray[options] = "Delete";
optionsEnumArray[options++] = 900;
@@ -502,6 +512,14 @@ void menuHandler::messageResponseMenu()
menuHandler::menuQueue = menuHandler::reply_menu;
screen->runNow();
} else if (selected == MuteChannel) {
const uint8_t chIndex = (ch != 0) ? (uint8_t)ch : channels.getPrimaryIndex();
auto &chan = channels.getByIndex(chIndex);
if (chan.settings.has_module_settings) {
chan.settings.module_settings.is_muted = !chan.settings.module_settings.is_muted;
nodeDB->saveToDisk();
}
// Delete submenu
} else if (selected == 900) {
menuHandler::menuQueue = menuHandler::delete_messages_menu;

View File

@@ -4,6 +4,7 @@
#include "configuration.h"
#include "mesh-pb-constants.h"
#include "meshUtils.h"
#include "modules/TextMessageModule.h"
#if !MESHTASTIC_EXCLUDE_TRACEROUTE
#include "modules/TraceRouteModule.h"
#endif
@@ -35,6 +36,10 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
return true; // we handled it, so stop processing
}
if (!seenRecently && !wasUpgraded && textMessageModule) {
seenRecently = textMessageModule->recentlySeen(p->id);
}
if (seenRecently) {
printPacket("Ignore dupe incoming msg", p);
rxDupe++;

View File

@@ -246,7 +246,8 @@ uint32_t RadioInterface::getPacketTime(const meshtastic_MeshPacket *p, bool rece
/** The delay to use for retransmitting dropped packets */
uint32_t RadioInterface::getRetransmissionMsec(const meshtastic_MeshPacket *p)
{
size_t numbytes = pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_Data_msg, &p->decoded);
size_t numbytes =p->which_payload_variant == meshtastic_MeshPacket_decoded_tag ?
pb_encode_to_bytes(bytes, sizeof(bytes), &meshtastic_Data_msg, &p->decoded) : p->encrypted.size+MESHTASTIC_HEADER_LENGTH;
uint32_t packetAirtime = getPacketTime(numbytes + sizeof(PacketHeader));
// Make sure enough time has elapsed for this packet to be sent and an ACK is received.
// LOG_DEBUG("Waiting for flooding message with airtime %d and slotTime is %d", packetAirtime, slotTimeMsec);

View File

@@ -53,13 +53,21 @@ template <typename T> bool SX126xInterface<T>::init()
#endif
#if defined(USE_GC1109_PA)
// GC1109 FEM chip initialization
// See variant.h for full pin mapping and control logic documentation
// VFEM_Ctrl (LORA_PA_POWER): Power enable for GC1109 LDO (always on)
pinMode(LORA_PA_POWER, OUTPUT);
digitalWrite(LORA_PA_POWER, HIGH);
// CSD (LORA_PA_EN): Chip enable - must be HIGH to enable GC1109 for both RX and TX
pinMode(LORA_PA_EN, OUTPUT);
digitalWrite(LORA_PA_EN, LOW);
digitalWrite(LORA_PA_EN, HIGH);
// CPS (LORA_PA_TX_EN): PA mode select - HIGH enables full PA during TX, LOW for RX (don't care)
// Note: TX/RX path switching (CTX) is handled by DIO2 via SX126X_DIO2_AS_RF_SWITCH
pinMode(LORA_PA_TX_EN, OUTPUT);
digitalWrite(LORA_PA_TX_EN, LOW);
digitalWrite(LORA_PA_TX_EN, LOW); // Start in RX-ready state
#endif
#ifdef RF95_FAN_EN
@@ -377,13 +385,13 @@ template <typename T> bool SX126xInterface<T>::sleep()
return true;
}
/** Some boards require GPIO control of tx vs rx paths */
/** Control PA mode for GC1109 FEM - CPS pin selects full PA (txon=true) or bypass mode (txon=false) */
template <typename T> void SX126xInterface<T>::setTransmitEnable(bool txon)
{
#if defined(USE_GC1109_PA)
digitalWrite(LORA_PA_POWER, HIGH);
digitalWrite(LORA_PA_EN, HIGH);
digitalWrite(LORA_PA_TX_EN, txon ? 1 : 0);
digitalWrite(LORA_PA_POWER, HIGH); // Ensure LDO is on
digitalWrite(LORA_PA_EN, HIGH); // CSD=1: Chip enabled
digitalWrite(LORA_PA_TX_EN, txon ? 1 : 0); // CPS: 1=full PA, 0=bypass (for RX, CPS is don't care)
#endif
}

View File

@@ -45,9 +45,9 @@ int SystemCommandsModule::handleInputEvent(const InputEvent *event)
// Mute
case INPUT_BROKER_MSG_MUTE_TOGGLE:
if (moduleConfig.external_notification.enabled && externalNotificationModule) {
externalNotificationModule->setMute(externalNotificationModule->getMute());
externalNotificationModule->setMute(!externalNotificationModule->getMute());
IF_SCREEN(if (!externalNotificationModule->getMute()) externalNotificationModule->stopNow(); screen->showSimpleBanner(
externalNotificationModule->getMute() ? "Notifications\nEnabled" : "Notifications\nDisabled", 3000);)
externalNotificationModule->getMute() ? "Notifications\nDisabled" : "Notifications\nEnabled", 3000);)
}
return 0;
// Bluetooth

View File

@@ -17,6 +17,9 @@ ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPacket &mp
auto &p = mp.decoded;
LOG_INFO("Received text msg from=0x%0x, id=0x%x, msg=%.*s", mp.from, mp.id, p.payload.size, p.payload.bytes);
#endif
// add packet ID to the rolling list of packets
textPacketList[textPacketListIndex] = mp.id;
textPacketListIndex = (textPacketListIndex + 1) % TEXT_PACKET_LIST_SIZE;
// We only store/display messages destined for us.
devicestate.rx_text_message = mp;
@@ -47,3 +50,13 @@ bool TextMessageModule::wantPacket(const meshtastic_MeshPacket *p)
{
return MeshService::isTextPayload(p);
}
bool TextMessageModule::recentlySeen(uint32_t id)
{
for (size_t i = 0; i < TEXT_PACKET_LIST_SIZE; i++) {
if (textPacketList[i] != 0 && textPacketList[i] == id) {
return true;
}
}
return false;
}

View File

@@ -1,6 +1,7 @@
#pragma once
#include "Observer.h"
#include "SinglePortModule.h"
#define TEXT_PACKET_LIST_SIZE 50
/**
* Text message handling for Meshtastic.
@@ -19,6 +20,8 @@ class TextMessageModule : public SinglePortModule, public Observable<const mesht
*/
TextMessageModule() : SinglePortModule("text", meshtastic_PortNum_TEXT_MESSAGE_APP) {}
bool recentlySeen(uint32_t id);
protected:
/** Called to handle a particular incoming message
*
@@ -27,6 +30,10 @@ class TextMessageModule : public SinglePortModule, public Observable<const mesht
*/
virtual ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override;
virtual bool wantPacket(const meshtastic_MeshPacket *p) override;
private:
uint32_t textPacketList[TEXT_PACKET_LIST_SIZE] = {0};
size_t textPacketListIndex = 0;
};
extern TextMessageModule *textMessageModule;

View File

@@ -366,6 +366,14 @@ void portduinoSetup()
cleanupNameForAutoconf("lora-hat-" + std::string(hat_vendor) + "-" + autoconf_product + ".yaml");
} else if (found_ch341) {
product_config = cleanupNameForAutoconf("lora-usb-" + std::string(autoconf_product) + ".yaml");
// look for more data after the null terminator
size_t len = strlen(autoconf_product);
if (len < 74) {
memcpy(portduino_config.device_id, autoconf_product + len + 1, 16);
if (!memfll(portduino_config.device_id, '\0', 16) && !memfll(portduino_config.device_id, 0xff, 16)) {
portduino_config.has_device_id = true;
}
}
}
// Don't try to automatically find config for a device with RAK eeprom.

View File

@@ -64,7 +64,7 @@ class Ch341Hal : public RadioLibHal
void getProductString(char *_product_string, size_t len)
{
len = len > 95 ? 95 : len;
strncpy(_product_string, pinedio.product_string, len);
memcpy(_product_string, pinedio.product_string, len);
}
void init() override {}

View File

@@ -1,5 +1,12 @@
; Port to Disaster Radio's ESP32-v3 Dev Board
[env:meshtastic-dr-dev]
custom_meshtastic_hw_model = 41
custom_meshtastic_hw_model_slug = DR_DEV
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = DR-DEV
custom_meshtastic_tags = DIY
extends = esp32_base
board = esp32doit-devkit-v1
board_level = extra

View File

@@ -1,5 +1,13 @@
; Hydra - Meshtastic DIY v1 hardware with some specific changes
[env:hydra]
custom_meshtastic_hw_model = 39
custom_meshtastic_hw_model_slug = HYDRA
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Hydra
custom_meshtastic_tags = DIY
extends = esp32_base
board = esp32doit-devkit-v1
build_flags =

View File

@@ -1,5 +1,14 @@
; Meshtastic DIY v1 by Nano VHF Schematic based on ESP32-WROOM-32 (38 pins) devkit & EBYTE E22 SX1262/SX1268 module
[env:meshtastic-diy-v1]
custom_meshtastic_hw_model = 39
custom_meshtastic_hw_model_slug = DIY_V1
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = DIY V1
custom_meshtastic_images = diy.svg
custom_meshtastic_tags = DIY
extends = esp32_base
board = esp32doit-devkit-v1
board_check = true

View File

@@ -1,4 +1,11 @@
[env:heltec-v1]
custom_meshtastic_hw_model = 11
custom_meshtastic_hw_model_slug = HELTEC_V1
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = Heltec V1
custom_meshtastic_tags = Heltec
;build_type = debug ; to make it possible to step through our jtag debugger
extends = esp32_base
board_level = extra

View File

@@ -1,4 +1,11 @@
[env:heltec-v2_1]
custom_meshtastic_hw_model = 10
custom_meshtastic_hw_model_slug = HELTEC_V2_1
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = Heltec V2.1
custom_meshtastic_tags = Heltec
board_level = extra
;build_type = debug ; to make it possible to step through our jtag debugger
extends = esp32_base

View File

@@ -1,4 +1,11 @@
[env:heltec-v2_0]
custom_meshtastic_hw_model = 5
custom_meshtastic_hw_model_slug = HELTEC_V2_0
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = Heltec V2.0
custom_meshtastic_tags = Heltec
;build_type = debug ; to make it possible to step through our jtag debugger
board_level = extra
extends = esp32_base

View File

@@ -1,4 +1,12 @@
[env:m5stack-core]
custom_meshtastic_hw_model = 42
custom_meshtastic_hw_model_slug = M5STACK
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = M5 Stack
custom_meshtastic_tags = M5Stack
extends = esp32_base
board = m5stack-core-esp32
monitor_filters = esp32_exception_decoder

View File

@@ -1,5 +1,13 @@
; The 1.0 release of the nano-g1-explorer board
[env:nano-g1-explorer]
custom_meshtastic_hw_model = 17
custom_meshtastic_hw_model_slug = NANO_G1_EXPLORER
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Nano G1 Explorer
custom_meshtastic_tags = B&Q
extends = esp32_base
board = ttgo-t-beam
build_flags =

View File

@@ -1,5 +1,13 @@
; The 1.0 release of the nano-g1 board
[env:nano-g1]
custom_meshtastic_hw_model = 14
custom_meshtastic_hw_model_slug = NANO_G1
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Nano G1
custom_meshtastic_tags = B&Q
extends = esp32_base
board = ttgo-t-beam
build_flags =

View File

@@ -1,4 +1,12 @@
[env:radiomaster_900_bandit_nano]
custom_meshtastic_hw_model = 64
custom_meshtastic_hw_model_slug = RADIOMASTER_900_BANDIT_NANO
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 2
custom_meshtastic_display_name = RadioMaster 900 Bandit Nano
custom_meshtastic_tags = RadioMaster
extends = esp32_base
board = esp32doit-devkit-v1
build_flags =

View File

@@ -1,4 +1,13 @@
[env:rak11200]
custom_meshtastic_hw_model = 13
custom_meshtastic_hw_model_slug = RAK11200
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = RAK WisBlock 11200
custom_meshtastic_images = rak11200.svg
custom_meshtastic_tags = RAK
extends = esp32_base
board = wiscore_rak11200
board_level = pr

View File

@@ -1,5 +1,13 @@
; The 1.0 release of the nano-g1 board
[env:station-g1]
custom_meshtastic_hw_model = 25
custom_meshtastic_hw_model_slug = STATION_G1
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Station G1
custom_meshtastic_tags = B&Q
extends = esp32_base
board = ttgo-t-beam
build_flags =

View File

@@ -1,5 +1,14 @@
; The 1.0 release of the TBEAM board
[env:tbeam]
custom_meshtastic_hw_model = 4
custom_meshtastic_hw_model_slug = TBEAM
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = LILYGO T-Beam
custom_meshtastic_images = tbeam.svg
custom_meshtastic_tags = LilyGo
extends = esp32_base
board = ttgo-t-beam

View File

@@ -1,5 +1,12 @@
; The original TBEAM board without the AXP power chip and a few other changes
[env:tbeam0_7]
custom_meshtastic_hw_model = 6
custom_meshtastic_hw_model_slug = TBEAM_V0P7
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = LILYGO T-Beam V0.7
custom_meshtastic_tags = LilyGo
board_level = extra
extends = esp32_base
board = ttgo-t-beam

View File

@@ -1,4 +1,11 @@
[env:tlora-v1]
custom_meshtastic_hw_model = 2
custom_meshtastic_hw_model_slug = TLORA_V1
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = LILYGO T-LoRa V1
custom_meshtastic_tags = LilyGo
board_level = extra
extends = esp32_base
board = ttgo-lora32-v1

View File

@@ -1,4 +1,11 @@
[env:tlora-v2]
custom_meshtastic_hw_model = 1
custom_meshtastic_hw_model_slug = TLORA_V2
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = false
custom_meshtastic_display_name = LILYGO T-LoRa V2
custom_meshtastic_tags = LilyGo
board_level = extra
extends = esp32_base
board = ttgo-lora32-v1

View File

@@ -1,4 +1,13 @@
[env:tlora-v2-1-1_6]
custom_meshtastic_hw_model = 3
custom_meshtastic_hw_model_slug = TLORA_V2_1_1P6
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = LILYGO T-LoRa V2.1-1.6
custom_meshtastic_images = tlora-v2-1-1_6.svg
custom_meshtastic_tags = LilyGo
extends = esp32_base
board = ttgo-lora32-v21
board_check = true

View File

@@ -1,4 +1,13 @@
[env:tlora-v2-1-1_8]
custom_meshtastic_hw_model = 15
custom_meshtastic_hw_model_slug = TLORA_V2_1_1P8
custom_meshtastic_architecture = esp32
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = LILYGO T-LoRa V2.1-1.8
custom_meshtastic_images = tlora-v2-1-1_8.svg
custom_meshtastic_tags = LilyGo, 2.4GHz
extends = esp32_base
board_level = extra
board = ttgo-lora32-v21

View File

@@ -1,4 +1,13 @@
[env:heltec-ht62-esp32c3-sx1262]
custom_meshtastic_hw_model = 53
custom_meshtastic_hw_model_slug = HELTEC_HT62
custom_meshtastic_architecture = esp32-c3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec HT62
custom_meshtastic_images = heltec-ht62-esp32c3-sx1262.svg
custom_meshtastic_tags = Heltec
extends = esp32c3_base
board = esp32-c3-devkitm-1
board_level = pr

View File

@@ -1,4 +1,13 @@
[env:m5stack-unitc6l]
custom_meshtastic_hw_model = 111
custom_meshtastic_hw_model_slug = M5STACK_C6L
custom_meshtastic_architecture = esp32-c6
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = M5Stack Unit C6L
custom_meshtastic_images = m5_c6l.svg
custom_meshtastic_tags = M5Stack
extends = esp32c6_base
board = esp32-c6-devkitc-1
;OpenOCD flash method

View File

@@ -1,4 +1,13 @@
[env:CDEBYTE_EoRa-S3]
custom_meshtastic_hw_model = 61
custom_meshtastic_hw_model_slug = CDEBYTE_EORA_S3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = EBYTE EoRa-S3
custom_meshtastic_tags = EByte
custom_meshtastic_requires_dfu = true
extends = esp32s3_base
board = CDEBYTE_EoRa-S3
build_flags =

View File

@@ -1,4 +1,14 @@
[env:thinknode_m2]
custom_meshtastic_hw_model = 90
custom_meshtastic_hw_model_slug = THINKNODE_M2
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = ThinkNode M2
custom_meshtastic_images = thinknode_m2.svg
custom_meshtastic_tags = Elecrow
custom_meshtastic_requires_dfu = false
extends = esp32s3_base
board = ESP32-S3-WROOM-1-N4
build_flags =

View File

@@ -1,4 +1,14 @@
[env:thinknode_m5]
custom_meshtastic_hw_model = 107
custom_meshtastic_hw_model_slug = THINKNODE_M5
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = ThinkNode M5
custom_meshtastic_images = thinknode_m1.svg
custom_meshtastic_tags = Elecrow
custom_meshtastic_requires_dfu = false
extends = esp32s3_base
board = ESP32-S3-WROOM-1-N4
build_flags =

View File

@@ -75,6 +75,17 @@ build_flags =
-D DISPLAY_SET_RESOLUTION
[env:elecrow-adv-24-28-tft]
custom_meshtastic_hw_model = 97
custom_meshtastic_hw_model_slug = CROWPANEL
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Crowpanel Adv 2.4/2.8 TFT
custom_meshtastic_images = crowpanel_2_4.svg, crowpanel_2_8.svg
custom_meshtastic_tags = Elecrow
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = crowpanel_small_esp32s3_base
build_flags =
${crowpanel_small_esp32s3_base.build_flags}
@@ -99,6 +110,17 @@ build_flags =
-D LGFX_TOUCH_ROTATION=0
[env:elecrow-adv-35-tft]
custom_meshtastic_hw_model = 97
custom_meshtastic_hw_model_slug = CROWPANEL
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Crowpanel Adv 3.5 TFT
custom_meshtastic_images = crowpanel_3_5.svg
custom_meshtastic_tags = Elecrow
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = crowpanel_small_esp32s3_base
board_level = pr
build_flags =
@@ -127,6 +149,17 @@ build_flags =
; 4.3, 5.0, 7.0 inch 800x480 IPS (V1)
[env:elecrow-adv1-43-50-70-tft]
custom_meshtastic_hw_model = 97
custom_meshtastic_hw_model_slug = CROWPANEL
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Crowpanel Adv 4.3/5.0/7.0 TFT
custom_meshtastic_images = crowpanel_5_0.svg, crowpanel_7_0.svg
custom_meshtastic_tags = Elecrow
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = crowpanel_large_esp32s3_base
build_flags =
${crowpanel_large_esp32s3_base.build_flags}

View File

@@ -1,4 +1,14 @@
[env:heltec-v3]
[env:heltec-v3]
custom_meshtastic_hw_model = 43
custom_meshtastic_hw_model_slug = HELTEC_V3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec V3
custom_meshtastic_images = heltec-v3.svg, heltec-v3-case.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wifi_lora_32_V3
board_level = pr

View File

@@ -10,6 +10,17 @@ build_flags =
[env:heltec-v4]
custom_meshtastic_hw_model = 110
custom_meshtastic_hw_model_slug = HELTEC_V4
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec V4
custom_meshtastic_images = heltec_v4.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = heltec_v4_base
build_flags =
${heltec_v4_base.build_flags}

View File

@@ -29,10 +29,32 @@
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
#define USE_GC1109_PA // We have a GC1109 power amplifier+attenuator
#define LORA_PA_POWER 7 // power en
#define LORA_PA_EN 2
#define LORA_PA_TX_EN 46 // enable tx
// ---- GC1109 RF FRONT END CONFIGURATION ----
// The Heltec V4 uses a GC1109 FEM chip with integrated PA and LNA
// RF path: SX1262 -> GC1109 PA -> Pi attenuator -> Antenna
// Measured net TX gain (non-linear due to PA compression):
// +11dB at 0-15dBm input (e.g., 10dBm in -> 21dBm out)
// +10dB at 16-17dBm input
// +9dB at 18-19dBm input
// +7dB at 21dBm input (e.g., 21dBm in -> 28dBm out max)
// Control logic (from GC1109 datasheet):
// Shutdown: CSD=0, CTX=X, CPS=X
// Receive LNA: CSD=1, CTX=0, CPS=X (17dB gain, 2dB NF)
// Transmit bypass: CSD=1, CTX=1, CPS=0 (~1dB loss, no PA)
// Transmit PA: CSD=1, CTX=1, CPS=1 (full PA enabled)
// Pin mapping:
// CTX (pin 6) -> SX1262 DIO2: TX/RX path select (automatic via SX126X_DIO2_AS_RF_SWITCH)
// CSD (pin 4) -> GPIO2: Chip enable (HIGH=on, LOW=shutdown)
// CPS (pin 5) -> GPIO46: PA mode select (HIGH=full PA, LOW=bypass)
// VCC0/VCC1 -> Vfem via U3 LDO, controlled by GPIO7
#define USE_GC1109_PA
#define LORA_PA_POWER 7 // VFEM_Ctrl - GC1109 LDO power enable
#define LORA_PA_EN 2 // CSD - GC1109 chip enable (HIGH=on)
#define LORA_PA_TX_EN 46 // CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
// GC1109 FEM: TX/RX path switching is handled by DIO2 -> CTX pin (via SX126X_DIO2_AS_RF_SWITCH)
// GPIO46 is CPS (PA mode), not TX control - setTransmitEnable() handles it in SX126xInterface.cpp
// Do NOT use SX126X_TXEN/RXEN as that would cause double-control of GPIO46
#if HAS_TFT
#define USE_TFTDISPLAY 1

View File

@@ -1,4 +1,15 @@
[env:heltec-vision-master-e213]
custom_meshtastic_hw_model = 67
custom_meshtastic_hw_model_slug = HELTEC_VISION_MASTER_E213
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Vision Master E213
custom_meshtastic_images = heltec-vision-master-e213.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_vision_master_e213
board_build.partitions = default_8MB.csv

View File

@@ -1,5 +1,16 @@
; Using the original screen class
[env:heltec-vision-master-e290]
custom_meshtastic_hw_model = 68
custom_meshtastic_hw_model_slug = HELTEC_VISION_MASTER_E290
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Vision Master E290
custom_meshtastic_images = heltec-vision-master-e290.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_vision_master_e290
board_build.partitions = default_8MB.csv

View File

@@ -1,4 +1,15 @@
[env:heltec-vision-master-t190]
custom_meshtastic_hw_model = 66
custom_meshtastic_hw_model_slug = HELTEC_VISION_MASTER_T190
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Vision Master T190
custom_meshtastic_images = heltec-vision-master-t190.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_vision_master_t190
board_build.partitions = default_8MB.csv

View File

@@ -1,5 +1,15 @@
; Using the original screen class
[env:heltec-wireless-paper]
custom_meshtastic_hw_model = 49
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_PAPER
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Wireless Paper
custom_meshtastic_images = heltec-wireless-paper.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv

View File

@@ -1,4 +1,14 @@
[env:heltec-wireless-paper-v1_0]
custom_meshtastic_hw_model = 57
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_PAPER_V1_0
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = false
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Heltec Wireless Paper V1.0
custom_meshtastic_images = heltec-wireless-paper-v1_0.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board_level = extra
board = heltec_wifi_lora_32_V3

View File

@@ -1,4 +1,15 @@
[env:heltec-wireless-tracker]
custom_meshtastic_hw_model = 48
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Wireless Tracker V1.1
custom_meshtastic_images = heltec-wireless-tracker.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv

View File

@@ -1,4 +1,14 @@
[env:heltec-wireless-tracker-V1-0]
custom_meshtastic_hw_model = 58
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER_V1_0
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = false
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Heltec Wireless Tracker V1.0
custom_meshtastic_images = heltec-wireless-tracker.svg
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board_level = extra
board = heltec_wireless_tracker

View File

@@ -73,7 +73,29 @@
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
#define USE_GC1109_PA // We have a GC1109 power amplifier+attenuator
#define LORA_PA_POWER 7 // power en
#define LORA_PA_EN 4
#define LORA_PA_TX_EN 46 // enable tx
// ---- GC1109 RF FRONT END CONFIGURATION ----
// The Heltec Wireless Tracker V2 uses a GC1109 FEM chip with integrated PA and LNA
// RF path: SX1262 -> GC1109 PA -> Pi attenuator -> Antenna
// Measured net TX gain (non-linear due to PA compression):
// +11dB at 0-15dBm input (e.g., 10dBm in -> 21dBm out)
// +10dB at 16-17dBm input
// +9dB at 18-19dBm input
// +7dB at 21dBm input (e.g., 21dBm in -> 28dBm out max)
// Control logic (from GC1109 datasheet):
// Shutdown: CSD=0, CTX=X, CPS=X
// Receive LNA: CSD=1, CTX=0, CPS=X (17dB gain, 2dB NF)
// Transmit bypass: CSD=1, CTX=1, CPS=0 (~1dB loss, no PA)
// Transmit PA: CSD=1, CTX=1, CPS=1 (full PA enabled)
// Pin mapping:
// CTX (pin 6) -> SX1262 DIO2: TX/RX path select (automatic via SX126X_DIO2_AS_RF_SWITCH)
// CSD (pin 4) -> GPIO4: Chip enable (HIGH=on, LOW=shutdown)
// CPS (pin 5) -> GPIO46: PA mode select (HIGH=full PA, LOW=bypass)
// VCC0/VCC1 -> Vfem via U3 LDO, controlled by GPIO7
#define USE_GC1109_PA
#define LORA_PA_POWER 7 // VFEM_Ctrl - GC1109 LDO power enable
#define LORA_PA_EN 4 // CSD - GC1109 chip enable (HIGH=on)
#define LORA_PA_TX_EN 46 // CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
// GC1109 FEM: TX/RX path switching is handled by DIO2 -> CTX pin (via SX126X_DIO2_AS_RF_SWITCH)
// GPIO46 is CPS (PA mode), not TX control - setTransmitEnable() handles it in SX126xInterface.cpp
// Do NOT use SX126X_TXEN/RXEN as that would cause double-control of GPIO46

View File

@@ -1,4 +1,14 @@
[env:heltec-wsl-v3]
[env:heltec-wsl-v3]
custom_meshtastic_hw_model = 44
custom_meshtastic_hw_model_slug = HELTEC_WSL_V3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Wireless Stick Lite V3
custom_meshtastic_images = heltec-wsl-v3.svg
custom_meshtastic_tags = Heltec
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv

View File

@@ -1,4 +1,12 @@
[env:picomputer-s3]
custom_meshtastic_hw_model = 52
custom_meshtastic_hw_model_slug = PICOMPUTER_S3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Pi Computer S3
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = bpi_picow_esp32_s3
board_check = true

View File

@@ -1,4 +1,15 @@
[env:rak3312]
custom_meshtastic_hw_model = 106
custom_meshtastic_hw_model_slug = RAK3312
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = RAK3312
custom_meshtastic_images = rak_3312.svg
custom_meshtastic_tags = RAK
custom_meshtastic_requires_dfu = false
custom_meshtastic_partition_scheme = 16MB
extends = esp32s3_base
board = wiscore_rak3312
board_level = pr

View File

@@ -1,5 +1,16 @@
; Seeed Studio SenseCAP Indicator
[env:seeed-sensecap-indicator]
custom_meshtastic_hw_model = 70
custom_meshtastic_hw_model_slug = SENSECAP_INDICATOR
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Seeed SenseCAP Indicator
custom_meshtastic_images = seeed-sensecap-indicator.svg
custom_meshtastic_tags = Seeed
custom_meshtastic_partition_scheme = 8MB
= true
extends = esp32s3_base
platform_packages =
platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/aef7fef6de3329ed6f75512d46d63bba12b09bb5.zip ; add_tca9535 (based on 2.0.16)

View File

@@ -1,4 +1,15 @@
[env:seeed-xiao-s3]
custom_meshtastic_hw_model = 81
custom_meshtastic_hw_model_slug = SEEED_XIAO_S3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Seeed Xiao ESP32-S3
custom_meshtastic_images = seeed-xiao-s3.svg
custom_meshtastic_tags = Seeed
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = seeed-xiao-s3
board_level = pr

View File

@@ -1,4 +1,15 @@
[env:station-g2]
custom_meshtastic_hw_model = 31
custom_meshtastic_hw_model_slug = STATION_G2
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 2
custom_meshtastic_display_name = Station G2
custom_meshtastic_images = station-g2.svg
custom_meshtastic_tags = B&Q
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = esp32s3_base
board = station-g2
board_level = pr

View File

@@ -1,4 +1,15 @@
[env:t-deck-pro]
custom_meshtastic_hw_model = 102
custom_meshtastic_hw_model_slug = T_DECK_PRO
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-Deck Pro
custom_meshtastic_images = tdeck_pro.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = esp32s3_base
board = t-deck-pro
board_check = true

View File

@@ -1,5 +1,16 @@
; LilyGo T-Deck
[env:t-deck]
custom_meshtastic_hw_model = 50
custom_meshtastic_hw_model_slug = T_DECK
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-Deck
custom_meshtastic_images = t-deck.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = esp32s3_base
board = t-deck
board_check = true

View File

@@ -1,5 +1,15 @@
; LilyGo T-Watch S3
[env:t-watch-s3]
custom_meshtastic_hw_model = 51
custom_meshtastic_hw_model_slug = T_WATCH_S3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = LILYGO T-Watch S3
custom_meshtastic_images = t-watch-s3.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = t-watch-s3
board_check = true

View File

@@ -1,5 +1,16 @@
; The 1.0 release of the LilyGo TBEAM-S3-Core board
[env:tbeam-s3-core]
custom_meshtastic_hw_model = 12
custom_meshtastic_hw_model_slug = LILYGO_TBEAM_S3_CORE
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-Beam Supreme
custom_meshtastic_images = tbeam-s3-core.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = tbeam-s3-core
board_build.partitions = default_8MB.csv

View File

@@ -1,5 +1,16 @@
; LilyGo T-Lora-Pager
[env:tlora-pager]
custom_meshtastic_hw_model = 103
custom_meshtastic_hw_model_slug = T_LORA_PAGER
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-LoRa Pager
custom_meshtastic_images = lilygo-tlora-pager.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB
extends = esp32s3_base
board = t-deck-pro ; same as T-Deck Pro
board_check = true

View File

@@ -1,4 +1,14 @@
[env:tlora-t3s3-epaper]
custom_meshtastic_hw_model = 16
custom_meshtastic_hw_model_slug = TLORA_T3_S3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-LoRa T3-S3 E-Ink
custom_meshtastic_images = tlora-t3s3-epaper.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
extends = esp32s3_base
board = tlora-t3s3-v1
board_check = true

View File

@@ -1,4 +1,14 @@
[env:tlora-t3s3-v1]
custom_meshtastic_hw_model = 16
custom_meshtastic_hw_model_slug = TLORA_T3_S3
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-LoRa T3-S3
custom_meshtastic_images = tlora-t3s3-v1.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
extends = esp32s3_base
board = tlora-t3s3-v1
board_check = true

View File

@@ -1,4 +1,13 @@
[env:tracksenger]
custom_meshtastic_hw_model = 48
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = TrackSenger (small TFT)
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
@@ -16,6 +25,15 @@ lib_deps =
lovyan03/LovyanGFX@1.2.7
[env:tracksenger-lcd]
custom_meshtastic_hw_model = 48
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = false
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = TrackSenger (big TFT)
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
@@ -33,6 +51,14 @@ lib_deps =
lovyan03/LovyanGFX@1.2.7
[env:tracksenger-oled]
custom_meshtastic_hw_model = 48
custom_meshtastic_hw_model_slug = HELTEC_WIRELESS_TRACKER
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = TrackSenger (big OLED)
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv

View File

@@ -1,6 +1,15 @@
; platformio.ini for unphone meshtastic
[env:unphone]
custom_meshtastic_hw_model = 59
custom_meshtastic_hw_model_slug = UNPHONE
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = unPhone
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 8MB
extends = esp32s3_base
board = unphone
board_build.partitions = partition-table-8MB.csv

View File

@@ -1,5 +1,14 @@
; First prototype eink/nrf52840/sx1262 device
[env:thinknode_m1]
custom_meshtastic_hw_model = 89
custom_meshtastic_hw_model_slug = THINKNODE_M1
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = ThinkNode M1
custom_meshtastic_images = thinknode_m1.svg
custom_meshtastic_tags = Elecrow
extends = nrf52840_base
board = ThinkNode-M1
board_check = true

View File

@@ -1,8 +1,17 @@
[env:thinknode_m3]
custom_meshtastic_support_level = 1
custom_meshtastic_images = thinknode_m3.svg
custom_meshtastic_tags = Elecrow
extends = nrf52840_base
board = ThinkNode-M3
board_check = true
debug_tool = jlink
custom_meshtastic_hw_model = 115
custom_meshtastic_hw_model_slug = THINKNODE_M3
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = Elecrow ThinkNode M3
custom_meshtastic_actively_supported = true
build_flags =
${nrf52840_base.build_flags}
-Ivariants/nrf52840/ELECROW-ThinkNode-M3

View File

@@ -1,5 +1,14 @@
; ThinkNode M6 - Outdoor Solar Power nrf52840/sx1262 device
[env:thinknode_m6]
custom_meshtastic_hw_model = 120
custom_meshtastic_hw_model_slug = THINKNODE_M6
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = false
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = ThinkNode M6
custom_meshtastic_images = thinknode_m6.svg
custom_meshtastic_tags = Elecrow
extends = nrf52840_base
board = ThinkNode-M6
board_check = true

View File

@@ -1,5 +1,13 @@
; Public Beta oled/nrf52840/sx1262 device
[env:canaryone]
custom_meshtastic_hw_model = 29
custom_meshtastic_hw_model_slug = CANARYONE
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Canary One
custom_meshtastic_tags = Canary
extends = nrf52840_base
board = canaryone
debug_tool = jlink

View File

@@ -1,5 +1,15 @@
; Promicro + E22(0)-xxxM / HT-RA62 modules board variant - DIY - with TCXO
[env:nrf52_promicro_diy_tcxo]
custom_meshtastic_hw_model = 63
custom_meshtastic_hw_model_slug = NRF52_PROMICRO_DIY
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = NRF52 Pro-micro DIY
custom_meshtastic_images = promicro.svg
custom_meshtastic_tags = DIY
custom_meshtastic_requires_dfu = true
extends = nrf52840_base
board = promicro-nrf52840
build_flags = ${nrf52840_base.build_flags}

View File

@@ -1,5 +1,14 @@
; First prototype nrf52840/sx1262 device
[env:heltec-mesh-node-t114]
custom_meshtastic_hw_model = 69
custom_meshtastic_hw_model_slug = HELTEC_MESH_NODE_T114
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec Mesh Node T114
custom_meshtastic_images = heltec-mesh-node-t114.svg, heltec-mesh-node-t114-case.svg
custom_meshtastic_tags = Heltec
extends = nrf52840_base
board = heltec_mesh_node_t114
board_level = pr

View File

@@ -1,8 +1,20 @@
; First prototype nrf52840/sx1262 device
[env:heltec-mesh-pocket-5000]
custom_meshtastic_support_level = 1
custom_meshtastic_images = heltec_mesh_pocket.svg
custom_meshtastic_tags = Heltec
extends = nrf52840_base
board = heltec_mesh_pocket
debug_tool = jlink
custom_device_hw_model = 94
custom_meshtastic_hw_model = 94
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = Heltec Mesh Pocket
custom_meshtastic_actively_supported = true
custom_meshtastic_variant = 5000mAh
custom_meshtastic_key = heltec_mesh_pocket
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
build_flags = ${nrf52840_base.build_flags}
@@ -31,6 +43,13 @@ lib_deps =
[env:heltec-mesh-pocket-5000-inkhud]
extends = nrf52840_base, inkhud
board = heltec_mesh_pocket
custom_meshtastic_hw_model = 94
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = Heltec Mesh Pocket
custom_meshtastic_actively_supported = true
custom_meshtastic_variant = 5000mAh InkHUD
custom_meshtastic_key = heltec_mesh_pocket
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
build_flags =
${inkhud.build_flags}
@@ -45,9 +64,20 @@ lib_deps =
; First prototype nrf52840/sx1262 device
[env:heltec-mesh-pocket-10000]
custom_meshtastic_support_level = 1
custom_meshtastic_images = heltec_mesh_pocket.svg
custom_meshtastic_tags = Heltec
extends = nrf52840_base
board = heltec_mesh_pocket
debug_tool = jlink
custom_meshtastic_hw_model = 94
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = Heltec Mesh Pocket
custom_meshtastic_actively_supported = true
custom_meshtastic_variant = 10000mAh
custom_meshtastic_key = heltec_mesh_pocket
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
build_flags = ${nrf52840_base.build_flags}
@@ -76,6 +106,13 @@ lib_deps =
[env:heltec-mesh-pocket-10000-inkhud]
extends = nrf52840_base, inkhud
board = heltec_mesh_pocket
custom_meshtastic_hw_model = 94
custom_meshtastic_hw_model_slug = HELTEC_MESH_POCKET
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = Heltec Mesh Pocket
custom_meshtastic_actively_supported = true
custom_meshtastic_variant = 10000mAh InkHUD
custom_meshtastic_key = heltec_mesh_pocket
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
build_flags =
${inkhud.build_flags}

View File

@@ -19,6 +19,15 @@ lib_deps =
bblanchon/ArduinoJson@6.21.4
[env:heltec-mesh-solar]
custom_meshtastic_hw_model = 108
custom_meshtastic_hw_model_slug = HELTEC_MESH_SOLAR
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = false
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Heltec MeshSolar
custom_meshtastic_images = heltec-mesh-solar.svg
custom_meshtastic_tags = Heltec
extends = heltec_mesh_solar_base
build_flags = ${heltec_mesh_solar_base.build_flags}
-DSPI_INTERFACES_COUNT=1

View File

@@ -1,4 +1,13 @@
[env:muzi-base]
custom_meshtastic_hw_model = 93
custom_meshtastic_hw_model_slug = MUZI_BASE
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = muzi BASE
custom_meshtastic_images = muzi_base.svg
custom_meshtastic_tags = muzi
extends = nrf52840_base
board = muzi-base
build_flags = ${nrf52840_base.build_flags}

View File

@@ -1,5 +1,14 @@
; First prototype eink/nrf52840/sx1262 device
[env:nano-g2-ultra]
custom_meshtastic_hw_model = 18
custom_meshtastic_hw_model_slug = NANO_G2_ULTRA
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 2
custom_meshtastic_display_name = Nano G2 Ultra
custom_meshtastic_images = nano-g2-ultra.svg
custom_meshtastic_tags = B&Q
extends = nrf52840_base
board = nano-g2-ultra
debug_tool = jlink

View File

@@ -1,5 +1,14 @@
; The R1 Neo board
[env:r1-neo]
custom_meshtastic_hw_model = 101
custom_meshtastic_hw_model_slug = MUZI_R1_NEO
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = muzi R1 Neo
custom_meshtastic_images = muzi_r1_neo.svg
custom_meshtastic_tags = muzi
extends = nrf52840_base
board = r1-neo
board_check = true

View File

@@ -1,5 +1,14 @@
; Firmware for the WisMesh HUB RAK2560, including a onewire module to talk to the RAK 9154 solar battery.
[env:rak2560]
custom_meshtastic_hw_model = 22
custom_meshtastic_hw_model_slug = WISMESH_HUB
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = RAK WisMesh Repeater
custom_meshtastic_images = rak2560.svg
custom_meshtastic_tags = RAK
extends = nrf52840_base
board = wiscore_rak4631
board_check = true

View File

@@ -1,5 +1,15 @@
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
[env:rak3401-1watt]
custom_meshtastic_hw_model = 117
custom_meshtastic_hw_model_slug = RAK3401
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = RAK3401 1W
custom_meshtastic_images = rak3401.svg
custom_meshtastic_tags = RAK
custom_meshtastic_requires_dfu = true
extends = nrf52840_base
board = wiscore_rak4631
board_check = true

View File

@@ -1,5 +1,14 @@
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
[env:rak4631]
custom_meshtastic_hw_model = 9
custom_meshtastic_hw_model_slug = RAK4631
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = RAK WisBlock 4631
custom_meshtastic_images = rak4631.svg, rak4631_case.svg
custom_meshtastic_tags = RAK
extends = nrf52840_base
board = wiscore_rak4631
board_level = pr

View File

@@ -1,5 +1,14 @@
; NomadStar Meteor Pro based on RAK4631 with RGBW LED LP5562 support
[env:rak4631_nomadstar_meteor_pro]
custom_meshtastic_hw_model = 96
custom_meshtastic_hw_model_slug = NOMADSTAR_METEOR_PRO
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = NomadStar Meteor Pro
custom_meshtastic_images = meteor_pro.svg
custom_meshtastic_tags = NomadStar
extends = nrf52840_base
board = wiscore_rak4631
board_check = true

View File

@@ -1,8 +1,17 @@
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
[env:rak_wismeshtag]
custom_meshtastic_support_level = 1
custom_meshtastic_images = rak_wismesh_tag.svg
custom_meshtastic_tags = RAK
extends = nrf52840_base
board = wiscore_rak4631
board_check = true
custom_meshtastic_hw_model = 105
custom_meshtastic_hw_model_slug = WISMESH_TAG
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = RAK WisMesh Tag
custom_meshtastic_actively_supported = true
build_flags = ${nrf52840_base.build_flags}
-I variants/nrf52840/rak_wismeshtag
-D WISMESH_TAG

View File

@@ -1,5 +1,14 @@
; The very slick RAK wireless RAK10701 Field Tester device. Note you will have to flash to Arduino bootloader to use this firmware. Be aware touch is not currently working.
[env:rak_wismeshtap]
custom_meshtastic_hw_model = 84
custom_meshtastic_hw_model_slug = WISMESH_TAP
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = RAK WisMesh Tap
custom_meshtastic_images = rak-wismeshtap.svg
custom_meshtastic_tags = RAK
extends = nrf52840_base
board = wiscore_rak4631
build_flags = ${nrf52840_base.build_flags}

View File

@@ -1,4 +1,13 @@
[env:seeed_solar_node]
custom_meshtastic_hw_model = 95
custom_meshtastic_hw_model_slug = SEEED_SOLAR_NODE
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Seeed SenseCAP Solar Node
custom_meshtastic_images = seeed_solar.svg
custom_meshtastic_tags = Seeed
board = seeed_solar_node
extends = nrf52840_base
;board_level = extra

View File

@@ -1,4 +1,14 @@
[env:seeed_wio_tracker_L1]
custom_meshtastic_hw_model = 99
custom_meshtastic_hw_model_slug = SEEED_WIO_TRACKER_L1
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Seeed Wio Tracker L1
custom_meshtastic_images = wio_tracker_l1_case.svg
custom_meshtastic_tags = Seeed
custom_meshtastic_requires_dfu = true
board = seeed_wio_tracker_L1
extends = nrf52840_base
build_flags = ${nrf52840_base.build_flags}

View File

@@ -1,4 +1,13 @@
[env:seeed_wio_tracker_L1_eink]
custom_meshtastic_hw_model = 100
custom_meshtastic_hw_model_slug = SEEED_WIO_TRACKER_L1_EINK
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Seeed Wio Tracker L1 E-Ink
custom_meshtastic_images = wio_tracker_l1_eink.svg
custom_meshtastic_tags = Seeed
board = seeed_wio_tracker_L1
extends = nrf52840_base
;board_level = extra

View File

@@ -1,5 +1,14 @@
; Seeed Xiao BLE: https://wiki.seeedstudio.com/XIAO_BLE/
[env:seeed_xiao_nrf52840_kit]
custom_meshtastic_hw_model = 88
custom_meshtastic_hw_model_slug = XIAO_NRF52_KIT
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = Seeed Xiao NRF52840 Kit
custom_meshtastic_images = seeed_xiao_nrf52_kit.svg
custom_meshtastic_tags = Seeed
extends = nrf52840_base
board = xiao_ble_sense
board_level = pr

View File

@@ -1,5 +1,14 @@
; Using original screen class
[env:t-echo-lite]
custom_meshtastic_hw_model = 109
custom_meshtastic_hw_model_slug = T_ECHO_LITE
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = false
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-Echo Lite
custom_meshtastic_images = techo_lite.svg
custom_meshtastic_tags = LilyGo
extends = nrf52840_base
board = t-echo
board_check = true

View File

@@ -1,5 +1,14 @@
; Using original screen class
[env:t-echo]
custom_meshtastic_hw_model = 7
custom_meshtastic_hw_model_slug = T_ECHO
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-Echo
custom_meshtastic_images = t-echo.svg
custom_meshtastic_tags = LilyGo
extends = nrf52840_base
board = t-echo
board_level = pr

View File

@@ -1,7 +1,16 @@
[env:tracker-t1000-e]
custom_meshtastic_support_level = 1
custom_meshtastic_images = tracker-t1000-e.svg
custom_meshtastic_tags = Seeed
extends = nrf52840_base
board = tracker-t1000-e
board_level = pr
custom_meshtastic_hw_model = 71
custom_meshtastic_hw_model_slug = TRACKER_T1000_E
custom_meshtastic_architecture = nrf52840
custom_meshtastic_display_name = Seeed SenseCAP T1000-E
custom_meshtastic_actively_supported = true
build_flags = ${nrf52840_base.build_flags}
-Ivariants/nrf52840/tracker-t1000-e
-Isrc/platform/nrf52/softdevice

View File

@@ -1,5 +1,15 @@
; The red tracker Dev Board with the WM1110 module
[env:wio-tracker-wm1110]
custom_meshtastic_hw_model = 21
custom_meshtastic_hw_model_slug = WIO_WM1110
custom_meshtastic_architecture = nrf52840
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Seeed Wio WM1110 Tracker
custom_meshtastic_images = wio-tracker-wm1110.svg
custom_meshtastic_tags = Seeed
custom_meshtastic_requires_dfu = true
extends = nrf52840_base
board = wio-tracker-wm1110
build_flags = ${nrf52840_base.build_flags}

View File

@@ -1,4 +1,14 @@
[env:rak11310]
custom_meshtastic_hw_model = 26
custom_meshtastic_hw_model_slug = RAK11310
custom_meshtastic_architecture = rp2040
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 2
custom_meshtastic_display_name = RAK WisBlock 11310
custom_meshtastic_images = rak11310.svg
custom_meshtastic_tags = RAK
custom_meshtastic_requires_dfu = true
extends = rp2040_base
board = rakwireless_rak11300
board_level = pr

View File

@@ -1,4 +1,13 @@
[env:rp2040-lora]
custom_meshtastic_hw_model = 30
custom_meshtastic_hw_model_slug = RP2040_LORA
custom_meshtastic_architecture = rp2040
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 2
custom_meshtastic_display_name = RP2040 LoRa
custom_meshtastic_tags = Waveshare
custom_meshtastic_requires_dfu = true
extends = rp2040_base
board = rpipico
upload_protocol = picotool

View File

@@ -1,4 +1,14 @@
[env:pico]
custom_meshtastic_hw_model = 47
custom_meshtastic_hw_model_slug = RPI_PICO
custom_meshtastic_architecture = rp2040
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Raspberry Pi Pico
custom_meshtastic_images = pico.svg
custom_meshtastic_tags = RPi, DIY
custom_meshtastic_requires_dfu = true
extends = rp2040_base
board = rpipico
board_level = pr

View File

@@ -1,4 +1,14 @@
[env:picow]
custom_meshtastic_hw_model = 47
custom_meshtastic_hw_model_slug = RPI_PICO
custom_meshtastic_architecture = rp2040
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 3
custom_meshtastic_display_name = Raspberry Pi Pico W
custom_meshtastic_images = rpipicow.svg
custom_meshtastic_tags = RPi, DIY
custom_meshtastic_requires_dfu = true
extends = rp2040_base
board = rpipicow
board_level = pr