Platform index / Digital mixing console
Allen & Heath Avantis
The structural inverse of the SQ: the control plane is a commodity x86 Linux box, and the mixing runs on a subordinate Xilinx FPGA the host programs at boot. OS updates carry integrity checksums but no signature.
The load-bearing finding. The V2.01 package is an x86-64 Qt application on a Tiny-Core-derived Linux, and the whole update validates on MD5 alone. The mix FPGA's bitstream is not a file in it because it is inside the Console binary — six bitstreams are, and each names its own device: two XC7K160T for the mix engine, two XC7Z010 for FX, and two Artix-7 device images for the remote I/O.
Verdict. The structural inverse of the SQ. Where the SQ hid a whole console inside one bare-metal Zynq, the Avantis splits the job: an open, SSH-able x86 Linux control plane over a Xilinx FPGA audio engine it programs at boot. Nothing on the control side is protected — updates ride on MD5, SSH is a USB flag away — yet the parts worth having, the FPGA engine and the host↔PL interface, are exactly the parts the update package does not hand you.
Method
Static analysis of the V2.01 update package: the unstripped Updater, the stripped Console Qt binary and the plaintext OS scripts (detect_sbc.sh, set_ssh.sh, PartitionCheck.sh). No hardware inspected. The show-file findings are a separate basis: the factory shows shipped inside Avantis Director V2.01, plus controlled diffs taken by running Director offline with no console attached and changing exactly one patch point between two saves.
Artifacts examined
AllenHeath-Avantis-V2.01.zip— Console V2.01 (rev 97241), OS V1.32; covers both Avantis and Avantis SoloUpdater— 1 MB x86-64, unstripped: the update and checksum logic in the cleardCorefocal64.gz(~22 MB Tiny-Core-derived x86 rootfs) andvmlinuzfocal64(5.4.3 kernel)- The factory shows shipped inside Avantis Director V2.01 — vendor content in a licensed install, reproducible from any install and not redistributed
- Two shows saved from Director offline, identical but for one input patched from SLink to a local socket — the diff that located the patch table
No manufacturer firmware, binaries or documentation are redistributed here. Artifacts are referenced by name and version only. See the method and legal statement for the basis on which this analysis was performed and the boundaries it observes.
Hardware architecture
| Item | Finding | Confidence |
|---|---|---|
| Control plane | An x86-64 single-board computer running Linux — the UI/control host only, not the mixer. detect_sbc.sh enumerates the shipped boards by CPU: Kontron D3543/D3544 (Gemini Lake J5005/J4005), Advantech AIMB-218 (Elkhart Lake N6211/J6413) and Kontron K3921-H (Alder Lake-N i3-N305 / N97). The console has migrated SBCs across its production life | Verified |
| Audio engine | A Xilinx FPGA, not the x86 host. Console carries the host-side stack — FPGALoader, FPGAMixer, FPGAInputProc, FPGAMixProc, MixRackFPGAProgramming — with Xilinx boot strings (FSBL, Bitstream not loaded into PL, BITSTREAM_DOWNLOAD_FAIL): a part in A&H's XCVI lineage that the host programs at boot | Verified |
| Mix FPGA — a Kintex-7 pair | Two × XC7K160T (0x0364C093), 16,560 configured frames each. This is the largest fabric on any Allen & Heath platform documented here and it is a genuine surprise: the SQ mixes in the PL of a single XC7Z020, and the Avantis — the bigger console — does it in a pair of Kintex-7 parts with no PS at all, driven by the x86 host over /dev/ah_audio rather than by an on-chip ARM. Read from the IDCODE configuration packet of each bitstream | Verified |
| FX DSP | A separate FDSP/UltraFX effects FPGA driven over an SPI→AXI bridge (FDSPFxV2SPIToAXIController, FDSP Ultra Fx FPGA loader and Programming failed). The two FX images are for XC7Z010 (0x03722093) — Zynq-7010, so "FX FPGA" is really a pair of small Zynq SoCs, which is what the Qu's Both FX Zynqs booted says out loud | Verified |
| Remote-I/O device images | Two Artix-7 bitstreams — XC7A15T (0x0362E093) and XC7A35T (0x0362D093) — are the device-side images the console pushes down the SLink/gigaACE port to its I/O boxes, not fabric inside the console. The XC7A15T one is byte-identical to the image in the SQ-5 and Qu-7 packages; see the SQ-5 entry | Verified |
| Host ↔ engine interface | Custom kernel character devices — /dev/ah_audio, /dev/ah_surface, /dev/ah_motor_left, /dev/ah_motor_right — form the x86↔FPGA/surface boundary; the Avantis analogue of the SQ's on-chip PS↔PL AXI bridge | Verified |
| Surface / I/O controllers | Motor-fader, user-control and main-board MCUs (with bootloaders) plus IP port-controllers (IP1/IP4/IP6/IP8/IPG8, all V1.44) are flashed from the host | Verified |
| Storage / boot | Ordinary PC storage: GRUB on /dev/sda, with root, a ~20 GB audio-files partition and swap created at runtime (PartitionCheck.sh). No A/B multiboot — a normal Linux boot, unlike the SQ's Zynq multiboot banks | Verified |
Software architecture
| Item | Finding | Confidence |
|---|---|---|
| Operating system | A Tiny-Core-derived x86 Linux: a dCorefocal64.gz root filesystem, a 5.4.3 kernel (vmlinuzfocal64, -tinycore64) and Ubuntu-18.04-era userland .debs, with X11 and a Qt compositor | Verified |
| Host application | Console — 41 MB stripped Qt5 PIE (links libQt5Core/libQt5Network) — plus Compositor and an 81 MB TouchScreen binary. Updater ships unstripped | Verified |
| Variants | One package serves both the Avantis surface and the rackmount Avantis Solo (Firmware/Solo/…, Solo OS v1.13); this build is Console V2.01 rev 97241, OS V1.32 | Verified |
| Debug SSH | sshd is off unless a flag file appears: set_ssh.sh starts it at boot if ~/.ah_debug/.ah_ssh exists or an ah_debug/ah_ssh file sits in the root of an inserted USB stick — an intentional, trivially-triggered service door | Verified |
| A show is a gzipped tar, not a blob | Show/ holds 34 subsystem folders, and the small top-level files in them are plain text — a version integer on the first line, then one value per line. Scenes/ holds one nested tarball per scene, each split into a StageBox half (the I/O rack: preamps and processing, ~320 KB) and a Surface half (strip layout, banks, soft controls, ~16 KB). For a console whose OS updates carry no signature, the show format is correspondingly open | Verified |
| The scene blob labels itself | The scene payload is binary and about 37 % printable, but every parameter block carries a human-readable label naming both the block type and the object it belongs to — Parametric EQ, Stereo Group Channel 01 Left, Compressor side chain source, Mono Group Channel 02, StageBox Port B Analogue Input, Slot 1, Number 07. One factory show yields a whole block inventory by counting them: 256 stagebox analogue inputs, 144 parametric EQs, 128 compressors, 99 GX analogue inputs, and object classes from input channels down to the main pair. The socket blocks name a slot and a number, which is the same device/index split a patch model needs | Verified |
| Scene 65535 is the live state | Numbered scenes were byte-identical across a change that visibly altered the console's configuration; the only file that moved was scene 0xFFFF. That is where the working state lives, and it is where anything reading a show has to look | Verified |
| The input patch is not scene-recallable | It exists only in the live-state scene — recalling scene 3 does not repatch the console. So a patch list is a property of the show rather than of whichever scene happens to be current, which is the same shape the SQ has and worth expecting across the range | Verified |
| The Channel Mapper table | Sixteen bytes past a block labelled Channel Mapper, the input patch is three bytes per input channel: a source/device type byte, then a 0-based connector index as a big-endian 16-bit value. The default state maps every channel 1:1 to SLink, and moving one channel to a local socket changed its type byte alone — index already 0 — while the stride and 0-based numbering were confirmed by the untouched entries running consecutively either side of it. Only two type codes are confirmed; the I/O Port and USB tabs in Director each have their own and they are unknown | Verified |
Update path & security model
| Item | Finding | Confidence |
|---|---|---|
| Update validation | Integrity, not authenticity. Updater checks the package against Firmware.md5 (VerifyChecksum, CheckChecksum, CorruptFirmware) and sends header/data checksums to each MCU it flashes. No signature, RSA, GPG or public key anywhere in the update path — the SQ's 'CRC only, no signing' posture, here as MD5 | Verified |
| FPGA boot | The audio FPGA's boot flow references Xilinx RSA authentication that appears switched off (RSA_SUPPORT_NOT_ENABLED_FAIL) — matching the SQ's unsigned, analysable bitstream. What, if anything, is actually signed is not established | Inferred |
| Add-on entitlement | A paid add-on system (marketed as the 'dPack') exists; its mechanism is out of scope and was not analysed — see the methodology page | Verified |
These rows describe how a platform validates a firmware image, because that is a structural fact about its architecture. They are not a vulnerability disclosure and no exploit, bypass or circumvention technique is published here. Licensing and entitlement mechanisms are out of scope throughout — seescope boundaries.
What is programmable
- 1Interoperability, not rehosting
Avantis speaks published control (MIDI/TCP and the SQ/dLive-family remote protocols) and takes gigaACE/Dante/Waves I/O. Almost everything that motivates looking at the firmware is better served here and needs no reverse engineering.
- 2The host ↔ FPGA interface — the one thing worth mapping
/dev/ah_audioand the FPGA programming / SPI→AXI path expose the stock engine to userspace. Documenting that boundary turns the black box into commandable hardware — the Avantis version of the SQ's undocumented AXI register map, and reachable from an SSH shell without writing to flash. - 3The audio / FX FPGA bitstreams
Zynq-class and, on the RSA evidence, unsigned — so analysable in principle. In practice a very large project, downstream of understanding the register interface, and not step one.
Traps
Mistakes this analysis actually made, or came close to making. They are recorded because each one produces a plausible-looking wrong answer rather than an obvious failure.
- The x86 host is not the mixer. The audio path is a Xilinx FPGA the host merely programs and drives over
/dev/ah_audio; reversing the Qt binary tells you about control and UI, not DSP — the same split as the SQ, where the bitstream was the mixer. Firmware.md5is an integrity manifest, not a signature. A repacked update with a recomputed MD5 would pass — do not read the checksum step as authentication.- Crypto strings in
Consoleare not proof of a cryptographic validator or a signed update — several digests belong to libarchive and the RSA strings sit in the FPGA boot flow. Attribute crypto only after tracing the specific path. - Comparing two shows with a recursive file diff. Every scene tarball differs on gzip framing alone, so
diff -rqreports that everything changed and hides the one file that actually did. Compare by content, not by archive bytes. - Expecting the factory shows to answer it. All of them are likely to use the default patch — the difference between an FOH show and a Monitors show is mix structure, not patching — so no amount of diffing them locates a patch table. One controlled diff with a single patch point moved settled in minutes what six shipped shows could not settle at all.
Open questions
- The layout of the SPI→AXI register interface. The parts are now named and the bitstreams located, but the whole audio path still sits behind
/dev/ah_audioand no register is documented — the same black box the SQ-5 has, and the one thing worth reversing here. - Which of the six embedded bitstreams drives which board. The device each is for is stated by its own IDCODE packet; the board each lands on is an inference from size and from the FX and SLink strings around it. Nothing was disassembled and no bitstream was traced to a
FPGALoadercall site. - Whether the
RSA_*strings mean anything is enabled, or are dormant Xilinx boot-flow capability. - The remaining source type codes. Two of at least five are confirmed — the I/O Port 1, I/O Port 2 and USB sources each have their own tab in Director and their own code, and guessing them would produce a patch list that is confident and wrong.
- What the byte before each block label is. It looks like a block size rather than a string length — a graphic EQ carries a larger value than a mix delay, which is consistent with more parameters — but it has not been confirmed, and it is what a structural walk of the scene would need.
- Whether the dLive format is byte-identical. dLive Director ships the same structure and the two are very likely one format; no byte-for-byte comparison has been made.
Status of this entry. A written teardown exists and its claims carry evidence citations. Nothing on this page has been verified against physical hardware — no unit of this platform has been opened, connected to or modified.