Files
xblink/docs/STATUS.md
michael a32c242859 M5 complete: boot-from-EEPROM with self-provisioning
XBLK binary format for pattern library in NTAG5 upper 1K EEPROM:
- 16-byte header (magic, version, pattern count, active index, CRC-16)
- Up to 9 × 112-byte fixed-size pattern entries
- Deserializer + serializer in src/pattern/mod.rs
- MCU self-provisions hardcoded patterns on first boot (no XBLK found)
- Subsequent boots load active pattern directly from EEPROM
- Python serializer tool for future PCSC-based pattern uploads

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:37:42 -08:00

5.7 KiB

xblink Project Status

Current Milestone: M6 — SRAM Mailbox Last Updated: 2026-03-05


Phase 0 — Project Setup (COMPLETE)

  • Initialize git repository and Rust project
  • Configure build target (thumbv6m-none-eabi)
  • Create project documentation (README, CLAUDE.md, STATUS, DEVELOPMENT_PLAN)
  • Verify cargo build --release compiles
  • Initial git commit

Group A — LP5562 Only

Hardware needed: XIAO M0 + LP5562EVM + mini-USB cable

M1: LED Smoke Test

  • Copy LP5562 driver from ../ntag5-samd21-lp562/src/lp5562.rs
  • Create src/led/mod.rs with re-exports
  • Update main.rs with I2C init + GPIO EN + LP5562 direct PWM test
  • Verify cargo build --release compiles
  • Verify LP5562 I2C control via EVM USB-to-I2C bridge (tools/lp5562_evm.py)
  • Flash XIAO M0 and verify RGBW LED channels with Rust firmware

M2: Engine Patterns

  • Build breathing pattern (1 engine, ramp up/down, branch loop)
  • Build heartbeat pattern (1 engine, fast ramp, slow decay)
  • Build RGB cycle (3 engines, trigger-synced phase offset)
  • Verify LP5562 runs patterns autonomously (MCU idle loop)
  • Verify MCU can stop and switch patterns (8s cycle between all 3)

M3: Hardcoded Pattern Library (COMPLETE)

  • Define 5 const patterns in firmware (breathe, heartbeat, slow_pulse, rgb_cycle, color_wash)
  • Implement pattern selector (cycle through patterns, 15s each)
  • Reduce LED current to 2mA/ch (EH-realistic budget)
  • Document engine program structures (docs/lp5562-engine-reference.md)

Hardware needed: + NTAG5Link Click board + I2C jumper

M4: NTAG5 EEPROM Read/Write (COMPLETE)

  • Write Ntag5Link<I2C> driver (src/ntag5/mod.rs)
  • Implement session register access (CONFIG_0, CONFIG_1, EH_CONFIG)
  • Implement EEPROM block read/write with write-verify
  • Config check: read session regs, compare against expected, write NDEF result
  • NDEF Type 5 text record writer for config check output
  • Verified on hardware: config check passes, NDEF readable via NFC
  • Register map module (src/ntag5/registers.rs) — deferred, constants in mod.rs for now

M5: Boot-from-EEPROM (COMPLETE)

  • Design XBLK binary pattern format (docs/plans/2026-03-05-eeprom-pattern-format.md)
  • Implement XBLK deserializer (src/pattern/mod.rs: parse_header, parse_pattern_entry)
  • Implement XBLK serializer (src/pattern/mod.rs: serialize_pattern_entry, serialize_header, crc16)
  • Update main.rs: boot → read EEPROM → parse → program LP5562 → idle, with fallback
  • MCU self-provisioning: write hardcoded patterns to EEPROM on first boot
  • Write Python serializer tool (tools/xblk_serialize.py) for PCSC pattern uploads
  • Verified on hardware: self-provisioning writes XBLK, subsequent boots load from EEPROM

M6: SRAM Mailbox

  • Implement SRAM read/write (src/ntag5/sram.rs)
  • Design command/response protocol
  • Implement MCU-side protocol handler
  • Test pattern update via NFC without power-cycling

Group C — Power + Recovery

Hardware needed: + Hall sensor + multimeter

M7: Sleep/Wake

  • Configure SAMD21 EIC for FD pin wake
  • Implement STANDBY sleep after LP5562 programming
  • Verify LP5562 keeps running during MCU sleep
  • Measure current: active vs standby vs total system

M8: Recovery Mode

  • Wire hall sensor to EIC-capable GPIO
  • Implement boot-time hall sensor check
  • Recovery: load default pattern, skip EEPROM, stay awake
  • Test with magnet

M9: Power Characterization

  • Measure current at various LED current settings
  • Test NTAG5Link EH output with phone NFC
  • Find optimal brightness vs EH budget balance
  • Document real power numbers

Group D — Abstraction + Polish

M10: LedController Trait

  • Define trait based on proven usage patterns from Groups A-C
  • Implement for LP5562 wrapper
  • Refactor main.rs to trait-based API

M11: SimplePwm Driver

  • Implement only if single-color LED hardware is available

Group E — Future

Custom PCB (SAMD21E)

  • Port to atsamd-hal with samd21e feature
  • Custom memory.x linker script
  • PCB design and fabrication

Companion App (React Native)

  • NFC communication + pattern editor + upload

Firmware Update (NFC OTA)

  • Custom bootloader if needed post-implant

Open Questions

Question Status Notes
Energy harvesting power budget TBD Multimeter measurements in M9
Optimal LED current per channel TBD Probably 2-5mA/ch, verify in M9
Firmware update strategy Deferred UF2 for dev, NFC OTA evaluated later
NTAG5Link I2C slave address Assumed 0x54 Verify in M4 with Click board
Pattern binary format Deferred to M5 Design after M2-M3 engine experience
Hall sensor + EN circuit Designed Wired-AND: hall + MCU open-drain on EN with 1M pull-up. See docs/plans/2026-03-03-hall-en-design.md
Hall sensor part selection Decided DRV5032FB (SOT-23, 8.4mT, prototype) → DRV5032FE (X2SON 1x1mm, final PCB)
EN pull-up value Decided 1M — zero steady-state draw, 3µA when EN low, ~10µs rise time

Hardware Inventory

Item Status Notes
Seeed XIAO M0 Available Dev board MCU (SAMD21G18A)
LP5562EVM Available TI eval module, RGBW LEDs, I2C addr 0x30
Mini-USB cable Available USB-C, used for flashing XIAO M0
NTAG5 Link Click Available, partially wired Missing I2C jumper to XIAO
Hall effect sensor Not available Need to source — TI DRV5032FB (SOT-23) for prototype
ACR1552 PCSC reader Available For ntag5sensor Python tooling
Multimeter Available For power budget measurements