Разбираться будем на примере отсутствия звука при установке Xubuntu на ноутбук HUAWEI MateBook D 15. Модель, которую не назовешь очень свежей. Тем не менее, при установке последнего, на момент написания статьи, LTS релиза 22.04 (Jammy Jellyfish), звука не было.
Поиск по марке ноутбука не дал ничего определенного, кроме советов задать dsp_driver=1 (т.е. legacy) для модуля snd-intel-dspcfg, что в данном случае не поможет. Поэтому, перезагрузив ноутбук в Windows (она предустановлена), где звук есть, я посмотрел устройство для вывода звука:
ESAuDriver Device
ACPI\VEN_ESSX&DEV_8336&SUBSYS_152D125F
ACPI\ESSX8336\1
Тем, кто без Windows уже снес, посмотреть устройства ACPI в Linux можно так:
find /sys/bus/acpi/devices/*/modalias -exec cat '{}' \;
Если в списке есть строка "acpi:ESSX8336:ESSX8336:", то это наш случай. Встречаем, Everest-Semi Low Power Audio CODEC ES8336.
На случай, если моя статья уже устарела, посмотрим есть ли поддержка этого кодека в ядре, которым вы сейчас пользуетесь:
cat /boot/config-`uname -r` |grep 8336
если поддержка есть, то увидим:
CONFIG_SND_SOC_INTEL_SOF_ES8336_MACH=m
Нет? Для этого я и пишу это руководство. Не все знают, что разработчики Ubuntu предлагают возможность установки так называемого HWE ядра (еще есть и xserver). Специально для тех, кто использует достаточно новое оборудование, поддержки которого в текущем ядре LTS релиза нет. Его портируют «обратно» (backports) из более свежих короткоживущих релизов. На момент написания статьи в дистрибутиве используется ядро версии 5.15.0, а установить можно HWE версии 6.2.0 и вероятность того, что с ним оборудование заработает заметно выше.
1. Устанавливаем HWE ядро
sudo apt install linux-image-generic-hwe-22.04
"04" замените на свою версию дистрибутива, если отличается. После установки, при использовании grub в качестве загрузчика, hwe ядро станет текущим, а в «Advanced options» будет добавлено используемое сейчас. Так что особо переживать нечего. Проверим? Да, да, перезагружаем компьютер.
И.. Звука все еще нет.
Проверяем, есть ли поддержка кодека в ядре (см. выше). Есть. Тогда Смотрим логи:
journalctl --boot=0 |egrep -i 'sof-|audio|8336'
kernel: sof-audio-pci-intel-cnl 0000:00:1f.3: error: tplg request firmware intel/sof-tplg/sof-cml-es8336-dmic2ch-ssp0.tplg failed err: -2
kernel: sof-audio-pci-intel-cnl 0000:00:1f.3: you may need to download the firmware from https://github.com/thesofproject/sof-bin/
kernel: sof-audio-pci-intel-cnl 0000:00:1f.3: error: failed to load DSP topology -2
2. Загружаем недостающее sound open firmware (sof)
"You may need to download the firmware". Ядро поставили новое, а firmware где? Но нет смысла качать с github не подписанное. Мы возьмем его там же где и ядро. Со свежего не LTS релиза. https://packages.ubuntu.com/search?keywords=firmware-sof-signed и берем самое свежее. Скачали?
mkdir /tmp/sof-signed
dpkg -X /куда/скачали/firmware-sof-signed_2.2.6-1_all.deb /tmp/sof-signed/
sudo cp -v /tmp/sof-signed/lib/firmware/intel/sof-tplg/sof-tgl-es8336* /lib/firmware/intel/sof-tplg/
rm -rf /tmp/sof-signed
Еще раз перезагрузка. И? Звука так и нет. В логах уже все нормально, firmware загружено. Что еще не так? Миксер!
3. Настраиваем аудио
Посмотрим аудиоустройства:
aplay -l
карта 0: sofessx8336 [sof-essx8336], устройство 0: ES8336 (*) []
есть в списке, отлично.
Глушим все, кроме ALSA (advanced linux sound architecture).
pulseaudio -k
systemctl --user stop pipewire.socket && systemctl --user stop pipewire.service
systemctl --user stop pulseaudio.socket && systemctl --user stop pulseaudio.service
Запустим проверку звука
speaker-test -c2
Если ничего не слышно
alsamixer
и меняем настройки пока не появится звук в speaker-test.
Как же ласкает слух этот «розовый шум»!
Когда все заработало, сохраняемся.
sudo alsactl store
Опять перезагрузка? И это на Linux? Не хотите, тогда:
systemctl --user start pulseaudio.service && systemctl --user start pulseaudio.socket
systemctl --user start pipewire.service && systemctl --user start pipewire.socket
Проверяем конфигурацию и настройки миксера в pavucontrol
.
Из замеченных проблем — не всегда есть звук после выхода из ждущего/спящего режима. Лечится в alsamixer переключением Speaker (mute/unmute). Конечно можно добавить скрипт при выходе из ждущего/спящего режима. Но это уже сделаю и выложу если будет интерес к статье.