Files
2026-08-29 17:09:09 +00:00

1919 lines
40 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Documentation for the open source MeshCore firmware">
<link rel="canonical" href="https://meshcore-dev.github.io/meshcore/solo_features/build_flags/">
<link rel="prev" href="../../development/roadmap/">
<link rel="next" href="../external_keyboard/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>Build flags - MeshCore Docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../_stylesheets/extra.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#build-flags" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="MeshCore Docs" class="md-header__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../../_assets/meshcore.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
MeshCore Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Build flags
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/meshcore-dev/meshcore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
meshcore-dev/meshcore
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="MeshCore Docs" class="md-nav__button md-logo" aria-label="MeshCore Docs" data-md-component="logo">
<img src="../../_assets/meshcore.svg" alt="logo">
</a>
MeshCore Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/meshcore-dev/meshcore/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
meshcore-dev/meshcore
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cli_commands/" class="md-nav__link">
<span class="md-ellipsis">
CLI Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../companion_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Companion Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../docs/" class="md-nav__link">
<span class="md-ellipsis">
Local Documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" class="md-nav__link">
<span class="md-ellipsis">
Frequently Asked Questions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../kiss_modem_protocol/" class="md-nav__link">
<span class="md-ellipsis">
MeshCore KISS Modem Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../nrf52_power_management/" class="md-nav__link">
<span class="md-ellipsis">
nRF52 Power Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../number_allocations/" class="md-nav__link">
<span class="md-ellipsis">
Number Allocations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../packet_format/" class="md-nav__link">
<span class="md-ellipsis">
Packet Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../payloads/" class="md-nav__link">
<span class="md-ellipsis">
Payload Format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../qr_codes/" class="md-nav__link">
<span class="md-ellipsis">
QR Codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../stats_binary_frames/" class="md-nav__link">
<span class="md-ellipsis">
Stats Binary Frame Structures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../terminal_chat_cli/" class="md-nav__link">
<span class="md-ellipsis">
Terminal Chat CLI
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" >
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
<span class="md-ellipsis">
Design
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
Design
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../design/nearby_redesign/" class="md-nav__link">
<span class="md-ellipsis">
Nearby Nodes — analiza i propozycja uporządkowania
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../design/solo_ui_framework/" class="md-nav__link">
<span class="md-ellipsis">
Solo UI framework — a guide for adding features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../design/trail_redesign/" class="md-nav__link">
<span class="md-ellipsis">
Trail (Tools Trail) — analiza i propozycja uporządkowania
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_15" >
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../development/roadmap/" class="md-nav__link">
<span class="md-ellipsis">
Feature roadmap
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16" checked>
<label class="md-nav__link" for="__nav_16" id="__nav_16_label" tabindex="0">
<span class="md-ellipsis">
Solo features
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_16">
<span class="md-nav__icon md-icon"></span>
Solo features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Build flags
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Build flags
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#build-flags" class="md-nav__link">
<span class="md-ellipsis">
Build Flags
</span>
</a>
<nav class="md-nav" aria-label="Build Flags">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#already-part-of-every-solo-build" class="md-nav__link">
<span class="md-ellipsis">
Already part of every solo build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#input-hardware-add-ons" class="md-nav__link">
<span class="md-ellipsis">
Input hardware add-ons
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#output-feedback-hardware" class="md-nav__link">
<span class="md-ellipsis">
Output / feedback hardware
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#gps" class="md-nav__link">
<span class="md-ellipsis">
GPS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#display-battery-tuning" class="md-nav__link">
<span class="md-ellipsis">
Display &amp; battery tuning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc" class="md-nav__link">
<span class="md-ellipsis">
Misc
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../external_keyboard/" class="md-nav__link">
<span class="md-ellipsis">
External keyboard
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16_3" >
<label class="md-nav__link" for="__nav_16_3" id="__nav_16_3_label" tabindex="0">
<span class="md-ellipsis">
Clock screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_16_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16_3">
<span class="md-nav__icon md-icon"></span>
Clock screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../clock_screen/clock_screen/" class="md-nav__link">
<span class="md-ellipsis">
Clock screen
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16_4" >
<label class="md-nav__link" for="__nav_16_4" id="__nav_16_4_label" tabindex="0">
<span class="md-ellipsis">
Favourites dial
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_16_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16_4">
<span class="md-nav__icon md-icon"></span>
Favourites dial
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../favourites_dial/favourites_dial/" class="md-nav__link">
<span class="md-ellipsis">
Favourites dial
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16_5" >
<label class="md-nav__link" for="__nav_16_5" id="__nav_16_5_label" tabindex="0">
<span class="md-ellipsis">
Message screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_16_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16_5">
<span class="md-nav__icon md-icon"></span>
Message screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../message_screen/message_screen/" class="md-nav__link">
<span class="md-ellipsis">
Message screen
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16_6" >
<label class="md-nav__link" for="__nav_16_6" id="__nav_16_6_label" tabindex="0">
<span class="md-ellipsis">
Screen lock
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_16_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16_6">
<span class="md-nav__icon md-icon"></span>
Screen lock
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../screen_lock/screen_lock/" class="md-nav__link">
<span class="md-ellipsis">
Screen lock
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16_7" >
<label class="md-nav__link" for="__nav_16_7" id="__nav_16_7_label" tabindex="0">
<span class="md-ellipsis">
Settings screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_16_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16_7">
<span class="md-nav__icon md-icon"></span>
Settings screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../settings_screen/settings_screen/" class="md-nav__link">
<span class="md-ellipsis">
Settings screen
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16_8" >
<label class="md-nav__link" for="__nav_16_8" id="__nav_16_8_label" tabindex="0">
<span class="md-ellipsis">
Tools screen
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_16_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16_8">
<span class="md-nav__icon md-icon"></span>
Tools screen
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../tools_screen/tools_screen/" class="md-nav__link">
<span class="md-ellipsis">
Tools screen
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#build-flags" class="md-nav__link">
<span class="md-ellipsis">
Build Flags
</span>
</a>
<nav class="md-nav" aria-label="Build Flags">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#already-part-of-every-solo-build" class="md-nav__link">
<span class="md-ellipsis">
Already part of every solo build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#input-hardware-add-ons" class="md-nav__link">
<span class="md-ellipsis">
Input hardware add-ons
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#output-feedback-hardware" class="md-nav__link">
<span class="md-ellipsis">
Output / feedback hardware
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#gps" class="md-nav__link">
<span class="md-ellipsis">
GPS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#display-battery-tuning" class="md-nav__link">
<span class="md-ellipsis">
Display &amp; battery tuning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#misc" class="md-nav__link">
<span class="md-ellipsis">
Misc
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/meshcore-dev/meshcore/edit/main/docs/solo_features/build_flags.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<h1>Build flags</h1>
<h2 id="build-flags">Build Flags</h2>
<p><a href="../../README.md">Go back</a></p>
<p>Reference for the <code>-D</code> build flags a Solo build understands beyond the
per-board defaults already set in <code>solo/&lt;board&gt;/platformio.ini</code>. Add any of
these to your own board's <code>build_flags</code> (in <code>solo/&lt;board&gt;/platformio.ini</code>) to
enable optional hardware you've wired up yourself, or to tune a default.
Everything below is a no-op when left unset — adding a flag for hardware that
isn't there costs nothing and can't brick a build; the exceptions (pin
conflicts, wrong polarity) are called out per flag.</p>
<p>None of this needs touching to get a board running — see the
<a href="../../README.md#building-from-source">environment table</a> for the flag-free
default build for each supported board.</p>
<hr />
<h3 id="already-part-of-every-solo-build">Already part of every solo build</h3>
<p>Set once per board in <code>solo/&lt;board&gt;/platformio.ini</code>, not usually touched
per-user. Listed here so the rest of this page can assume them.</p>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>FIRMWARE_SOLO_BUILD=1</code></td>
<td>Marks the build as Solo (full on-device UI) rather than a companion-only firmware.</td>
</tr>
<tr>
<td><code>DUAL_SERIAL=1</code></td>
<td>The companion app can attach over BLE <em>or</em> USB serial, whichever it finds; BLE wins if both are live. Every solo build sets this — Solo standardises on one build per board rather than splitting BLE-only / USB-only variants.</td>
</tr>
<tr>
<td><code>MAX_CONTACTS=&lt;n&gt;</code></td>
<td>Size of the contact table. Default is 32 if unset; solo builds set 350.</td>
</tr>
<tr>
<td><code>MAX_GROUP_CHANNELS=&lt;n&gt;</code></td>
<td>Size of the channel list. Required for channel support to compile in at all — not optional the way the rest of this page is.</td>
</tr>
<tr>
<td><code>OFFLINE_QUEUE_SIZE=&lt;n&gt;</code></td>
<td>How many messages queue for later delivery while the phone app is disconnected. Default 16; solo builds set 256.</td>
</tr>
<tr>
<td><code>UI_SENSORS_PAGE=1</code></td>
<td>Enables the on-device sensors dashboard page.</td>
</tr>
<tr>
<td><code>BLE_PIN_CODE=&lt;n&gt;</code></td>
<td>See below — not a plain fixed value in practice.</td>
</tr>
<tr>
<td><code>DISPLAY_CLASS=&lt;Class&gt;</code></td>
<td>Selects the display driver (e.g. <code>SSD1306Display</code>, <code>GxEPDDisplay</code>, <code>ST7789Display</code> — see <code>src/helpers/ui/</code> for the full set). Fixed by whatever panel the board actually has; only relevant if you're wiring on a <em>different</em> display than stock, in which case the matching driver's <code>.cpp</code> also needs adding to <code>build_src_filter</code>.</td>
</tr>
</tbody>
</table>
<p><strong><code>BLE_PIN_CODE</code></strong> has a special case baked in: if it's left at the literal
value <code>123456</code> <em>and</em> the board has a display, pairing uses a random 6-digit
PIN generated fresh each session and shown on-device, rather than a fixed one.
Any other numeric value is used as a static PIN instead. Leaving the flag out
entirely disables the PIN prompt (BLE pairing is unauthenticated).</p>
<hr />
<h3 id="input-hardware-add-ons">Input hardware add-ons</h3>
<p>Each of these assumes you're wiring something up yourself — check pins are
actually free on your board first (see the board's <code>variant.h</code> and its
existing <code>solo/&lt;board&gt;/platformio.ini</code> for what's already claimed).</p>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Adds</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ENV_PIN_SDA</code> / <code>ENV_PIN_SCL</code></td>
<td>CardKB (M5Stack I2C keyboard, addr <code>0x5F</code>) on a second I2C bus (resolves to <code>Wire1</code>). Probed at boot — harmless with nothing plugged in. See <a href="../external_keyboard/">External Keyboard &amp; Joystick</a>.</td>
</tr>
<tr>
<td><code>CARDKB_I2C=&lt;Wire\|Wire1&gt;</code></td>
<td>Same CardKB support, naming the bus directly — for a board with no free pins for a second bus, set <code>CARDKB_I2C=Wire</code> to share the primary bus (already used by the display/RTC) instead of defining <code>ENV_PIN_SDA</code>/<code>ENV_PIN_SCL</code>. Takes precedence if both are somehow set.</td>
</tr>
<tr>
<td><code>UI_HAS_JOYSTICK=1</code> + <code>UI_HAS_JOYSTICK_UPDOWN=1</code> (optional) + <code>JOYSTICK_UP</code> / <code>JOYSTICK_DOWN</code> / <code>JOYSTICK_LEFT</code> / <code>JOYSTICK_RIGHT</code> + <code>PIN_USER_BTN</code> + <code>PIN_BACK_BTN</code></td>
<td>A wired joystick (four direction contacts + a press contact for Enter). Replaces single-button navigation entirely once enabled. See <a href="../external_keyboard/">External Keyboard &amp; Joystick</a>.</td>
</tr>
<tr>
<td><code>PIN_GPIO1</code> .. <code>PIN_GPIO4</code></td>
<td>Up to four general-purpose pins, each independently switchable between Off / Input / Output (GPIO1/GPIO2 also get an Analog step, if wired to an ADC-capable pin) from Tools GPIO, and via the <code>!gpio1</code>..<code>!gpio4</code> bot commands. Not restricted to any particular board — works anywhere the pins are actually free. See <a href="../tools_screen/tools_screen/#gpio">Tools Screen GPIO</a>.</td>
</tr>
<tr>
<td><code>PIN_HALL_SENSOR</code> + <code>HALL_ACTIVE_HIGH=1</code> (optional)</td>
<td>A Hall-effect or reed sensor for a magnetic flip cover: closing locks and blanks the screen instantly, opening unlocks and wakes it, no combo either way. <code>HALL_ACTIVE_HIGH</code> is only for a module wired to pull the pin high (rather than low) when the magnet is near. See <a href="../screen_lock/screen_lock/#magnetic-cover-hall-sensor">Screen Lock Magnetic cover</a>.</td>
</tr>
<tr>
<td><code>PIN_GPS_SWITCH</code></td>
<td>A physical on/off switch for GPS power, read alongside the software GPS toggle — the Tools screen shows <code>gps off(hw)</code> / <code>gps off(sw)</code> when the two disagree, instead of silently trusting one over the other.</td>
</tr>
</tbody>
</table>
<hr />
<h3 id="output-feedback-hardware">Output / feedback hardware</h3>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Adds</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>PIN_BUZZER</code> (+ <code>PIN_BUZZER_EN</code>, optional)</td>
<td>A passive piezo buzzer, driven by direct PWM (nRF52) or the <code>NonBlockingRtttl</code> library (everything else) for RTTTL ringtones and UI beeps. <code>PIN_BUZZER_EN</code> is an optional enable line some boards wire separately from the signal pin.</td>
</tr>
<tr>
<td><code>PIN_VIBRATION</code></td>
<td>A vibration motor for haptic notification, via <code>GenericVibration</code>.</td>
</tr>
</tbody>
</table>
<hr />
<h3 id="gps">GPS</h3>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ENV_INCLUDE_GPS=1</code></td>
<td>Compiles in GPS support (NMEA parsing, location provider) at all.</td>
</tr>
<tr>
<td><code>GPS_BAUD_RATE=&lt;n&gt;</code></td>
<td>Baud rate for the GPS module's serial link (<code>Serial1</code>). Match your module's default.</td>
</tr>
</tbody>
</table>
<p><code>PIN_GPS_SWITCH</code> (above) is independent of both — it's a hardware kill switch
layered on top of GPS support, not a requirement for it.</p>
<hr />
<h3 id="display-battery-tuning">Display &amp; battery tuning</h3>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>OLED_MISC_FIXED_FONT=1</code></td>
<td>Pulls in a full Latin/Greek/Cyrillic 6×9 fixed font (~14 KB flash) so typed text in those alphabets renders as itself instead of block placeholders. Worth it on any board with a keyboard; skip it on space-constrained builds without one.</td>
</tr>
<tr>
<td><code>DISPLAY_ROTATION=&lt;0-3&gt;</code></td>
<td>Rotates the panel in 90° steps, for a board mounted sideways or upside down.</td>
</tr>
<tr>
<td><code>ENABLE_SCREENSHOT</code></td>
<td>Lets Solo Tools read the framebuffer over USB to capture a screenshot.</td>
</tr>
<tr>
<td><code>KEEP_DISPLAY_ON_USB</code></td>
<td>Refreshes the auto-off deadline continuously while externally (USB) powered, so the auto-off timer only starts counting once power is actually removed. Off by default because OLED panels burn in quickly with a permanently-lit screen — only worth enabling for an LCD/e-ink target, or a display you don't mind replacing.</td>
</tr>
<tr>
<td><code>AUTO_OFF_MILLIS=&lt;ms&gt;</code></td>
<td>How long the display stays on before auto-off. Default 15000 (15s); <code>0</code> disables auto-off entirely.</td>
</tr>
<tr>
<td><code>UI_RECENT_LIST_SIZE=&lt;n&gt;</code></td>
<td>How many entries the recent-activity lists show before scrolling. Default 4.</td>
</tr>
</tbody>
</table>
<hr />
<h3 id="misc">Misc</h3>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ADVERT_NAME='"name"'</code></td>
<td>Sets the default node name baked into a fresh device, instead of the hex of the first 4 bytes of its public key. Note the doubled quoting — it's a C string literal passed through a build flag.</td>
</tr>
<tr>
<td><code>MESHCORE_VERSION='"x.y"'</code></td>
<td>Overrides the upstream MeshCore base-version string shown in diagnostics, for boards whose port hasn't been rebased onto the latest yet. Cosmetic only — doesn't change protocol behaviour.</td>
</tr>
</tbody>
</table>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["content.action.edit", "content.code.copy", "search.highlight", "search.suggest"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.d7400e89.min.js"></script>
</body>
</html>