AudioWire host card · out-of-tree Linux driver

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
00

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.

01

What ships

A driver, two control apps, and an installer that works on any distribution.

Kernel

ALSA module

Clean three-layer split, fully devm/pcim-managed, DKMS-packaged so it rebuilds itself across kernel upgrades.

Control · CLI

motu424-ctl

The Linux CueMix FX over alsa-lib: clock source, sample rate, per-input trim/pad/phase, and the input×bus monitor matrix.

Control · GUI

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.

Install

Any distro

Detects pacman/apt/dnf/zypper/apk/xbps, pulls deps, installs via DKMS. Non-interactive under curl | sh.

Toolkit

Clean-room RE

A capstone cross-referencer and a C++ vtable resolver; every recovered fact is written down with its evidence.

License

Facts-only, GPL

Only offsets, formats and sequences enter the GPL-2.0 sources. Vendor binaries are never redistributed.

02

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.

FindingValueState
Windowed MMIO address space
routed by the 0x01800000 tag bit — 8 MB window A / 4 MB window B
& 0xff800000CONFIRMED
Interrupt path
ISR is a C++ virtual slot; pending = port bit 1
ack ← 0x10 @ +0x88CONFIRMED
Transport
PIO into a card aperture, hardware dmaPoint + software ring — not host bus-master DMA
WRITE_REGISTER_BUFFERCONFIRMED
Audio bring-up handshake
the card publishes its runtime audio base after a port strobe, read back by polling
strobe port+4 ← 2CONFIRMED
Breakout channel map
counts are a runtime descriptor blob from the attached interface — not a static table
runtime descriptorCONFIRMED
Device object model
audio object is a global singleton; windowed-MMIO manager + DMA common-buffer sub-objects
A @ 0x61f50CONFIRMED
FPGA firmware
classic card self-configures from onboard flash — no host upload
no request_firmwareCONFIRMED
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 + 0x64CARD
03

Signal path

The PCI and PCM layers stay hardware-agnostic; every register offset and encoding lives only in the bottom node.

motu424_main.cPCI attach · BAR map · IRQ vector · ALSA card create — the interrupt calls motu424_hw_irq_ack()
motu424_pcm.cALSA PCM ops — translates open/prepare/trigger/pointer into motu424_hw_* calls
motu424_hw.cregisters · clock/rate · DMA ring · IRQ ack — the hardware truth lives here
04

Install

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
05

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.

  • DONE
    Framework & tooling · PCI/DMA/IRQ/ALSA scaffolding, cross-distro installer, CLI + GUI, RE toolchain.
  • DONE
    Register, IRQ & transport model · windowed MMIO, IRQ ack, PIO aperture ring, the full IOCTL interface, the firmware verdict.
  • DONE
    Device model & bring-up path · the whole device-extension struct, the audio object & sub-objects, and the handshake that publishes the runtime audio base.
  • PARTIAL
    Clock & rate encoding · rate families, enable and increment recovered; clock-source select and the rate parameter are interface-bound — their values need a card.
  • NEEDS CARD
    Bring-up & validation · dump the runtime addresses, playback/capture at every rate, the CueMix mixer, soak tests — the last mile to sound.