Files
SN-L00/firmware/README.md
T
florian.berthold 64f9e34fc3 Add firmware skeleton for RP2040
Complete working firmware including:
- CMakeLists.txt for Pico SDK build
- SSD1306 OLED driver (128x32, I2C)
- High-resolution latency measurement using hardware timer
- Debounced button with short/long press detection
- Three modes: Single, Continuous, Stats
- USB serial debugging output

Includes 8x8 font with numbers and letters for display.
2026-01-23 03:33:35 +01:00

115 lines
2.9 KiB
Markdown

# SN-L00 Firmware
RP2040-based firmware for the SN-L00 Eurorack latency tester.
## Requirements
- [Raspberry Pi Pico SDK](https://github.com/raspberrypi/pico-sdk) v1.5+
- CMake 3.13+
- ARM GCC toolchain (`arm-none-eabi-gcc`)
## Building
### Linux/macOS
```bash
# Set SDK path (add to .bashrc/.zshrc for persistence)
export PICO_SDK_PATH=/path/to/pico-sdk
# Build
cd firmware
mkdir build && cd build
cmake ..
make
```
### Output files
After building:
- `sn_l00.uf2` - Flash via USB (drag to RPI-RP2 drive)
- `sn_l00.elf` - For debugging with SWD
## Flashing
1. Hold BOOTSEL button on RP2040-Zero
2. Connect USB cable (or press reset while holding BOOTSEL)
3. Drag `sn_l00.uf2` to the `RPI-RP2` drive
4. Module reboots automatically
## Usage
### Modes
| Mode | Entry | Display | Behavior |
|------|-------|---------|----------|
| Single | Default / Long press from Continuous | `SINGLE` | Press button to measure once |
| Continuous | Long press from Single | `CONT` | Auto-measures every 500ms |
| Stats | Short press from Continuous | Min/Max/Avg | Shows measurement statistics |
### Controls
- **Short press**: Trigger measurement (Single mode) / Exit to Stats (Continuous)
- **Long press (>500ms)**: Toggle between Single and Continuous modes
- **Any press in Stats**: Return to Single mode, reset statistics
## USB Serial
The firmware exposes USB CDC serial for debugging:
- Baud: 115200 (or any, it's USB CDC)
- Shows measurement results and mode changes
```bash
# Linux
screen /dev/ttyACM0 115200
# macOS
screen /dev/tty.usbmodem* 115200
```
## GPIO Pinout
| GPIO | Function | Direction |
|------|----------|-----------|
| GP0 | I2C SDA (OLED) | Bidir |
| GP1 | I2C SCL (OLED) | Output |
| GP2 | Trigger Output | Output |
| GP3 | Return Input | Input |
| GP4 | Button | Input (pull-up) |
## Code Structure
```
firmware/
├── CMakeLists.txt # Build configuration
├── include/
│ ├── config.h # Pin definitions, timing constants
│ ├── display.h # OLED display interface
│ ├── latency.h # Measurement functions
│ └── button.h # Button handling
└── src/
├── main.c # Application entry, state machine
├── display.c # SSD1306 OLED driver
├── latency.c # Timer-based latency measurement
└── button.c # Debounced button with long press
```
## Measurement Accuracy
- Timer resolution: ~1µs (RP2040 @ 125MHz)
- Display resolution: 0.01ms (10µs)
- Polling loop: ~1-2µs per iteration
- Practical accuracy: ±10µs
The main latency contributors are:
1. Input buffer propagation delay (~10ns, negligible)
2. GPIO read latency (~10ns, negligible)
3. Polling loop timing (~1-2µs)
## Future Improvements
- [ ] Configurable trigger pulse width
- [ ] Sample rate display (in samples @ 44.1/48/96kHz)
- [ ] CV output proportional to latency
- [ ] Threshold adjustment via long button hold
- [ ] EEPROM settings storage