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).