1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
[]
= "m5stack-core"
= "0.4.2"
= "2024"
= "1.86"
= "MIT OR Apache-2.0"
= "Board support crate for M5Stack Fire27 and CoreS3 (ESP32/ESP32-S3)"
= "https://github.com/emobotics-dev/m5stack-core"
= "README.md"
= ["esp32", "m5stack", "embedded", "bsp", "embassy"]
= ["embedded", "no-std", "hardware-support"]
# Dev-only infrastructure — irrelevant to a published-crate consumer.
= [".forgejo/", ".devcontainer/", "CLAUDE.md"]
[]
= false
= false
[]
# The `esp-bootloader-esp-idf?/<chip>` arms only bite when the optional dep is
# already on (via `heap`) — `init_heap`'s `#[ram(reclaimed)]` region needs the
# esp-idf bootloader crate in the graph; a heap-free build never pulls it.
= ["esp-hal/esp32", "esp-radio/esp32", "esp-sync/esp32", "esp-bootloader-esp-idf?/esp32", "esp-rtos?/esp32"]
= ["esp-hal/esp32s3", "esp-radio/esp32s3", "esp-sync/esp32s3", "esp-bootloader-esp-idf?/esp32s3", "esp-rtos?/esp32s3"]
# Enables the masked 1-Wire ROM search (driver::onewire::Search::new_with_mask),
# constraining enumeration to addresses matching fixed bits under a mask.
= []
# HIL serial-cmd driver — exposes a Read endpoint over UART0 (fire27) or
# USB-Serial-JTAG (cores3). Paired with `alternator-regulator/serial-cmd`.
= []
# Bench regression only: injects `M5_TEST_AW_NACK` simulated AW9523B "not ready"
# results into `board::cores3::power_display_reset`, so the cold-boot retry
# recovery (issue #3 companion) is testable without a power cycle (the rig can't
# switch USB VBUS). No effect unless the env var is set at build time; never
# enable in production.
= []
# Export the `#[panic_handler]` symbol from the BSP (body = io::console::on_panic
# — RTC breadcrumb + best-effort print + halt). Off by default so a consumer can
# provide its own; a binary opts in instead of hand-rolling the one-line wrapper.
= []
# Multicore app-core harness (board::run_app_core): parks + starts the APP core
# on an esp-rtos InterruptExecutor with the waiti idle loop, encapsulating the
# park_core JTAG-reset workaround. Pulls esp-rtos (its embassy InterruptExecutor).
= ["dep:esp-rtos"]
# Console serial transport (UART0 / USB-Serial-JTAG): the TX drain + RX half +
# `console::install`'s `Some(serial)` path + the panic transport print. With it
# OFF (R9 production backstop) none of those symbols link: `log!` is a no-op into
# the ring, `install` can only register the backend, and `on_panic` still writes
# the RTC breadcrumb and halts (RWDT recovers) — just with no serial surface.
= []
# Global-heap ownership (the `mem` module): `mem::init_heap(profile, psram)`
# declares the esp-alloc DRAM regions (HIL-proven per-board sizes) so a binary
# never calls `esp_alloc::heap_allocator!` itself. PSRAM-free, so a board with
# no external RAM (or that just doesn't want it) enables only this.
= ["dep:esp-alloc", "dep:allocator-api2", "dep:esp-bootloader-esp-idf"]
# External PSRAM heap support (the PSRAM region + the `psram_box`/`psram_vec`
# checked allocators). Implies `heap`. Enabling it activates a build-time guard
# requiring opt-level > 0 (build.rs) and the compile-time `PsramSafe` atomic
# check (uses the `esp` nightly auto-trait features).
= ["heap"]
# On-board ILI9342C panel bring-up (board::display) and the display/SD-card
# device construction on the shared SPI2 bus (board::spi2::Spi2Parts::finish).
= ["dep:lcd-async", "dep:embassy-embedded-hal"]
# Debounced front-panel button driver (io::buttons::Buttons, Fire27 hardware).
# The unified ButtonEvent types and the CoreS3 touch emulation need no feature.
= ["dep:async-button", "dep:embassy-time-04"]
# --- Radio (driver::radio) — orthogonal to the chip features; combine per app.
# The radio is shared, so `coex` is required to run BLE and WiFi at once.
= ["esp-radio/ble"] # driver::radio::ble (BleRadio → BleConnector)
= ["esp-radio/wifi"] # driver::radio::wifi (controller + scan)
= ["wifi", "dep:embassy-net"] # STA + DHCP embassy_net::Stack
= ["wifi", "dep:embassy-net"] # reserved for AP mode (not yet implemented)
= ["esp-radio/coex", "wifi", "ble"] # software WiFi/BLE coexistence (extra RAM)
[]
# esp-hal family — stock crates.io versions so the crate publishes. The whole
# family is version-locked together, so they are pinned exactly; local and
# example builds are redirected to the emobotics fork (a coherent snapshot of
# the same versions, plus SPI/DMA patches the examples need) via the rev-pinned
# [patch.crates-io] below, which `cargo publish` ignores.
= { = "=0.10.0", = true }
= { = "=1.1.1", = ["unstable"] }
= { = "=0.18.0", = ["esp-alloc", "unstable"] }
= { = "=0.2.1" }
# Bootloader integration — needed only by the `heap` feature: `init_heap`'s
# `#[ram(reclaimed)]` region requires the esp-idf bootloader crate in the graph
# (it also backs the future `app_desc!`). Stock for publish; patched to the fork
# below for local/example builds so it unifies with the examples' copy (a
# `links` crate must resolve to a single version).
= { = "=0.5.0", = true }
# Multicore harness only (board::run_app_core): esp-rtos's embassy
# InterruptExecutor. Stock for publish, patched to the fork below for local
# builds so it unifies with the examples' copy.
= { = "=0.3.0", = true, = ["embassy"] }
# Pinned (and referenced via `use esp_rom_sys as _` in lib.rs so it survives
# `cargo package`): esp-hal 1.1.0 calls esp_rom_sys::init_syscall_table, added
# in 0.1.4, but only constrains it to ~0.1 — without this pin a stock resolve
# drifts to 0.1.1 (which lacks the function) and esp-hal fails to compile.
= { = "=0.1.4" }
# embedded-hal family
= "1.0.0"
= "0.7.0"
# Embassy
= { = "0.10.0", = ["nightly"] }
= "0.1"
= { = "0.9.1", = true, = false, = ["dhcpv4", "proto-ipv4", "medium-ethernet", "tcp", "udp", "dns"] }
= "0.8"
= "0.5.1"
# misc
# Held at 0.3: esp-alloc 0.10 implements allocator-api2 0.3's `Allocator` for its
# Internal/ExternalMemory; 0.4 is a different trait version → tied to the esp stack.
= { = "0.3.0", = false, = ["alloc"], = true }
= { = "0.2.0", = true }
# async-button 0.2 pins embassy-time 0.4; alias it so we can name that `Duration`
# to build `ButtonConfig` timings from milliseconds (the BSP itself is on 0.5).
= { = "embassy-time", = "0.4", = true }
= { = "0.6.0", = true, = ["time"] }
# Held at 1.29: 1.30+ requires `az ~1.3`, conflicting with embedded-graphics 0.8's
# `az ~1.2` pin.
= "1.29.0"
= { = "0.1.3", = true }
= { = "0.9.3", = ["nightly"] }
= "0.4"
= { = "2.1.1", = ["nightly"] }
= "2.0.2"
# Local/example builds only: redirect the esp-hal family the library declares
# (stock, above) to the emobotics fork at a pinned rev — a coherent snapshot of
# those versions with the SPI/DMA patches the examples need. Pinned to a rev,
# not the floating `local` branch, so builds are reproducible. `cargo publish`
# ignores [patch], so downstream consumers resolve the stock crates.io versions.
[]
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
[]
= ["examples/common", "examples/demos"]
# Shared example dependencies — referenced by the example crates via
# `<dep>.workspace = true` so the esp-hal fork rev (and the rest) is stated
# once. Chip features (esp32/esp32s3) and `optional` are applied per-member.
# The library itself (above) does NOT use these — it depends on stock crates.io
# esp-hal redirected by [patch.crates-io]; the examples pull fork crates that
# are not on the patch list (esp-rtos, esp-bootloader-esp-idf, esp-backtrace,
# esp-println), so they declare the fork explicitly.
[]
# esp-hal family (emobotics fork, pinned rev)
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a", = ["internal-heap-stats"] }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a", = ["panic-handler", "custom-halt", "colors", "println"] }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a", = ["unstable"] }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a", = ["log-04", "colors", "timestamp"], = false }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a", = ["embassy", "esp-radio"] }
= { = "https://github.com/emobotics-dev/esp-hal.git", = "e65726f8ec1c7c3aee7cd94e675e9fa8df2ab22a" }
# CoreS3 logging/panic (USB-Serial-JTAG)
= "1.0.0"
= { = "0.6.2", = ["log"] }
# Embassy
= { = "0.6.0", = ["time"] }
= { = "0.10.0", = ["nightly"] }
= "0.1"
= { = "0.9.1", = false, = ["dhcpv4", "proto-ipv4", "medium-ethernet", "tcp", "udp", "dns"] }
= "0.8"
= "0.5.1"
# Display
= "0.8.2"
= "0.1.3"
# BLE (coex). Held at 0.6: 0.7 moves to bt-hci 0.9, but esp-radio 0.18's
# BleConnector implements bt-hci 0.8 → tied to the esp stack.
= { = "0.6.0", = ["default-packet-pool-mtu-255", "scan", "derive"] }
# LVGL (lvgl feature, demos only). Exact-pinned as a matched pair: oxivgl-sys
# 0.2.3+ emits `oxivgl_render_scratch_*` C→Rust hooks whose Rust side only exists
# in oxivgl 0.6.x, so a floating `^` on either half drifts them apart and the
# lvgl example fails to link (Cargo.lock is gitignored → every fresh resolve). Bump
# both together when adopting a newer oxivgl.
= { = "=0.6.1", = ["esp-hal", "log-04"] }
= { = "=0.2.4", = false }
# misc
= "1.0.0"
= "0.9.3"
= "0.4"
= { = "2.1.1", = ["nightly"] }
[]
= "s"
[]
= 1
= 2
= false
= false
= "fat"
= "s"
= true