Document neon audio fixes (avs driver, topologies, cros UCM)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
c7231628b8
commit
f55d51fccc
@@ -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`
|
||||
(<https://github.com/WeirdTreeThing/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
|
||||
<https://github.com/WeirdTreeThing/alsa-ucm-conf-cros> 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.
|
||||
Reference in New Issue
Block a user