Develop the full Daisy Pod spike so it can be flashed the moment the board arrives. Architecture: one shared engine, two front-ends. - pm-synth: make it `#![no_std]` (mirroring track-format), routing float math through `libm` so the SAME f32 code runs on the host and on the Daisy's Cortex-M7F (hardware FPU — no fixed-point port needed). Add `Player`, a self-running sequencer that owns the Synth + scheduled clicks and renders sample-by-sample, looping at the pattern boundary. Integer-only hot path (clicks pre-resolved to sample indices); exposes a `fired()` beat counter. Add SPIKE_PROGRAM/SPIKE_BARS as the shared source of truth. - synthrender: render the SAME Player to pm-daisy-preview.wav — the host-side "simulator". Bit-identical preview of the hardware output (before its codec); far more useful than chip emulation (Renode can't model the audio codec). - pm-daisy (new, workspace-excluded firmware): thin BSP binary for the Daisy Seed/Pod. embedded-alloc heap + board bring-up + SAI-DMA audio interrupt feeding Player::next_sample() into stereo frames, USER LED flashing per click. Audio loop follows the `daisy` crate's examples/audio.rs. Board revision (codec) is a Cargo feature; README documents matching it + both flash paths (probe-rs/RTT and USB DFU) + the QSPI-bootloader fallback. Verified without hardware: host build + preview render (48 kHz, onsets on the 8th-note grid at 124 BPM); firmware cross-compiles + links for thumbv7em-none- eabihf at ~87 KB (fits the 128 KB internal flash) across all three codec revisions; track-format conformance + `node tests/run.mjs` (47 pass) still green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
33 lines
1.6 KiB
Bash
Executable file
33 lines
1.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Build pm-daisy for the Daisy Seed (STM32H750, Cortex-M7F) and produce pm-daisy.bin + .elf.
|
|
#
|
|
# ./build.sh # build for the default board revision (Seed 1.1 / WM8731)
|
|
# ./build.sh seed # original Seed (AK4556)
|
|
# ./build.sh seed_1_2 # Seed 1.2 / Seed2 DFM (PCM3060)
|
|
#
|
|
# Flash (pick one — see README.md):
|
|
# probe-rs run --chip STM32H750VBTx pm-daisy.elf # debug probe + defmt logs over RTT
|
|
# dfu-util -a 0 -s 0x08000000:leave -D pm-daisy.bin -d ,0483:df11 # USB DFU (hold BOOT, tap RESET)
|
|
#
|
|
# Override the runtime with RUNTIME=docker ./build.sh
|
|
set -euo pipefail
|
|
|
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # rust/pm-daisy
|
|
REPO="$(cd "$DIR/../.." && pwd)" # repo root
|
|
RUNTIME="${RUNTIME:-podman}"
|
|
IMG="pm-rust:2"
|
|
REV="${1:-seed_1_1}" # board revision feature
|
|
|
|
"$RUNTIME" run --rm -v "$REPO":/work:Z -w /work/rust/pm-daisy "$IMG" bash -c "
|
|
set -e
|
|
rustup target add thumbv7em-none-eabihf >/dev/null 2>&1 || true
|
|
rustup component add llvm-tools-preview >/dev/null 2>&1 || true
|
|
cargo build --release --no-default-features --features '$REV'
|
|
OBJCOPY=\"\$(rustc --print sysroot)/lib/rustlib/\$(rustc -vV | sed -n 's/host: //p')/bin/llvm-objcopy\"
|
|
\"\$OBJCOPY\" -O binary target/thumbv7em-none-eabihf/release/pm-daisy pm-daisy.bin
|
|
cp target/thumbv7em-none-eabihf/release/pm-daisy pm-daisy.elf
|
|
echo '--- size ---'
|
|
\"\$(dirname \"\$OBJCOPY\")/llvm-size\" target/thumbv7em-none-eabihf/release/pm-daisy
|
|
"
|
|
echo "→ $DIR/pm-daisy.bin + pm-daisy.elf (revision: $REV)"
|
|
echo " flash: see the header of this script / README.md"
|