当前位置: 首页 > news >正文

声卡修复:SOF 固件缺失 (Arrow Lake)

故障现象
系统设置中无声音输出/输入设备
PulseAudio 只有 auto_null(伪输出),没有真实声卡
aplay -l / arecord -l 报 “找不到音效卡”
cat /proc/asound/cards 显示 “— no soundcards —”
排查过程

  1. 确认硬件存在
    $ lspci -nn | grep audio
    00:1f.3 Multimedia audio controller [0401]: Intel Corporation Device [8086:7728]
    设备存在,PCI ID 为 8086:7728。

  2. 检查驱动状态
    $ lsmod | grep sof
    snd_sof_pci_intel_mtl 40960 0 # SOF 驱动已加载但 0 用户
    snd_sof_intel_hda_generic 36864 1

    snd_hda_intel 65536 0 # HDA 传统驱动也是 0 用户
    SOF 和 HDA 驱动都已加载但未绑定到设备。

  3. 查看内核日志(关键!)
    $ sudo dmesg | grep -i sof
    输出关键信息:

sof-audio-pci-intel-mtl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if 0x040100
sof-audio-pci-intel-mtl 0000:00:1f.3: DMICs detected in NHLT tables: 2
sof-audio-pci-intel-mtl 0000:00:1f.3: SOF firmware and/or topology file not found.
sof-audio-pci-intel-mtl 0000:00:1f.3: Supported default profiles
sof-audio-pci-intel-mtl 0000:00:1f.3: - ipc type 1 (Requested):
sof-audio-pci-intel-mtl 0000:00:1f.3: Firmware file: intel/sof-ipc4/arl/sof-arl.ri
sof-audio-pci-intel-mtl 0000:00:1f.3: Topology file: intel/sof-ace-tplg/sof-hda-generic-2ch.tplg
sof-audio-pci-intel-mtl 0000:00:1f.3: Check if you have ‘sof-firmware’ package installed.
sof-audio-pci-intel-mtl 0000:00:1f.3: error: sof_probe_work failed err: -2
驱动需要 intel/sof-ipc4/arl/sof-arl.ri — Arrow Lake 固件
需要 intel/sof-ace-tplg/sof-hda-generic-2ch.tplg — 拓扑文件
error: -2 = ENOENT(文件不存在)
4. 确认本地固件缺失
$ ls /lib/firmware/intel/sof-ipc4/arl/
ls: 无法访问 ‘/lib/firmware/intel/sof-ipc4/arl/’: 没有那个文件或目录

系统只有 MTL (Meteor Lake) 固件,缺 ARL (Arrow Lake)

$ ls /lib/firmware/intel/sof-ipc4/
mtl # 只有 Meteor Lake

$ apt-cache policy firmware-sof-signed
已安装:2.0-1ubuntu4.7 # 2022 年版本,不包含 Arrow Lake
5. 成功方案
ARL 固件实际上就是 MTL 固件 — Arrow Lake 和 Meteor Lake 共享相同的 DSP 固件二进制。新版 firmware-sof-signed 包的做法是创建符号链接。

创建 ARL 固件目录

sudo mkdir -p /lib/firmware/intel/sof-ipc4/arl/{intel-signed,community}

创建符号链接到已有 MTL 固件

sudo ln -sf intel-signed/sof-arl.ri /lib/firmware/intel/sof-ipc4/arl/sof-arl.ri
sudo ln -sf …/…/mtl/intel-signed/sof-mtl.ri /lib/firmware/intel/sof-ipc4/arl/intel-signed/sof-arl.ri
sudo ln -sf …/…/mtl/community/sof-mtl.ri /lib/firmware/intel/sof-ipc4/arl/community/sof-arl.ri

重载 SOF 驱动

sudo modprobe -r snd_sof_pci_intel_mtl snd_sof_intel_hda_common snd_sof
sudo modprobe snd_sof_pci_intel_mtl
修复验证
$ cat /proc/asound/cards
0 [sofhdadsp ]: sof-hda-dsp - sof-hda-dsp
LENOVO-83ND-XiaoXinPro16cIAH10-LNVNB161216

