Firmware

lxr-eurorack-app

Rising57/100

LXR eurorack module codebase

lxr-eurorack-app is custom firmware for the Erica Synths LXR Drum Module, by @erica-synths. Open source under GPL-3.0, 20 stars on GitHub.

forErica Synths LXR Drum Module·by@erica-synths

Unclaimed. Is this yours? Sign in with GitHub as @erica-synths to claim it.

Downloads
0
Stars
20
Forks
6
Commits
2
Last commit
Get the source

No release files yet. Build from source.

GPL-3.0· erica-synths/lxr-eurorack-app·downloads come from the creator’s GitHub releases

2
Commits
0
Releases
2 commits and 0 releases in the last year
Activity · last 12 months

LXR V2 Eurorack firmware (STM32F765VG)

Firmware for the LXR V2 Eurorack drum module: an STM32F765 (Cortex-M7, 216 MHz) running the drum voices, FX bus, trigger and CV inputs, MIDI, SD-card kit storage and the LCD/encoder UI.

Licence and trademarks: the firmware source code is free software under the GNU GPL version 3 (LICENSE). The names "Erica Synths" and "LXR" and the LXR hardware are the property of Erica Synths and are not covered by this licence. Building and installing your own firmware is at your own risk: Erica Synths provides no support for self-built or modified firmware. See NOTICE.md.

Building

You need CMake 3.21+, Ninja, the Arm GNU Toolchain (arm-none-eabi-gcc, tested with 14.3.rel1) and Python 3, all on PATH.

  • macOS: brew install cmake ninja && brew install --cask gcc-arm-embedded. Don't use brew install arm-none-eabi-gcc: it lacks the C library and the build fails with it.
  • Windows: winget install Kitware.CMake Ninja-build.Ninja Python.Python.3.12 plus Arm's installer (tick "Add path to environment variable").
  • Linux: sudo apt install cmake ninja-build python3 plus Arm's toolchain, with its bin folder on PATH.

Then, in this folder:

cmake --preset release
cmake --build --preset release

The update file is written to build/release/LXRE_V2_V<version>.img. The version is set by project(VERSION ...) in CMakeLists.txt and shown on the start-up screen.

OptionEffect
cmake --preset debugDebug build (-O3 -g3, DEBUG defined) in build/debug/
-DARM_TOOLCHAIN_DIR=<bin folder>Use a toolchain that isn't on PATH
-DLXR_ITCM_OPT=-O2Lower optimisation for code in the 16 KB ITCM, if a change or compiler makes it overflow at -O3
-DLXR_GENERATE_LISTING=ONAlso write a disassembly listing (.list)

To start from scratch (e.g. after switching compilers), delete the build/ folder.

Installing the update

  1. Copy LXRE_V2_V<version>.img to the top folder of a FAT32 SD card and delete any older LXRE*.img files from it.
  2. With the module powered off, insert the card, hold down the encoder button and power on. Keep holding until "LXR Updater" appears.
  3. Wait for "Update OK!". The module restarts with the new firmware.

The updater (bootloader) is never changed by an update, so a failed or interrupted update can simply be repeated. The module's updater only looks for files named LXRE*.img, so desktop LXR update files on the same card are ignored.

Programming with a debug probe

Not needed for updates. With an ST-Link and OpenOCD on PATH:

cmake --build --preset release --target flash        # firmware only, bootloader untouched

For blank devices, configure with the Eurorack bootloader, either from source (-DLXR_BOOTLOADER_DIR=path/to/LXR_V2_STM32F765_Bootloader, built with LXR_BOOTLOADER_EURORACK) or prebuilt (-DLXR_BOOTLOADER_HEX=path/to/LXR_V2_Eurorack_Bootloader.hex). The build then also writes LXRE_V2_V<version>_full.hex/.bin (whole flash from 0x08000000) and enables the flash_full target.

Warning: flash_full overwrites the bootloader and asks you to type yes first (or set LXR_CONFIRM_BOOTLOADER_OVERWRITE=yes). If it is interrupted, the module can only be recovered with a debug probe.

Memory map

RegionAddressSizeContents
FLASH0x0800000032 KBBootloader
FLASH0x08008000992 KBThis firmware
ITCM0x0000000016 KBIN_ITCM_RAM DSP code
DTCM0x20000000128 KBINDTCM/INDTCMZ data, DMA buffers, stack
RAM0x20020000384 KB.data, .bss, heap

Source layout

Originally an STM32CubeIDE project; the CubeMX .ioc was removed because regenerating code from it overwrites application code. Pins, clocks and peripherals live in Core/Inc/main.h, Core/Src/main.c and Core/Src/stm32f7xx_hal_msp.c. Source files are listed explicitly in the CMakeLists.txt files (Core/ is split into lxr_platform, lxr_io, lxr_ui, lxr_preset, lxr_dsp, lxr_engine and lxr_midi); add new files there.

Licence

Copyright (C) 2012-2026 Erica Synths. Licensed under the GNU GPL version 3 (GPL-3.0-only) with the additional permission and terms in NOTICE.md: modified firmware must be marked as modified and must not be presented as official Erica Synths firmware. The trademarks and the hardware are not licensed. Third-party components (STMicroelectronics, Arm, ChaN FatFs) keep their own licences, see NOTICE.md.