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>
60 lines
1.8 KiB
Text
60 lines
1.8 KiB
Text
/* STM32H750IB memory map (Daisy Seed), from the `daisy` crate / libDaisy STM32H750IB_flash.lds.
|
|
*
|
|
* NOTE: the STM32H750 has only 128 KB of internal flash. If the firmware overflows it (the linker
|
|
* will say so), flash via the Daisy Bootloader to the 8 MB QSPI instead — see README.md ("Too big
|
|
* for 128 KB?"). For that path, change FLASH to:
|
|
* FLASH (RX) : ORIGIN = 0x90040000, LENGTH = 8M - 0x40000
|
|
* and flash the .bin with dfu-util to 0x90040000 (the bootloader copies it to SDRAM and runs it).
|
|
*/
|
|
MEMORY
|
|
{
|
|
FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 128K
|
|
DTCMRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 128K
|
|
SRAM (RWX) : ORIGIN = 0x24000000, LENGTH = 512K
|
|
RAM_D2 (RWX) : ORIGIN = 0x30000000, LENGTH = 288K
|
|
RAM_D3 (RWX) : ORIGIN = 0x38000000, LENGTH = 64K
|
|
ITCMRAM (RWX) : ORIGIN = 0x00000000, LENGTH = 64K
|
|
SDRAM (RWX) : ORIGIN = 0xc0000000, LENGTH = 64M
|
|
QSPIFLASH (RX) : ORIGIN = 0x90000000, LENGTH = 8M
|
|
}
|
|
|
|
REGION_ALIAS(RAM, DTCMRAM);
|
|
|
|
SECTIONS
|
|
{
|
|
.sram1_bss (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
_ssram1_bss = .;
|
|
PROVIDE(__sram1_bss_start__ = _sram1_bss);
|
|
*(.sram1_bss)
|
|
*(.sram1_bss*)
|
|
. = ALIGN(4);
|
|
_esram1_bss = .;
|
|
PROVIDE(__sram1_bss_end__ = _esram1_bss);
|
|
} > RAM_D2
|
|
|
|
.sdram_bss (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
_ssdram_bss = .;
|
|
PROVIDE(__sdram_bss_start = _ssdram_bss);
|
|
*(.sdram_bss)
|
|
*(.sdram_bss*)
|
|
. = ALIGN(4);
|
|
_esdram_bss = .;
|
|
PROVIDE(__sdram_bss_end = _esdram_bss);
|
|
} > SDRAM
|
|
|
|
.sram (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
_ssram = .;
|
|
PROVIDE(__sram_start__ = _sram);
|
|
*(.sram)
|
|
*(.sram*)
|
|
. = ALIGN(4);
|
|
_esram = .;
|
|
PROVIDE(__sram_end__ = _esram);
|
|
} > SRAM
|
|
}
|