$ aplay -l
card 0: sofhdadsp [sof-hda-dsp], device 0: HDA Analog () [] # 扬声器
card 0: sofhdadsp [sof-hda-dsp], device 3: HDMI1 (
) [] # HDMI
card 0: sofhdadsp [sof-hda-dsp], device 4: HDMI2 () []
card 0: sofhdadsp [sof-hda-dsp], device 5: HDMI3 (
) []
card 0: sofhdadsp [sof-hda-dsp], device 31: Deepbuffer HDA Analog (*) []

$ arecord -l
card 0: sofhdadsp [sof-hda-dsp], device 0: HDA Analog () [] # 模拟麦克风
card 0: sofhdadsp [sof-hda-dsp], device 6: DMIC Raw (
) [] # 数字麦克风
dmesg 确认:

sof-audio-pci-intel-mtl: Loaded firmware library: ADSPFW, version: 2.8.1.1
sof-audio-pci-intel-mtl: Booted firmware version: 2.8.1.1
snd_hda_codec_conexant ehdaudio0D0: SN6140: BIOS auto-probing.
snd_hda_codec_conexant ehdaudio0D0: autoconfig for SN6140:
line_outs=1 (0x17/…) type:speaker
hp_outs=1 (0x16/…) # 耳机
inputs: Mic=0x19 # 麦克风
声卡根因分析
层级 问题
直接原因 /lib/firmware/intel/sof-ipc4/arl/ 目录不存在
为什么其他 Meteor Lake 机器没问题 MTL 固件存在,且 ARL 固件就是 MTL 的符号链接
根本原因 内核 6.12 的 SOF 驱动根据 PCI ID (8086:7728) 判定为 Arrow Lake 平台,需要 arl/ 路径的固件;Ubuntu 22.04 的 firmware-sof-signed (v2.0) 不包含 Arrow Lake 目录
SOF 固件目录结构
/lib/firmware/intel/sof-ipc4/
├── mtl/ # Meteor Lake(已有)
│ ├── sof-mtl.ri → intel-signed/sof-mtl.ri
│ ├── intel-signed/
│ │ └── sof-mtl.ri # 实际固件二进制 (879KB)
│ └── community/
│ └── sof-mtl.ri

└── arl/ # Arrow Lake(需创建)
├── sof-arl.ri → intel-signed/sof-arl.ri
├── intel-signed/
│ └── sof-arl.ri → …/…/mtl/intel-signed/sof-mtl.ri # → MTL 固件
└── community/
└── sof-arl.ri → …/…/mtl/community/sof-mtl.ri
关键经验
通用原则
升级主线内核后必须同步升级固件:新驱动需要新版固件,旧发行版的固件包往往不匹配

Ubuntu 22.04 的固件包普遍偏旧(均为 2022 年版本):

linux-firmware → 20220329
firmware-sof-signed → 2.0
对于 2023+ 的 Intel 硬件平台,需要从 Debian testing 获取更新固件

Debian 的拆分固件包是更好的下载源:

firmware-iwlwifi(23MB)vs 整个 linux-firmware repo(>1GB)
firmware-sof-signed(2MB)包含完整的 SOF 固件
排查固件问题的标准流程:

1. 确认硬件

lspci -nn | grep -iE “network|audio”

2. 看内核日志(关键!)

sudo dmesg | grep -iE “iwlwifi|sof|firmware”

3. 对比固件文件

