acme-camera: radio split, Wi-Fi on the SOC, BLE/Thread on the MCU

8acc3b5 · Gabriel Morell · 2026-10-13 19:27

3 files +36 -12

Files changed

modified content/presentations/acme-camera.md
+36 −12
@@ -57,18 +57,18 @@ No continuous recording, a battery camera can't afford it
57 57
58 58 ## MCU
59 59
60 −ultra-low power attached to motion sensors, lighting, and power control
60 +ultra-low power attached to motion sensors, lighting, power control, and the BLE / Thread radio
61 61
62 62 ## SOC
63 63
64 −attached to camera/storage and spends most of its time in deep sleep
64 +attached to camera/storage/Wi-Fi and spends most of its time in deep sleep
65 65
66 66 --
67 67
68 68 ## MCU Candidates
69 69
70 −- nRF54L
71 −- nRF52840
70 +- nRF54L: BLE 6, Thread / Matter
71 +- nRF52840: BLE 5, Thread / Matter
72 72
73 73 ## SOC Candidates
74 74
@@ -76,6 +76,13 @@ attached to camera/storage and spends most of its time in deep sleep
76 76 - Ingenic T41
77 77 - Ambarella CV7
78 78
79 +Note:
80 +Radio split: Wi-Fi lives on the SOC for video, BLE and Thread live on the MCU
81 +None of the SOCs have Wi-Fi on-die, so it's an SDIO module next to the SOC
82 +BLE on the MCU handles setup from the phone app without waking a soft-AP
83 +Thread / Matter lets the camera show up as a motion sensor or light in a smart home while the SOC sleeps
84 +Neither MCU has Wi-Fi; the nRF54L can host an nRF7002, but putting video through the MCU is the wrong path
85 +
79 86 ---
80 87
81 88 # Motion
@@ -176,7 +183,7 @@ Read-only rootfs means an update is a whole-slot swap, nothing drifts between de
176 183 | mcuctl | UART to the MCU |
177 184 | powerctl | PMIC over I²C |
178 185 | cameractl | sensor, ISP, clip buffer |
179 −| portalctl | soft-AP, HTTP |
186 +| portalctl | BLE via mcuctl, HTTP |
180 187 | configctl | `/data/config` |
181 188
182 189 Note:
@@ -215,7 +222,7 @@ Home security buyers ask about this first, and a compromised camera is a camera
215 222 | Storage | encrypted `/data` and clips |
216 223 | Processes | per-service users, sandboxed units |
217 224 | Broker | per-topic ACLs by peer uid |
218 −| Setup | soft-AP only while unprovisioned |
225 +| Setup | BLE pairing, soft-AP as fallback |
219 226 | Cloud | per-device certs, mutual TLS |
220 227
221 228 Note:
@@ -230,7 +237,7 @@ Factory reset wipes /data and revokes the device cert server side
230 237 | Component | Role |
231 238 |---|---|
232 239 | <a href="#/broker">broker</a> | MQTT on a Unix socket |
233 −| <a href="#/mcuctl">mcuctl</a> | motion and lights via the MCU |
240 +| <a href="#/mcuctl">mcuctl</a> | motion, lights, BLE via the MCU |
234 241 | <a href="#/powerctl">powerctl</a> | power modes, PMIC telemetry |
235 242 | <a href="#/portalctl">portalctl</a> | setup and status portals |
236 243 | <a href="#/cameractl">cameractl</a> | frames to storage and cloud |
@@ -426,7 +433,7 @@ Battery life is the product, so it's measured on every build, not at the end
426 433 | Radar only | catches still people | standby draw |
427 434 | Lights on motion | color night video | battery |
428 435 | Longer clips | more context | battery, upload |
429 −| Wi-Fi kept up | faster live view | standby draw |
436 +| Keep-alive Wi-Fi radio | instant wake | BOM, 2nd radio |
430 437 | On-device inference | smarter alerts | NPU power, BOM |
431 438
432 439 Note:
@@ -472,7 +479,7 @@ TODO: topic layout and which components publish/subscribe
472 479
473 480 # Component : MCUctl
474 481
475 −Owns the MCU link: motion sensing and lighting
482 +Owns the MCU link: motion, lighting and the BLE radio
476 483
477 484 Note:
478 485 Talks to MCU and sets/gets the motion detection and light settings
@@ -573,15 +580,32 @@ Interactive wireless authentication and cloud configuration
573 580
574 581 ## Modes
575 582
576 −Which portal is up, and setup progress
583 +Which portal is up, and how setup arrives
577 584
578 585 ```rust
586 +enum SetupTransport {
587 + Ble,
588 + SoftAp { ssid: String, psk: String },
589 +}
590 +
579 591 enum PortalMode {
580 − Setup { ap_ssid: String, ap_psk: String },
592 + Setup { via: SetupTransport },
581 593 Status,
582 594 Off,
583 595 }
596 +```
597 +
598 +Note:
599 +Setup runs on first boot / factory reset, over BLE through mcuctl from the phone app, soft-AP only as a fallback without the app
600 +Status once on the home network, Off once cloud-managed
601 +
602 +--
584 603
604 +## Provisioning
605 +
606 +How far setup has got
607 +
608 +```rust
585 609 enum ProvisioningState {
586 610 AwaitingCredentials,
587 611 JoiningNetwork,
@@ -592,7 +616,7 @@ enum ProvisioningState {
592 616 ```
593 617
594 618 Note:
595 −Setup is a soft-AP on first boot / factory reset, Status once on the home network, Off once cloud-managed
619 +The phone app polls this over BLE, or the soft-AP page does, to show progress and failures
596 620
597 621 --
598 622

Parents: 10112a6