From f55d51fccc935dfec2201ba94b2a352822a04f1b Mon Sep 17 00:00:00 2001 From: ergosteur <1992147+ergosteur@users.noreply.github.com> Date: Sun, 27 Sep 2026 13:05:00 -0400 Subject: [PATCH] Document neon audio fixes (avs driver, topologies, cros UCM) Co-Authored-By: Claude Opus 5.5 --- AUDIO.md | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLAUDE.md | 11 +++++ 2 files changed, 155 insertions(+) create mode 100644 AUDIO.md diff --git a/AUDIO.md b/AUDIO.md new file mode 100644 index 0000000..6a6ee75 --- /dev/null +++ b/AUDIO.md @@ -0,0 +1,144 @@ +# Audio on hp-chell (KDE neon) + +Working state (verified 2026-09-27): speakers, headset jack and internal +mic work under neon. PipeWire/WirePlumber shows `Built-in Audio Speaker` +and `Built-in Audio Internal Microphone`, and the headset appears when +something is plugged in. None of this works out of the box. It took the +fixes below, all applied **2026-03-05**, reconstructed on 2026-09-27 +from `~/.bash_history` and file timestamps. + +## Hardware + +HP Chromebook 13 G1 ("chell", Skylake). The audio DSP is Intel Skylake +SST, driven by the kernel's **`avs`** driver (`snd_soc_avs`), with three +board-specific machine drivers. Each one is its own ALSA card: + +| Card | Driver | What | +|---|---|---| +| `avs_ssm4567` | `snd_soc_avs_ssm4567` | speakers: 2x ADI SSM4567 amps | +| `avs_nau8825` | `snd_soc_avs_nau8825` | headset jack: Nuvoton NAU88L25 codec | +| `avs_dmic` | `snd_soc_avs_dmic` | internal digital mic | +| `avs_probe_mb` | `snd_soc_avs_probe` | DSP debug probe, not a real device | + +The cards report the long name `Google-Chell-1.0`. + +Speaker safety: the upstream script disables speakers on Chromebooks +with a **MAX98357A** amp (no volume limiter, so it can blow the +speakers). Chell uses **SSM4567**, not MAX98357A, so that doesn't apply +and the speakers are enabled. + +## The fixes + +### 1. WeirdTreeThing's `chromebook-linux-audio` script + +Checkout: `~/github/chromebook-linux-audio` +(, shallow +clone at `8c7e15e`, 2026-02-16). Run as `sudo ./setup-audio -b chell`. +`-b` is the branch of the UCM repo to clone, and there's no `chell` +branch; a plain `./setup-audio` is what's intended. For a Skylake board +(`skl`/`kbl`/`apl`) it: + +- **Switches the DSP driver to `avs`**: + `/etc/modprobe.d/snd-avs.conf` + ``` + options snd-intel-dspcfg dsp_driver=4 + options snd-soc-avs ignore_fw_version=1 + options snd-soc-avs obsolete_card_names=1 + ``` + `dsp_driver=4` selects `avs`. Without it `snd-intel-dspcfg` picks + legacy HDA or SOF, and neither works on chell. `obsolete_card_names=1` + gives the `avs_ssm4567`-style card names that the UCM profiles below + match on. +- **Installs Chromebook UCM profiles**: clones + and copies + `ucm2/` into `/usr/share/alsa/ucm2/`, and `overrides/` into + `/usr/share/alsa/ucm2/conf.d/`. The ones this board uses are + `conf.d/avs_ssm4567/`, `conf.d/avs_nau8825/` and `conf.d/avs_dmic/` + (`avs_ssm4567/HiFi.conf` sets amp boost, the master volumes at 219, + and `Left/Right Speaker Switch`). +- **Adds WirePlumber headroom**: + `/etc/wireplumber/wireplumber.conf.d/51-increase-headroom.conf` sets + `api.alsa.headroom = 2048` on all `alsa_output.*` nodes (the script + says it fixes instability and crashes on these DSPs). +- Runs `alsactl init`. + +### 2. Duplicate modprobe option (harmless) + +`/etc/modprobe.d/inteldsp.conf`: `options snd-intel-dspcfg dsp_driver=4`, +written by hand a few minutes before the script ran. It duplicates the +first line of `snd-avs.conf`. You can delete it. + +### 3. AVS topology files, downloaded by hand + +The `avs` driver needs a per-board **topology** blob for each machine +driver. Ubuntu's `linux-firmware-intel-misc` ships only the base DSP +firmware (`/lib/firmware/intel/avs/skl/dsp_basefw.bin.zst` plus one +module), not the topologies, and the script doesn't provide them +either. They were fetched straight from upstream linux-firmware: + +``` +cd /lib/firmware/intel/avs/ +BASE=https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/intel/avs +sudo wget $BASE/ssm4567-tplg.bin $BASE/nau8825-tplg.bin $BASE/dmic-tplg.bin +``` + +Installed: `ssm4567-tplg.bin`, `nau8825-tplg.bin` and `dmic-tplg.bin` +(not owned by any package, so apt won't update or remove them). The +history also shows `hda-80862809-tplg.bin` and +`hda-8086-generic-tplg.bin` being fetched, but they aren't present now +and aren't needed; chell has no HDA codec. + +### 4. UCM `Syntax 7` → `Syntax 6` + +The cros UCM repo writes its files as `Syntax 7`, but neon's alsa-lib +(`libasound2t64` 1.2.11) only understands up to `Syntax 6`, so +`alsaucm -c avs_ssm4567 list _verbs` failed and PipeWire fell back to +raw, unusable profiles. Fixed with: + +``` +sudo find /usr/share/alsa/ucm2/ -type f -exec sed -i 's/Syntax 7/Syntax 6/g' {} + +``` + +As of 2026-09-27 there are 0 `Syntax 7` files and `dpkg -V +alsa-ucm-conf` reports no modified package files, so the sed only hit +the cros files. **If the cros UCM is ever re-copied** (re-running +`setup-audio`, or `cp -r alsa-ucm-conf-cros/ucm2/*`), re-run this sed, +unless alsa-lib has been upgraded to a version that accepts Syntax 7. + +Then `systemctl --user restart wireplumber pipewire pipewire-pulse` +(or reboot). + +## Reapplying on a fresh neon install + +``` +# 1. script: avs driver, cros UCM, wireplumber headroom +git clone --depth 1 https://github.com/WeirdTreeThing/chromebook-linux-audio +cd chromebook-linux-audio && sudo ./setup-audio + +# 2. topologies (not in Ubuntu's linux-firmware packages) +BASE=https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/intel/avs +cd /lib/firmware/intel/avs && sudo wget $BASE/ssm4567-tplg.bin $BASE/nau8825-tplg.bin $BASE/dmic-tplg.bin + +# 3. UCM syntax downgrade for alsa-lib 1.2.11 +sudo find /usr/share/alsa/ucm2/ -type f -exec sed -i 's/Syntax 7/Syntax 6/g' {} + + +sudo reboot +``` + +Checks: `aplay -l` should list `avs_ssm4567` / `avs_nau8825`, +`alsaucm -c avs_ssm4567 list _verbs` should print `HiFi`, and +`wpctl status` should show the Speaker sink and the Internal Microphone +source. + +## FydeOS on the eMMC has no audio + +Seen 2026-09-27, not investigated yet. The neon fixes don't carry over +directly. FydeOS is ChromiumOS: a read-only verified rootfs, CRAS instead +of PipeWire, and its own kernel and UCM. Things to check from a FydeOS +shell (developer mode, or `crosh` → `shell`): +- which DSP driver loaded (`lsmod | grep -E 'avs|sof|skl'`, `dmesg`) + and whether `aplay -l` shows any cards; +- whether `/lib/firmware/intel/avs/*-tplg.bin` exist there; +- whether its UCM has `avs_ssm4567` etc. (`/usr/share/alsa/ucm2`). +The same three pieces (driver selection, topologies, UCM) are the likely +gaps. diff --git a/CLAUDE.md b/CLAUDE.md index 6d44a87..0000f76 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -137,3 +137,14 @@ Quick reference: directly. - ChromeOS updates re-add a UEFI entry and put it first in `BootOrder`; see `CHROMEOS-FLEX.md`. + +## Audio (neon) + +Speakers, headset jack and mic work under neon thanks to custom fixes +applied 2026-03-05, documented in **`AUDIO.md`**: WeirdTreeThing's +`chromebook-linux-audio` script (`avs` driver via +`/etc/modprobe.d/snd-avs.conf`, cros UCM profiles, WirePlumber +headroom), avs topology blobs hand-downloaded from upstream +linux-firmware into `/lib/firmware/intel/avs/`, and a `Syntax 7` → +`Syntax 6` sed over the UCM files for neon's alsa-lib 1.2.11. FydeOS on +the eMMC has no audio yet (not investigated).