ls /lib/firmware/iwlwifi-* # WiFi
ls /lib/firmware/intel/sof-ipc4/*/ # 声卡

4. 检查固件包版本

apt-cache policy linux-firmware firmware-sof-signed
WiFi 专项
RF 变体必须完全匹配:fm-c0/gf-a0/hr-b0 是不同射频硬件,固件不通用
WiFi 固件命名格式:iwlwifi-{平台}-{芯片步进}-{RF类型}-{RF步进}-{API版本}.ucode
声卡专项
SOF 固件跨平台共享:Arrow Lake 和 Meteor Lake 使用相同 DSP 固件,通过符号链接即可
声卡固件路径:intel/sof-ipc4/{平台}/sof-{平台}.ri + 拓扑文件 intel/sof-ace-tplg/sof-hda-generic-*.tplg
一键修复脚本
见 fix-firmware.sh,可自动诊断并修复常见的固件缺失问题。

chmod +x fix-firmware.sh
sudo ./fix-firmware.sh
脚本内容:

#!/bin/bash
#=============================================================================

fix-firmware.sh — 一键诊断并修复 Intel WiFi / 声卡固件缺失问题

适用场景:

- Ubuntu/Debian 系统,自行升级了主线内核

- WiFi 消失(iwlwifi 固件缺失)

- 声卡消失(SOF 固件缺失)

用法:

sudo ./fix-firmware.sh # 自动诊断并修复

sudo ./fix-firmware.sh --dry-run # 仅诊断,不修复

sudo ./fix-firmware.sh --wifi # 仅修复 WiFi

sudo ./fix-firmware.sh --audio # 仅修复声卡

#=============================================================================

set -euo pipefail

— 颜色定义 —

RED=‘\033[0;31m’
GREEN=‘\033[0;32m’
YELLOW=‘\033[1;33m’
BLUE=‘\033[0;34m’
CYAN=‘\033[0;36m’
BOLD=‘\033[1m’
NC=‘\033[0m’ # No Color

— 配置 —

DEBIAN_MIRROR=“DEBIANMIRROR:−https://mirrors.tuna.tsinghua.edu.cn/debian"FIRMWAREIWLWIFIURL="{DEBIAN_MIRROR:-https://mirrors.tuna.tsinghua.edu.cn/debian}" FIRMWARE_IWLWIFI_URL="DEBIANMIRROR:https://mirrors.tuna.tsinghua.edu.cn/debian"FIRMWAREIWLWIFIURL="{DEBIAN_MIRROR}/pool/non-free-firmware/f/firmware-nonfree/firmware-iwlwifi_20260519-1_all.deb”
FIRMWARE_SOF_URL="DEBIANMIRROR/pool/non−free−firmware/f/firmware−sof/firmware−sof−signed2025.12.2−2all.deb"TEMPDIR={DEBIAN_MIRROR}/pool/non-free-firmware/f/firmware-sof/firmware-sof-signed_2025.12.2-2_all.deb" TEMP_DIR=DEBIANMIRROR/pool/nonfreefirmware/f/firmwaresof/firmwaresofsigned2025.12.22all.deb"TEMPDIR=(mktemp -d)
DRY_RUN=false
FIX_WIFI=true
FIX_AUDIO=true
FOUND_ISSUES=0
FIXED_ISSUES=0

— 辅助函数 —

cleanup() {
rm -rf “$TEMP_DIR”
}
trap cleanup EXIT

log_info() { echo -e “BLUE[INFO]{BLUE}[INFO]BLUE[INFO]{NC}KaTeX parse error: Expected 'EOF', got '}' at position 5: *"; }̲ log_ok() …{GREEN}[OK]${NC}KaTeX parse error: Expected 'EOF', got '}' at position 5: *"; }̲ log_warn() …{YELLOW}[WARN]${NC}KaTeX parse error: Expected 'EOF', got '}' at position 5: *"; }̲ log_error() …{RED}[ERROR]${NC}KaTeX parse error: Expected 'EOF', got '}' at position 5: *"; }̲ log_section() …{BOLD}${CYAN}═══∗═══* ══════{NC}”; }

check_root() {
if [ “$(id -u)” -ne 0 ]; then
log_error “请用 sudo 运行此脚本:sudo $0 $*”
exit 1
fi
}

need_download() {
# 检查系统是否能联网下载
if ! command -v curl &>/dev/null && ! command -v wget &>/dev/null; then
log_warn “未找到 curl 或 wget,将跳过需要下载的操作”
return 1
fi
return 0
}

download() {
local url=“$1” output=“KaTeX parse error: Expected 'EOF', got '&' at position 27: …ommand -v curl &̲>/dev/null; the…url” -o “KaTeX parse error: Expected 'EOF', got '&' at position 34: …ommand -v wget &̲>/dev/null; the…url” -O “$output”
fi
}

— WiFi 诊断与修复 —

diagnose_wifi() {
log_section “WiFi 固件诊断”

# 1. 找出所有 Intel WiFi PCI 设备 local wifi_devs wifi_devs=$(lspci -nn 2>/dev/null | grep -i "Network controller.*Intel" || true) if [ -z "$wifi_devs" ]; then log_info "未检测到 Intel WiFi 硬件,跳过 WiFi 诊断" return 0 fi echo "$wifi_devs" | while read -r line; do echo -e " ${line}" done # 2. 快速检查:WiFi 接口是否已存在? # 如果接口已经正常工作,就不需要看历史 dmesg(旧日志可能误报) if ip link show 2>/dev/null | grep -q "wl"; then local wl_iface wl_iface=$(ip link show 2>/dev/null | grep -oP 'wl[^ :]+' | head -1) log_ok "WiFi 接口已存在 ($wl_iface),驱动工作正常,跳过" return 0 fi # 3. WiFi 接口不存在 → 检查 iwlwifi 模块 if ! lsmod | grep -q iwlwifi; then log_info "iwlwifi 模块未加载,尝试加载..." modprobe iwlwifi 2>/dev/null || true sleep 2 fi # 4. 从 dmesg 提取缺失的固件文件名 # 用本次启动后产生的日志(取最后出现的错误,避免旧日志干扰) local missing_fw missing_fw=$(dmesg 2>/dev/null | grep "iwlwifi.*Direct firmware load for.*failed" \ | grep -oP 'iwlwifi-[^ ]+\.ucode' | sort -u || true) if [ -z "$missing_fw" ]; then # 也检查 /var/log/syslog,只取最近的启动日志 missing_fw=$(grep "iwlwifi.*Direct firmware load for.*failed" /var/log/syslog 2>/dev/null \ | grep "$(uname -r)" | grep -oP 'iwlwifi-[^ ]+\.ucode' | sort -u || true) fi # 5. 对于找到的 "缺失" 固件,检查是否已经存在且只是 API 版本不同 # 例如 dmesg 说缺 -93,但 -96 已存在且驱动支持 if [ -n "$missing_fw" ]; then local actually_missing="" for fw in $missing_fw; do # 检查这个文件是否现在已存在 if [ -f "/lib/firmware/$fw" ]; then log_info "固件 $fw 已存在(可能已修复),跳过" continue fi # 检查同前缀的其他版本是否存在 local fw_prefix fw_count fw_prefix=$(echo "$fw" | sed -E 's/-[0-9]+\.ucode$//') fw_count=$(ls "/lib/firmware/${fw_prefix}-"*.ucode 2>/dev/null | wc -l) if [ "$fw_count" -gt 0 ]; then log_info "固件 $fw 不存在,但有同系列其他版本,跳过" continue fi actually_missing="$actually_missing $fw" done missing_fw=$(echo "$actually_missing" | xargs -r echo) fi # 6. 也检查 "no suitable firmware found" 错误 if [ -z "$missing_fw" ]; then local no_suitable no_suitable=$(dmesg 2>/dev/null | grep "iwlwifi.*no suitable firmware" | tail -1 || true) if [ -n "$no_suitable" ]; then log_warn "iwlwifi 报告 'no suitable firmware found'" local max_ver max_ver=$(dmesg 2>/dev/null | grep "maximum version supported:" | grep -oP 'iwlwifi-[^ ]+' | head -1 || true) if [ -n "$max_ver" ] && [ ! -f "/lib/firmware/$max_ver" ]; then missing_fw="$max_ver" log_info "需要固件: $missing_fw" fi fi fi if [ -z "$missing_fw" ]; then # 可能是模块重载后已修复,再检查一次 WiFi 接口 if ip link show 2>/dev/null | grep -q "wl"; then log_ok "WiFi 接口已出现,修复成功" return 0 fi log_info "未检测到明确的 WiFi 固件缺失,跳过" return 0 fi echo -e "\n${YELLOW}检测到缺失的 WiFi 固件文件:${NC}" for fw in $missing_fw; do echo -e " ${RED}✗${NC} $fw" done FOUND_ISSUES=$((FOUND_ISSUES + 1)) # 提取固件前缀(去除版本号),确定需要的 pnvm 文件 local fw_prefix fw_prefix=$(echo "$missing_fw" | head -1 | sed -E 's/-[0-9]+\.ucode$//') echo -e "\n${YELLOW}将修复以下固件文件:${NC}" echo " → ${fw_prefix}-*.ucode 系列" echo " → ${fw_prefix}.pnvm (射频配置)" if [ "$DRY_RUN" = true ]; then log_info "[DRY RUN] 将下载 firmware-iwlwifi 包并安装缺失的固件" return 0 fi if ! need_download; then log_warn "无法联网下载,跳过 WiFi 固件修复" return 1 fi # 下载 firmware-iwlwifi Debian 包 log_info "下载 firmware-iwlwifi 包 (~23MB)..." local deb_file="$TEMP_DIR/firmware-iwlwifi.deb" if ! download "$FIRMWARE_IWLWIFI_URL" "$deb_file"; then log_error "下载失败,请检查网络连接" return 1 fi log_ok "下载完成 ($(du -h "$deb_file" | cut -f1))" # 提取并安装固件 log_info "提取并安装固件..." local extract_dir="$TEMP_DIR/iwlwifi-extract" mkdir -p "$extract_dir" dpkg-deb -x "$deb_file" "$extract_dir" 2>/dev/null # 查找需要的固件文件 local installed=0 local fw_base fw_base=$(echo "$missing_fw" | head -1) # 先查找所有匹配的 .ucode 文件 local found_files found_files=$(find "$extract_dir" -name "${fw_prefix}*.ucode" -o -name "${fw_prefix}*.pnvm" 2>/dev/null || true) if [ -z "$found_files" ]; then log_warn "下载的包中未找到 ${fw_prefix}* 固件,尝试查找最接近的版本..." # 显示包里有什么 find "$extract_dir" -name "iwlwifi-*${fw_prefix##iwlwifi-}*" 2>/dev/null | head -10 || true log_info "可用的 hr/gf/fm 变体:" find "$extract_dir" -name "iwlwifi-*" 2>/dev/null | grep -oP 'iwlwifi-[^-]+-[^-]+-[^-]+-[^-]+' | sort -u | head -20 fi for fw_file in $found_files; do local fname fname=$(basename "$fw_file") cp "$fw_file" "/lib/firmware/$fname" log_ok "已安装: $fname" installed=$((installed + 1)) done if [ "$installed" -eq 0 ]; then log_error "未找到匹配的固件文件" log_info "请手动从以下地址下载:" log_info " https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git" return 1 fi # 重载 iwlwifi 模块 log_info "重载 iwlwifi 模块..." modprobe -r iwlwifi 2>/dev/null || true sleep 1 modprobe iwlwifi 2>/dev/null || true sleep 3 # 验证 if ip link show 2>/dev/null | grep -q "wl"; then local wl_iface wl_iface=$(ip link show 2>/dev/null | grep -oP 'wl[^ :]+' | head -1) log_ok "WiFi 接口已出现: $wl_iface" FIXED_ISSUES=$((FIXED_ISSUES + 1)) else log_warn "WiFi 接口尚未出现,可能需要重启" log_info "新的固件文件已安装:" ls -la /lib/firmware/${fw_prefix}* 2>/dev/null dmesg 2>/dev/null | grep -i iwl | tail -5 fi

}

— 声卡诊断与修复 —

diagnose_audio() {
log_section “声卡固件诊断”

# 1. 找出 Intel 音频 PCI 设备 local audio_devs audio_devs=$(lspci -nn 2>/dev/null | grep -i "Audio.*Intel" || true) if [ -z "$audio_devs" ]; then log_info "未检测到 Intel 音频硬件,跳过声卡诊断" return 0 fi echo "$audio_devs" | while read -r line; do echo -e " ${line}" done # 2. 检查声卡是否存在 if [ -f /proc/asound/cards ] && grep -q "\[.*\]" /proc/asound/cards 2>/dev/null; then local card_count card_count=$(grep -c "\[" /proc/asound/cards 2>/dev/null || echo 0) log_ok "已有 $card_count 张声卡在工作,跳过" cat /proc/asound/cards 2>/dev/null | while read -r l; do echo " $l"; done return 0 fi # 3. 从 dmesg 检查 SOF 固件错误 local sof_err sof_err=$(dmesg 2>/dev/null | grep "SOF firmware and/or topology file not found" || true) if [ -z "$sof_err" ]; then sof_err=$(grep "SOF firmware and/or topology file not found" /var/log/syslog 2>/dev/null || true) fi if [ -z "$sof_err" ]; then log_info "未检测到 SOF 固件错误,跳过" return 0 fi FOUND_ISSUES=$((FOUND_ISSUES + 1)) # 4. 提取需要的固件路径 local fw_path tplg_path fw_dir ipc_type fw_path=$(dmesg 2>/dev/null | grep "Firmware file:" | grep sof | tail -1 | grep -oP 'intel/[^ ]+' || true) tplg_path=$(dmesg 2>/dev/null | grep "Topology file:" | grep sof | tail -1 | grep -oP 'intel/[^ ]+' || true) if [ -z "$fw_path" ]; then fw_path=$(grep "Firmware file:" /var/log/syslog 2>/dev/null | grep sof | tail -1 | grep -oP 'intel/[^ ]+' || true) fi echo -e "\n${YELLOW}检测到 SOF 固件缺失:${NC}" echo -e " ${RED}✗${NC} Firmware: $fw_path" echo -e " ${YELLOW}?${NC} Topology: $tplg_path" if [ -z "$fw_path" ]; then log_warn "无法从 dmesg 提取固件路径" return 1 fi # 5. 分析固件路径,确定需要的平台 # 典型路径: intel/sof-ipc4/arl/sof-arl.ri local platform fw_dir_name fw_file_name
http://www.jsqmd.com/news/1239784/

相关文章:

  • Q-Learning算法在无人机三维避障中的实践与优化
  • C++内存管理实战:智能指针与垃圾回收库的选择与应用
  • 课题申报高分攻略,让评审一眼相中你的论证活页
  • Unity UI点击检测:EventSystem与射线检测的5个实战技巧
  • LDO基础知识分享(3)——电源抑制比PSRR
  • 亲身探访郑州浪琴**售后服务中心|服务热线及全部维修地址(2026年7月最新) - 浪琴服务中心
  • 车用油复合剂哪家靠谱
  • 终极解决:Photon光影包屏幕空间反射异常问题完整指南
  • 西门子PLC定时器时间基准参数详解:从原理到实战避坑指南
  • HTTP状态码详解:从基础概念到实践应用
  • 全球湿化学灭火系统市场2026年预计达8.23亿美元,中国占比将达65%
  • Spring Boot多数据源配置实战:Druid+MyBatisPlus整合指南
  • 强化学习核心概念与工程实践全解析
  • 2026年7月最新美度厦门宝龙一城维修保养服务电话 - 亨得利钟表维修中心
  • 鸿蒙性能优化全维度实战(启动速度 + 内存治理 + 帧率稳定 + 包体积瘦身)
  • 真力时中国**售后服务中心|全新热线和维修门店地址**信息公示(2026年7月最新) - 亨得利官方服务中心
  • 《飞天大王》预告片技术解析:从拍摄到编码的全流程实践
  • VC++与OpenGL实现贝塞尔曲线:从数学原理到交互式图形编程
  • 2026年7月最新郑州浪琴**售后服务网点地址及客服电话一览 - 浪琴官方售后服务中心
  • Unity光照贴图异常排查与修复:从UV重叠到参数优化的完整指南
  • 快充线选购指南:如何识别优质100W快充线材
  • 2026高危制造行业专用!TOP4员工心理风险测评适配一线岗位安全筛查
  • 2026年7月亲身到店体验深圳亨得利**名表服务中心|全部网点地址与售后热线 - 亨得利官方博客
  • AI录音修音工具有哪些?新手实测好用的录音修音一体工具
  • 深度学习对抗训练与扰动增强技术详解
  • AI视频生成可控性实战:Higgsfield Seedance2.0 4K工作流详解
  • KMP 全栈开发:从 Android 到 AI Agent,一套代码构建下一代智能应用
  • 直方图均衡化:原理、实现与应用场景详解
  • AI时代普通人如何抓住人机协作机会:从工作流重构到创业思维
  • 2026年7月最新江诗丹顿重庆国金中心维修保养服务电话 - 江诗丹顿官方服务中心