Waveshare ESP32-C6 2.06inch AMOLED Touch Watch Development Board
Waveshare ESP32-C6 2.06inch AMOLED Touch Watch Development Board.
back to microcontrollers page.
Links
Waveshare ESP32-C6 2.06inch AMOLED Touch Watch Development Board, Wiki: ESP32-C6-Touch-AMOLED-2.06,
rust firmware esp32c6-watch,
sister / brother product ESP32-S3-Touch-AMOLED-2.06, Rust firmware for it: waveshare-watch-rs forks of interest: waveshare-watch-rs,
History
2026-10-20: ok - so - the time is set to US PDT, no provision to chage it.
2026-10-19: c2 - flash the firmware
tingo@kg-core2:/zt/t2/doc/Waveshare/ESP32-C6-Touch-AMOLED-2.06/rust/esp32c6-watch $ espflash flash --port /dev/cuaU1 --monitor --chip esp32c6 target/riscv32imac-unknown-none-elf/release/esp32c6-watch [2026-10-19T20:37:42Z INFO ] Serial port: '/dev/cuaU1' [2026-10-19T20:37:42Z INFO ] Connecting... [2026-10-19T20:37:42Z INFO ] Using flash stub Chip type: esp32c6 (revision v0.2) Crystal frequency: 40 MHz Flash size: 16MB Features: WiFi 6, BT 5 MAC address: 20:6e:f1:16:ca:b4 App/part. size: 4,798,672/16,384,000 bytes, 29.29% [00:00:00] [========================================] 1/1 0x0 Verifying... OK! [00:00:00] [========================================] 1/1 0x8000 Verifying... OK! [00:00:15] [========================================] 123/123 0x10000 Verifying... OK! [2026-10-19T20:38:01Z INFO ] Flashing has completed! Commands: CTRL+R Reset chip CTRL+C Exit ESP-ROM:esp32c6-20220919 Build:Sep 19 2022 rst:0x15 (USB_UART_HPSYS),boot:0x54 (DOWNLOAD(USB/UART0/SDIO_FEI_FEO)) Saved PC:0x40800822 waiting for download
and it works after reset.
2026-10-19: c2 - espflash try to connect to the watch
tingo@kg-core2:~ $ espflash board-info --port /dev/cuaU0 [2026-10-19T20:28:56Z INFO ] Serial port: '/dev/cuaU0' [2026-10-19T20:28:56Z INFO ] Connecting... Error: × Error while connecting to device ╰─▶ Failed to connect to the device tingo@kg-core2:~ $ espflash board-info --port /dev/cuaU1 [2026-10-19T20:29:07Z INFO ] Serial port: '/dev/cuaU1' [2026-10-19T20:29:07Z INFO ] Connecting... Error: × Error while connecting to device ╰─▶ Failed to connect to the device ```sh ok, hold the boot button while connecting the watch to usb ```sh tingo@kg-core2:~ $ espflash board-info --port /dev/cuaU1 [2026-10-19T20:30:34Z INFO ] Serial port: '/dev/cuaU1' [2026-10-19T20:30:34Z INFO ] Connecting... [2026-10-19T20:30:34Z INFO ] Using flash stub Chip type: esp32c6 (revision v0.2) Crystal frequency: 40 MHz Flash size: 16MB Features: WiFi 6, BT 5 MAC address: 20:6e:f1:16:ca:b4 Security Information: ===================== Flags: 0x00000000 (0) Key Purposes: [0, 0, 0, 0, 0, 0, 12] Chip ID: 13 API Version: 0 Secure Boot: Disabled Flash Encryption: Disabled SPI Boot Crypt Count (SPI_BOOT_CRYPT_CNT): 0x0 ```sh port U0 still fails (this is correct) ```sh tingo@kg-core2:~ $ espflash board-info --port /dev/cuaU0 [2026-10-19T20:32:56Z INFO ] Serial port: '/dev/cuaU0' [2026-10-19T20:32:56Z INFO ] Connecting... Error: × Error while connecting to device ╰─▶ Failed to connect to the device
2026-10-19: c2 - espflash info
tingo@kg-core2:~ $ espflash list-ports No known serial ports found. tingo@kg-core2:~ $ espflash list-ports --list-all-ports /dev/cuau0 Unknown type of port /dev/cuaU0 Unknown type of port /dev/cuaU1 Unknown type of port
2026-10-19: c2 - the dev watch shows up like this in usbconfig
root@kg-core2:~ # usbconfig -d ugen1.8 dump_device_desc ugen1.8: <USB JTAG/serial debug unit Espressif> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (500mA) bLength = 0x0012 bDescriptorType = 0x0001 bcdUSB = 0x0200 bDeviceClass = 0x00ef <Miscellaneous device> bDeviceSubClass = 0x0002 bDeviceProtocol = 0x0001 bMaxPacketSize0 = 0x0040 idVendor = 0x303a idProduct = 0x1001 bcdDevice = 0x0102 iManufacturer = 0x0001 <Espressif> iProduct = 0x0002 <USB JTAG/serial debug unit> iSerialNumber = 0x0003 <20:6E:F1:16:CA:B4> bNumConfigurations = 0x0001
I already have a devd rule for that.
2026-10-19: ok, read the instructions, then build the firmware
tingo@kg-core2:/zt/t2/doc/Waveshare/ESP32-C6-Touch-AMOLED-2.06/rust/esp32c6-watch $ cargo build --release Downloaded esp-riscv-rt v0.14.0 [..] Compiling slint v1.17.1 warning: esp32c6-watch@0.12.1: build sigil: Molten Anvil · 104f97a warning: trailing semicolon in macro used in expression position --> src/bin/../drivers/qspi_bus.rs:94:18 | 94 | let tx = dma_tx_buffer!(DMA_CHUNK).expect("QSPI DMA TX buffer"); | ^^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #79813 <https://github.com/rust-lang/rust/issues/79813> = note: `#[warn(semicolon_in_expressions_from_non_local_macros)]` (part of `#[warn(future_incompatible)]`) on by default = note: this warning originates in the macro `$crate::dma_buffers_impl` which comes from the expansion of the macro `dma_tx_buffer` (in Nightly builds, run with -Z macro-backtrace for more info) warning: trailing semicolon in macro used in expression position --> src/drivers/qspi_bus.rs:94:18 | 94 | let tx = dma_tx_buffer!(DMA_CHUNK).expect("QSPI DMA TX buffer"); | ^^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #79813 <https://github.com/rust-lang/rust/issues/79813> = note: `#[warn(semicolon_in_expressions_from_non_local_macros)]` (part of `#[warn(future_incompatible)]`) on by default = note: this warning originates in the macro `$crate::dma_buffers_impl` which comes from the expansion of the macro `dma_tx_buffer` (in Nightly builds, run with -Z macro-backtrace for more info) warning: unused import: `HEIGHT` --> src/ui/slint_shell.rs:24:64 | 24 | use crate::ui::slint_platform::{init_platform, TwoLineFlusher, HEIGHT, WIDTH}; | ^^^^^^ | = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default warning: unused doc comment --> src/main.rs:2591:5 | 2591 | /// Deferred ping VISUAL (#58): `(fire_at, from_id, mac)`. | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment = note: `#[warn(unused_doc_comments)]` (part of `#[warn(unused)]`) on by default warning: unused doc comment --> src/main.rs:2592:5 | 2592 | /// | ^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2593:5 | 2593 | /// The chime fires the instant a ping lands, but the pulse choreography does a | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2594:5 | 2594 | /// FULL-FRAME repaint (~200 ms) and the TX DMA ring only buffers 48 ms — so a | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2595:5 | 2595 | /// repaint anywhere inside the 700 ms melody starves the feeder and the chime | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2596:5 | 2596 | /// came out intermittently. The ring cannot grow: 16 KB of .bss trips the 70 KB | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2597:5 | 2597 | /// stack floor (#65) and 16 KB of heap starved the launcher into an allocation | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2598:5 | 2598 | /// failure (both tried, both reverted). So the repaint waits for the clip | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2599 | /// instead — sound is instant, picture follows. 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2599:5 | 2599 | /// instead — sound is instant, picture follows. | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2600 | let mut ping_visual_due: Option<(Instant, u8, [u8; 6])> = None; | --------------------------------------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused doc comment --> src/main.rs:2666:5 | 2666 | /// Latch for the main-pool danger warning (#75) — see the beat block below. | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2667 | let mut main_pool_warned = false; | --------------------------------- rustdoc does not generate documentation for statements | = help: use `//` for a plain comment warning: unused variable: `stack` --> src/net/net_task.rs:1291:5 | 1291 | stack: Stack<'static>, | ^^^^^ help: if this is intentional, prefix it with an underscore: `_stack` | = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default warning: variable does not need to be mutable --> src/main.rs:2347:9 | 2347 | let mut story_play_wait: Option<Instant> = None; | ----^^^^^^^^^^^^^^^ | | | help: remove this `mut` | = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default warning: unused variable: `story_play_wait` --> src/main.rs:2347:9 | 2347 | let mut story_play_wait: Option<Instant> = None; | ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_story_play_wait` warning: use of deprecated method `core::sync::atomic::Atomic::<u32>::fetch_update`: renamed to `try_update` for consistency --> src/notify.rs:121:20 | 121 | let _ = UNREAD.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| { | ^^^^^^^^^^^^ | = note: `#[warn(deprecated)]` on by default help: replace the use of the deprecated method | 121 - let _ = UNREAD.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| { 121 + let _ = UNREAD.try_update(Ordering::Relaxed, Ordering::Relaxed, |n| { | warning: unused variable: `ax` --> src/apps/tetris.rs:201:14 | 201 | let (ax, ay, _) = input.accel; | ^^ help: if this is intentional, prefix it with an underscore: `_ax` warning: unnecessary `unsafe` block --> src/main.rs:1171:19 | 1171 | let top = unsafe { core::ptr::addr_of!(_stack_start) as usize }; | ^^^^^^ unnecessary `unsafe` block | = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default warning: unnecessary `unsafe` block --> src/main.rs:1172:22 | 1172 | let bottom = unsafe { core::ptr::addr_of!(_stack_end) as usize }; | ^^^^^^ unnecessary `unsafe` block warning: constant `TP_I2C_ADDR` is never used --> src/board/waveshare_c6.rs:15:11 | 15 | pub const TP_I2C_ADDR: u8 = 0x38; | ^^^^^^^^^^^ | = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default warning: constant `IMU_I2C_ADDR` is never used --> src/board/waveshare_c6.rs:18:11 | 18 | pub const IMU_I2C_ADDR: u8 = 0x6B; | ^^^^^^^^^^^^ warning: constant `RTC_I2C_ADDR` is never used --> src/board/waveshare_c6.rs:21:11 | 21 | pub const RTC_I2C_ADDR: u8 = 0x51; | ^^^^^^^^^^^^ warning: constant `HAS_BATT_ADC` is never used --> src/board/waveshare_c6.rs:84:11 | 84 | pub const HAS_BATT_ADC: bool = false; | ^^^^^^^^^^^^ warning: constant `BATT_ADC_GPIO` is never used --> src/board/waveshare_c6.rs:85:11 | 85 | pub const BATT_ADC_GPIO: u8 = 0; // unused while HAS_BATT_ADC is false | ^^^^^^^^^^^^^ warning: constant `BATT_ADC_DIVIDER` is never used --> src/board/waveshare_c6.rs:86:11 | 86 | pub const BATT_ADC_DIVIDER: f32 = 1.0; // unused while HAS_BATT_ADC is false | ^^^^^^^^^^^^^^^^ warning: constant `HAS_AUDIO` is never used --> src/board/waveshare_c6.rs:92:11 | 92 | pub const HAS_AUDIO: bool = true; | ^^^^^^^^^ warning: constant `I2S_MCLK_GPIO` is never used --> src/board/waveshare_c6.rs:93:11 | 93 | pub const I2S_MCLK_GPIO: u8 = 19; | ^^^^^^^^^^^^^ warning: constant `I2S_BCK_GPIO` is never used --> src/board/waveshare_c6.rs:94:11 | 94 | pub const I2S_BCK_GPIO: u8 = 20; | ^^^^^^^^^^^^ warning: constant `I2S_WS_GPIO` is never used --> src/board/waveshare_c6.rs:95:11 | 95 | pub const I2S_WS_GPIO: u8 = 22; | ^^^^^^^^^^^ warning: constant `I2S_DOUT_GPIO` is never used --> src/board/waveshare_c6.rs:96:11 | 96 | pub const I2S_DOUT_GPIO: u8 = 23; // ESP → ES8311 DSDIN (playback) | ^^^^^^^^^^^^^ warning: constant `I2S_DIN_GPIO` is never used --> src/board/waveshare_c6.rs:97:11 | 97 | pub const I2S_DIN_GPIO: u8 = 21; // ES8311 ASDOUT → ESP (microphone) | ^^^^^^^^^^^^ warning: constant `AMP_GPIO` is never used --> src/board/waveshare_c6.rs:98:11 | 98 | pub const AMP_GPIO: u8 = 6; | ^^^^^^^^ warning: constant `AUDIO_BCLK_DERIVED` is never used --> src/board/waveshare_c6.rs:100:11 | 100 | pub const AUDIO_BCLK_DERIVED: bool = false; | ^^^^^^^^^^^^^^^^^^ warning: constant `STORY_PAUSE_RECT` is never used --> src/board/waveshare_c6.rs:43:15 | 43 | pub const STORY_PAUSE_RECT: (u16, u16, u16, u16) = (22, 198, 378, 438); | ^^^^^^^^^^^^^^^^ warning: trait `PanelDriver` is never used --> src/drivers/panel.rs:62:11 | 62 | pub trait PanelDriver { | ^^^^^^^^^^^ warning: struct `PanelTouch` is never constructed --> src/drivers/panel.rs:112:12 | 112 | pub struct PanelTouch { | ^^^^^^^^^^ warning: trait `TouchDriver` is never used --> src/drivers/panel.rs:120:11 | 120 | pub trait TouchDriver { | ^^^^^^^^^^^ warning: constant `CMD_SWRESET` is never used --> src/drivers/co5300.rs:42:7 | 42 | const CMD_SWRESET: u8 = 0x01; | ^^^^^^^^^^^ warning: constant `CMD_INVON` is never used --> src/drivers/co5300.rs:45:7 | 45 | const CMD_INVON: u8 = 0x21; | ^^^^^^^^^ warning: methods `election_intent`, `election`, and `restore_election` are never used --> src/net/smol_mesh.rs:664:12 | 620 | impl SmolMesh { | ------------- methods in this implementation ... 664 | pub fn election_intent(&self) -> u8 { | ^^^^^^^^^^^^^^^ ... 669 | pub fn election(&self) -> mesh_elect::Decision { | ^^^^^^^^ ... 676 | pub fn restore_election(&mut self, d: mesh_elect::Decision) { | ^^^^^^^^^^^^^^^^ warning: methods `mute`, `enable_adc`, `disable_adc`, and `is_initialized` are never used --> src/peripherals/audio.rs:99:12 | 15 | impl<I: I2c> Es8311<I> { | ---------------------- methods in this implementation ... 99 | pub fn mute(&mut self) -> Result<(), I::Error> { | ^^^^ ... 138 | pub fn enable_adc(&mut self, pga_gain: u8) -> Result<(), I::Error> { | ^^^^^^^^^^ ... 169 | pub fn disable_adc(&mut self) -> Result<(), I::Error> { | ^^^^^^^^^^^ ... 175 | pub fn is_initialized(&self) -> bool { self.initialized } | ^^^^^^^^^^^^^^ warning: function `prearm_amp` is never used --> src/peripherals/audio_out.rs:433:8 | 433 | pub fn prearm_amp() { | ^^^^^^^^^^ warning: method `read_chip_id` is never used --> src/peripherals/imu.rs:282:12 | 73 | impl<I: I2c> Qmi8658Imu<I> { | -------------------------- method in this implementation ... 282 | pub fn read_chip_id(&mut self) -> Result<u8, I::Error> { | ^^^^^^^^^^^^ warning: method `reset` is never used --> src/peripherals/imu.rs:343:12 | 336 | impl RaiseDetector { | ------------------ method in this implementation ... 343 | pub fn reset(&mut self) { | ^^^^^ warning: constant `REG_IC_TYPE` is never used --> src/peripherals/power.rs:19:7 | 19 | const REG_IC_TYPE: u8 = 0x03; | ^^^^^^^^^^^ warning: constant `REG_VBUS_H` is never used --> src/peripherals/power.rs:23:7 | 23 | const REG_VBUS_H: u8 = 0x38; | ^^^^^^^^^^ warning: constant `REG_VBUS_L` is never used --> src/peripherals/power.rs:24:7 | 24 | const REG_VBUS_L: u8 = 0x39; | ^^^^^^^^^^ warning: methods `read_chip_id`, `battery_present`, and `get_vbus_voltage` are never used --> src/peripherals/power.rs:181:12 | 69 | impl<I: I2c> Axp2101Power<I> { | ---------------------------- methods in this implementation ... 181 | pub fn read_chip_id(&mut self) -> Result<u8, I::Error> { | ^^^^^^^^^^^^ ... 186 | pub fn battery_present(&mut self) -> Result<bool, I::Error> { | ^^^^^^^^^^^^^^^ ... 203 | pub fn get_vbus_voltage(&mut self) -> Result<u16, I::Error> { | ^^^^^^^^^^^^^^^^ warning: function `lipo_pct` is never used --> src/peripherals/power.rs:230:8 | 230 | pub fn lipo_pct(mv: u16) -> u8 { | ^^^^^^^^ warning: constant `REG_CTRL2` is never used --> src/peripherals/rtc.rs:11:7 | 11 | const REG_CTRL2: u8 = 0x01; | ^^^^^^^^^ warning: constant `REG_GESTURE_ID` is never used --> src/peripherals/touch.rs:16:7 | 16 | const REG_GESTURE_ID: u8 = 0xD3; | ^^^^^^^^^^^^^^ warning: field `fingers` is never read --> src/peripherals/touch.rs:37:9 | 34 | pub struct TouchPoint { | ---------- field in this struct ... 37 | pub fingers: u8, | ^^^^^^^ | = note: `TouchPoint` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis warning: enum `Gesture` is never used --> src/peripherals/touch.rs:41:10 | 41 | pub enum Gesture { | ^^^^^^^ warning: fields `start_x`, `end_x`, and `end_y` are never read --> src/peripherals/touch.rs:57:9 | 55 | pub struct SwipeEvent { | ---------- fields in this struct 56 | pub direction: SwipeDirection, 57 | pub start_x: u16, | ^^^^^^^ 58 | pub start_y: u16, 59 | pub end_x: u16, | ^^^^^ 60 | pub end_y: u16, | ^^^^^ | = note: `SwipeEvent` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis warning: method `read_gesture` is never used --> src/peripherals/touch.rs:286:12 | 89 | impl<I: I2c> Ft3168Touch<I> { | --------------------------- method in this implementation ... 286 | pub fn read_gesture(&mut self) -> Result<Gesture, I::Error> { | ^^^^^^^^^^^^ warning: struct `NullTouch` is never constructed --> src/peripherals/touch.rs:315:12 | 315 | pub struct NullTouch; | ^^^^^^^^^ warning: methods `read`, `read_gesture`, `init`, and `poll` are never used --> src/peripherals/touch.rs:318:12 | 317 | impl NullTouch { | -------------- methods in this implementation 318 | pub fn read(&mut self) -> Result<Option<TouchPoint>, core::convert::Infallible> { | ^^^^ ... 321 | pub fn read_gesture(&mut self) -> Result<Gesture, core::convert::Infallible> { | ^^^^^^^^^^^^ ... 324 | pub fn init(&mut self) -> Result<(), core::convert::Infallible> { | ^^^^ ... 327 | pub fn poll( | ^^^^ warning: struct `NullInput` is never constructed --> src/peripherals/touch.rs:336:12 | 336 | pub struct NullInput; | ^^^^^^^^^ warning: methods `is_low`, `is_high`, `wakeup_enable`, and `wait_for_falling_edge` are never used --> src/peripherals/touch.rs:339:12 | 338 | impl NullInput { | -------------- methods in this implementation 339 | pub fn is_low(&self) -> bool { | ^^^^^^ ... 342 | pub fn is_high(&self) -> bool { | ^^^^^^^ ... 345 | pub fn wakeup_enable( | ^^^^^^^^^^^^^ ... 353 | pub async fn wait_for_falling_edge(&mut self) { | ^^^^^^^^^^^^^^^^^^^^^ warning: multiple methods are never used --> src/ui/slint_shell.rs:1501:12 | 404 | impl ShellUi { | ------------ methods in this implementation ... 1501 | pub fn set_story_open(&self, open: bool) { | ^^^^^^^^^^^^^^ ... 1507 | pub fn set_story_page(&self, page: i32) { | ^^^^^^^^^^^^^^ ... 1512 | pub fn story_page(&self) -> i32 { | ^^^^^^^^^^ ... 1521 | pub fn story_dbg(&self) -> (i32, usize, bool, bool) { | ^^^^^^^^^ ... 1548 | pub fn set_story_loading(&self, loading: bool, error: &str) { | ^^^^^^^^^^^^^^^^^ ... 1614 | pub fn set_story_paused(&self, paused: bool) { | ^^^^^^^^^^^^^^^^ ... 1623 | pub fn set_story_playback( | ^^^^^^^^^^^^^^^^^^ ... 1656 | pub fn set_story_highlight_state(&self, no_manifest: bool, highlight_off: bool) { | ^^^^^^^^^^^^^^^^^^^^^^^^^ warning: function `mmss` is never used --> src/ui/slint_shell.rs:2339:4 | 2339 | fn mmss(ms: u32) -> heapless::String<12> { | ^^^^ warning: function `opt_num` is never used --> src/ui/slint_shell.rs:2357:4 | 2357 | fn opt_num(v: Option<u32>) -> heapless::String<12> { | ^^^^^^^ warning: function `push_dec` is never used --> src/ui/slint_shell.rs:2368:4 | 2368 | fn push_dec<const N: usize>(s: &mut heapless::String<N>, v: u32) { | ^^^^^^^^ warning: function `push_pad2` is never used --> src/ui/slint_shell.rs:2389:4 | 2389 | fn push_pad2<const N: usize>(s: &mut heapless::String<N>, v: u32) { | ^^^^^^^^^ warning: field `down` is never read --> src/apps/mod.rs:30:9 | 21 | pub struct AppInput { | -------- field in this struct ... 30 | pub down: bool, | ^^^^ warning: variant `Exit` is never constructed --> src/apps/mod.rs:38:5 | 36 | pub enum AppResult { | --------- variant in this enum 37 | Continue, 38 | Exit, // Return to launcher/watchface | ^^^^ warning: method `name` is never used --> src/apps/mod.rs:55:8 | 54 | pub trait App { | --- method in this trait 55 | fn name(&self) -> &str; | ^^^^ warning: variants `Mp3Player` and `SmartHome` are never constructed --> src/apps/mod.rs:90:5 | 81 | pub enum AppState { | -------- variants in this enum ... 90 | Mp3Player, | ^^^^^^^^^ 91 | SmartHome, | ^^^^^^^^^ | = note: `AppState` has derived impls for the traits `Debug` and `Clone`, but these are intentionally ignored during dead code analysis warning: variants `UpLeft`, `UpRight`, `DownLeft`, and `DownRight` are never constructed --> src/apps/snake.rs:27:5 | 25 | enum Direction { | --------- variants in this enum 26 | Up, Down, Left, Right, 27 | UpLeft, UpRight, DownLeft, DownRight, | ^^^^^^ ^^^^^^^ ^^^^^^^^ ^^^^^^^^^ | = note: `Direction` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis warning: `esp32c6-watch` (bin "slint-demo") generated 1 warning warning: `esp32c6-watch` (bin "esp32c6-watch") generated 69 warnings (run `cargo fix --bin "esp32c6-watch" -p esp32c6-watch` to apply 6 suggestions) Finished `release` profile [optimized + debuginfo] target(s) in 4m 25s
quite a few warnings, but it finishes.
2026-10-19: building the firmware from esp32c6-watch fails with
tingo@kg-core2:/zt/t2/doc/Waveshare/ESP32-C6-Touch-AMOLED-2.06/rust/esp32c6-watch $ cargo build --release Compiling proc-macro2 v1.0.107 Compiling quote v1.0.47 Compiling unicode-ident v1.0.24 Compiling libm v0.2.16 Compiling autocfg v1.5.1 Compiling foldhash v0.2.0 Compiling version_check v0.9.5 Compiling equivalent v1.0.2 Compiling esp-metadata-generated v0.4.0 Compiling litrs v1.0.0 Compiling serde_core v1.0.229 Compiling memchr v2.8.3 Compiling cfg-if v1.0.4 Compiling stable_deref_trait v1.2.1 Compiling hashbrown v0.17.1 Compiling itoa v1.0.18 Compiling critical-section v1.2.0 Compiling byteorder v1.5.0 Compiling serde v1.0.229 Compiling log v0.4.33 Compiling arrayvec v0.7.8 Compiling unsafe-libyaml v0.2.11 Compiling num-traits v0.2.19 Compiling smallvec v1.15.2 Compiling ryu v1.0.23 Compiling somni-parser v0.2.2 Compiling hash32 v0.3.1 Compiling libc v0.2.186 Compiling heck v0.5.0 Compiling document-features v0.2.12 Compiling writeable v0.6.3 Compiling futures-core v0.3.33 Compiling ident_case v1.0.1 Compiling somni-expr v0.2.0 Compiling simd-adler32 v0.3.10 Compiling indexmap v2.14.0 Compiling heapless v0.9.3 Compiling slotmap v1.1.1 Compiling bitflags v2.13.1 Compiling syn v2.0.119 Compiling syn v3.0.0 Compiling futures-sink v0.3.33 Compiling unicode-segmentation v1.13.3 Compiling portable-atomic v1.14.0 Compiling adler2 v2.0.1 Compiling crc32fast v1.5.0 Compiling litemap v0.8.2 Compiling miniz_oxide v0.8.9 Compiling winnow v1.0.4 Compiling paste v1.0.15 Compiling utf8_iter v1.0.4 Compiling crossbeam-utils v0.8.22 Compiling fnv v1.0.7 Compiling toml_datetime v1.1.1+spec-1.1.0 Compiling crossbeam-epoch v0.9.20 Compiling toml_writer v1.1.2+spec-1.1.0 Compiling embedded-io v0.7.1 Compiling typenum v1.20.1 Compiling embedded-io-async v0.7.0 Compiling flate2 v1.1.9 Compiling strsim v0.11.1 Compiling embassy-sync v0.8.0 Compiling crossbeam-deque v0.8.7 Compiling convert_case v0.10.0 Compiling core_maths v0.1.1 Compiling once_cell v1.21.4 Compiling heapless v0.8.0 Compiling float-cmp v0.9.0 Compiling toml_parser v1.1.2+spec-1.1.0 Compiling rayon-core v1.13.0 Compiling embedded-io-async v0.6.1 Compiling unicode-xid v0.2.6 Compiling quick-error v2.0.1 Compiling strict-num v0.1.1 Compiling ttf-parser v0.25.1 Compiling fdeflate v0.3.7 Compiling polycool v0.4.0 Compiling zune-core v0.5.1 Compiling arrayref v0.3.9 Compiling icu_locale_data v2.2.0 Compiling weezl v0.1.12 Compiling futures-task v0.3.33 Compiling toml_edit v0.25.13+spec-1.1.0 Compiling nb v1.1.0 Compiling unicode-width v0.2.2 Compiling pkg-config v0.3.33 Compiling embedded-io v0.6.1 Compiling tinyvec_macros v0.1.1 Compiling pin-project-lite v0.2.17 Compiling tinyvec v1.12.0 Compiling png v0.18.1 Compiling futures-util v0.3.33 Compiling zune-jpeg v0.5.15 Compiling kurbo v0.13.1 Compiling serde_derive v1.0.229 Compiling yeslogic-fontconfig-sys v6.0.1 Compiling proc-macro-crate v3.5.0 Compiling num-integer v0.1.46 Compiling libloading v0.8.9 Compiling byteorder-lite v0.1.0 Compiling unicode-properties v0.1.4 Compiling anyhow v1.0.104 Compiling embassy-sync v0.7.2 Compiling thiserror v2.0.19 Compiling unicode-ccc v0.4.0 Compiling unicode-bidi-mirroring v0.4.0 Compiling icu_decimal_data v2.2.0 Compiling rustversion v1.0.23 Compiling siphasher v1.0.3 Compiling color_quant v1.1.0 Compiling unicode-script v0.5.8 Compiling either v1.16.0 Compiling gif v0.14.2 Compiling svgtypes v0.16.1 Compiling image-webp v0.2.4 Compiling dlib v0.5.3 Compiling num-bigint v0.4.8 Compiling thiserror-impl v2.0.19 Compiling roxmltree v0.21.1 Compiling simplecss v0.2.2 Compiling esp-rom-sys v0.1.4 Compiling synstructure v0.13.2 Compiling fontdb v0.23.0 Compiling generic-array v0.14.7 Compiling unicode-bidi v0.3.18 Compiling pulldown-cmark v0.13.4 Compiling icu_normalizer_data v2.2.0 Compiling pico-args v0.5.0 Compiling imagesize v0.14.0 Compiling data-url v0.3.2 Compiling xmlwriter v0.1.0 Compiling unicode-vo v0.1.0 Compiling embassy-sync v0.6.2 Compiling icu_properties_data v2.2.0 Compiling zerocopy v0.8.54 Compiling base64 v0.22.1 Compiling rayon v1.12.0 Compiling getopts v0.2.24 Compiling memmap2 v0.9.11 Compiling esp-sync v0.2.1 Compiling as-slice v0.2.1 Compiling parlance v0.1.0 Compiling num-rational v0.4.2 Compiling linebender_resource_handle v0.1.1 Compiling embedded-hal v1.0.0 Compiling unicase v2.9.0 Compiling av-scenechange v0.14.1 Compiling pulldown-cmark-escape v0.11.0 Compiling embedded-hal-async v1.0.0 Compiling built v0.8.1 Compiling aligned v0.4.3 Compiling darling_core v0.21.3 Compiling nb v0.1.3 Compiling no_std_io2 v0.9.4 Compiling nom v8.0.0 Compiling pulp v0.22.3 Compiling y4m v0.8.0 Compiling pastey v0.1.1 Compiling rav1e v0.8.1 Compiling void v1.0.2 Compiling semver v1.0.28 Compiling htmlparser v0.2.1 Compiling bytemuck_derive v1.11.0 Compiling zerofrom-derive v0.1.7 Compiling yoke-derive v0.8.2 Compiling zerovec-derive v0.11.3 Compiling displaydoc v0.2.6 Compiling derive_more-impl v2.1.1 Compiling equator-macro v0.4.2 Compiling serde_yaml v0.9.34+deprecated Compiling fixed_decimal v0.7.2 Compiling zerocopy-derive v0.8.54 Compiling equator v0.4.2 Compiling strum_macros v0.28.0 Compiling bytemuck v1.25.2 Compiling aligned-vec v0.6.4 Compiling num-derive v0.4.2 Compiling zerofrom v0.1.8 Compiling yoke v0.8.3 Compiling v_frame v0.3.9 Compiling profiling-procmacros v1.0.18 Compiling tiny-skia-path v0.12.0 Compiling font-types v0.11.3 Compiling zerovec v0.11.6 Compiling zerotrie v0.2.4 Compiling rgb v0.8.53 Compiling esp-config v0.7.0 Compiling read-fonts v0.39.2 Compiling rustybuzz v0.20.1 Compiling tiny-skia v0.12.0 Compiling arg_enum_proc_macro v0.3.4 Compiling profiling v1.0.18 Compiling font-types v0.12.1 Compiling tinystr v0.8.3 Compiling potential_utf v0.1.5 Compiling darling_macro v0.21.3 Compiling icu_collections v2.2.0 Compiling icu_locale_core v2.2.0 Compiling av1-grain v0.2.5 Compiling num-complex v0.4.6 Compiling maybe-rayon v0.1.1 Compiling rustc_version v0.4.1 error[E0433]: cannot find module or crate `riscv` in this scope --> /home/tingo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/esp-sync-0.2.1/src/raw.rs:71:25 | 71 | riscv::interrupt::enable(); | ^^^^^ use of unresolved module or unlinked crate `riscv` | = help: if you wanted to use a crate named `riscv`, use `cargo add riscv` to add it to your `Cargo.toml` For more information about this error, try `rustc --explain E0433`. error: could not compile `esp-sync` (lib) due to 1 previous error warning: build failed, waiting for other jobs to finish...
2026-10-19: I created this page.
2026-10-19: the package finally arrived. Contents: - a wristband (rubber) - a small pphilips xcrewdriver - a battery (SKU: 32474) labeled "3.7V 400mA" and "602525 MX1.25 2P" - a plastic box with the watch / devkit itself
2026-10-17: Aliexpress notice: package now with local carrier.
2026-10-16: I got a notice from Instabox that a package from BlueSky was in transit for me.
2026-10-10: the package is in my country / region. And later at customs.
2026-10-03: the package left the place of departure.
2026-10-02: the shipper collected the package.
2026-09-29: the order was shipped.
2026-09-28: from Aliexpress, I ordered 1 x Waveshare ESP32-C6 2.06inch AMOLED Touch Watch Development Board, 410×502 Pixels, RISC-V 32-bit Processor, Supports WiFi 6 BT5 with battery. The price was Eur 29.99, shipping was Eur 7.33 and tax was Eur 9.33, a total of Eur 46.65. This translates to NOK 527.84 (via PayPal).