MOTU PCI-324 / PCI-424,
rebuilt for Linux.
A from-scratch ALSA kernel driver, a CueMix-style control app (CLI + GTK), and a clean-room reverse-engineering of a sound card the vendor never documented.
curl -fsSL https://raw.githubusercontent.com/devfrp/Linux-motu-pci-424/main/get.sh | sh
An undocumented card, brought up in the open
The PCI-324/424 is a host card for MOTU AudioWire interfaces — the 2408, 24I/O, 828, HD192, 896HD and friends. There is no vendor documentation, so the register map and transport are recovered from the Windows driver — the static reverse-engineering is complete, and empirical validation on a real card is the remaining step. The PCI, DMA, IRQ and ALSA plumbing is already in place; everything still uncertain is confined to two files, so confirmed facts land in exactly one place.
What ships
A driver, two control apps, and an installer that works on any distribution.
ALSA module
Clean three-layer split, fully devm/pcim-managed, DKMS-packaged so it rebuilds itself across kernel upgrades.
motu424-ctl
The Linux CueMix FX over alsa-lib: clock source, sample rate, per-input trim/pad/phase, and the input×bus monitor matrix.
motu424-gui
A GTK4 CueMix-style mixing console: channel strips with faders, peak-hold meters and rotary pan pots, scenes, snapshots, undo — previewable card-less with --demo.
Any distro
Detects pacman/apt/dnf/zypper/apk/xbps, pulls deps, installs via DKMS. Non-interactive under curl | sh.
Clean-room RE
A capstone cross-referencer and a C++ vtable resolver; every recovered fact is written down with its evidence.
Facts-only, GPL
Only offsets, formats and sequences enter the GPL-2.0 sources. Vendor binaries are never redistributed.
What the reverse-engineering pinned
Recovered statically from the vendor Windows driver — no card required — with
objdump, a capstone cross-referencer and the rz-ghidra
decompiler for the C++ object graph. Static RE is now complete.
| Finding | Value | State |
|---|---|---|
| Windowed MMIO address space routed by the 0x01800000 tag bit — 8 MB window A / 4 MB window B | & 0xff800000 | CONFIRMED |
| Interrupt path ISR is a C++ virtual slot; pending = port bit 1 | ack ← 0x10 @ +0x88 | CONFIRMED |
| Transport PIO into a card aperture, hardware dmaPoint + software ring — not host bus-master DMA | WRITE_REGISTER_BUFFER | CONFIRMED |
| Audio bring-up handshake the card publishes its runtime audio base after a port strobe, read back by polling | strobe port+4 ← 2 | CONFIRMED |
| Breakout channel map counts are a runtime descriptor blob from the attached interface — not a static table | runtime descriptor | CONFIRMED |
| Device object model audio object is a global singleton; windowed-MMIO manager + DMA common-buffer sub-objects | A @ 0x61f50 | CONFIRMED |
| FPGA firmware classic card self-configures from onboard flash — no host upload | no request_firmware | CONFIRMED |
| CueMix mixer sink coefficients flushed by dirty range to a card-reported base | [dev + 0x9c] | CONFIRMED |
| Rate parameter & clock-source select interface/card-bound — the last values need a card to observe | base + 0x64 | CARD |
Signal path
The PCI and PCM layers stay hardware-agnostic; every register offset and encoding lives only in the bottom node.
motu424_hw_irq_ack()motu424_hw_* callsInstall
The one-liner fetches the sources and runs the installer — dependencies, DKMS module, tools. Add --gui for the graphical panel.
One line
# deps + DKMS module + tools + load curl -fsSL https://raw.githubusercontent.com/devfrp/Linux-motu-pci-424/main/get.sh | sh # with the GTK GUI curl -fsSL …/get.sh | sh -s -- --gui
Clone & build
git clone https://github.com/devfrp/Linux-motu-pci-424 cd motu-pci-424 ./install.sh # or: make && make load motu424-ctl # CueMix status (CLI) motu424-gui # graphical panel
Where it stands
Static reverse-engineering is complete — every code-only finding is recovered. The rest is empirical and needs a real card on the bench.
- DONEFramework & tooling · PCI/DMA/IRQ/ALSA scaffolding, cross-distro installer, CLI + GUI, RE toolchain.
- DONERegister, IRQ & transport model · windowed MMIO, IRQ ack, PIO aperture ring, the full IOCTL interface, the firmware verdict.
- DONEDevice model & bring-up path · the whole device-extension struct, the audio object & sub-objects, and the handshake that publishes the runtime audio base.
- PARTIALClock & rate encoding · rate families, enable and increment recovered; clock-source select and the rate parameter are interface-bound — their values need a card.
- NEEDS CARDBring-up & validation · dump the runtime addresses, playback/capture at every rate, the CueMix mixer, soak tests — the last mile to sound.