docs: Kaisa 音频分析与 Linux/Windows 操作说明

- 新增 ANALYSIS_Audio.md:三平台对比、HDMI/SOF 分析、第八节「原来有声现在无声」、5.15 Live 说明
- 新增 OPERATION_Force_Intel_Signed_Firmware.md:community 固件路径与回退清单
- 新增 OPERATION_Windows_Audio.md:CoolStar/ALC5682 与 3.5mm 排查步骤
- README:链接上述文档
- 采集:audio_chromeos_scripts_on_linux_jack-Kaisa 样本
- 删除已弃用的 collect_shell_audio.sh

Made-with: Cursor
This commit is contained in:
jack
2026-03-31 08:55:50 +08:00
parent b8c016f7e9
commit b5193a7f77
6 changed files with 6645 additions and 367 deletions

View File

@@ -45,3 +45,5 @@
- 目标平台Chromebox10 代 IntelCoreboot 刷机后)
- 目标系统Linux / Windows
- Windows 3.5mm / CoolStar 驱动排查步骤:[audio_topology/OPERATION_Windows_Audio.md](audio_topology/OPERATION_Windows_Audio.md)
- Linux SOF / intel-signed 固件尝试:[audio_topology/OPERATION_Force_Intel_Signed_Firmware.md](audio_topology/OPERATION_Force_Intel_Signed_Firmware.md)

View File

@@ -0,0 +1,250 @@
# Linux / ChromeOS / Windows 音频拓扑对比分析
基于 `collected/` 目录下采集数据的对比,分析 Chromebox 10 代Kaisa在三平台上的音频差异。
> **说明**Linux 采集时 HDMI1 已插入显示器。dmesg 中 -5 错误出现在 pcm3HDMI2、pcm4HDMI3pcm2HDMI1是否有相同问题需结合实际接法确认。
---
## 〇、三平台问题概况
| 平台 | HDMI 声音 | 3.5mm 耳机声音 | 插入/拔出提示 |
|------|-----------|----------------|---------------|
| **ChromeOS** | ✅ 有 | ✅ 有 | ✅ 有 |
| **Linux** | HDMI1 已插pcm2/3/4 对应关系待确认 | ✅ 有 | ✅ 有 |
| **Windows** | ✅ 有 | ❌ 无 | ❌ 无 |
**观察**Windows 与 Linux 表现相反——Windows 有 HDMI 无 3.5mmLinux 有 3.5mm、HDMI 待测。硬件/音频路径相同差异在驱动Windows 下 3.5mmRT5682 codec需单独排查。
---
## 一、硬件与拓扑一致性
| 项目 | Linux (Ubuntu) | ChromeOS | Windows | 结论 |
|------|----------------|----------|---------|------|
| 机型 | Google-Kaisa-rev4 | Google-Kaisa-rev4 | Kaisa | 三平台一致 |
| 声卡/驱动 | sof-rt5682 (SOF) | sof-rt5682 (SOF) | Realtek ALC5682 + Intel 显示器音频 | 同硬件,驱动不同 |
| Codec | Intel Kabylake HDMI | Intel Kabylake HDMI | Intel HDMI (8086/280B) + Realtek ALC5682 | 同硬件 |
| PCM/端点 | HDMI1/2/3, Port1, DMIC | HDMI1/2/3, Port1, DMIC | ASUS MG279 (Intel 显示器音频) 等 | 拓扑等效 |
| 显示器 | ASUS MG279 (DisplayPort) | ASUS MG279 | ASUS MG279 | 三平台一致 |
| ELD采集时 | LinuxHDMI1 已插 | eld#2.3 有效 | AudioEndpoint 检测到显示器 | Linux/ChromeOS 一致Windows 等效 |
| NHLT | 未找到 | 未找到 | Coreboot 下未提供 | **均缺失**Coreboot 下常见)|
**结论**硬件、拓扑在三平台一致差异在驱动。NHLT 缺失并非 Linux 特有ChromeOS / Windows 也无 NHLT。
---
## 二、关键差异:三平台 HDMI / 3.5mm 表现
### ChromeOSHDMI、3.5mm 均正常)
```
cras_test_client --dump_server_info:
Output Devices:
ID 10 LastOpen: OK sof-rt5682: :0,3
Output Nodes:
(0b85518e) 10:0 Plugged: yes HDMI 2ch ASUS MG279
```
- **pcm=3HDMI2**LastOpen **OK**Plugged **yes**
- 音频走 CRAS → ALSA → SOFHDMI 与 3.5mm 播放均正常
### Linux采集时 HDMI1 已插入)
```
dmesg:
sof-audio-pci-intel-cnl: sof_ipc3_pcm_hw_params: pcm3 (HDMI2), dir 0: STREAM_PCM_PARAMS ipc failed for stream_tag 1
sof-audio-pci-intel-cnl: ASoC error (-5): at snd_soc_pcm_component_hw_params()
HDMI2: ASoC error (-5): at dpcm_fe_dai_hw_params()
```
- **pcm3HDMI2**、**pcm4HDMI3**`STREAM_PCM_PARAMS` IPC 失败,错误码 **-5 (EIO)**
- **pcm2HDMI1**采集时已插入显示器amixer 显示 `HDMI/DP,pcm=2 Jack` 为 on
- **3.5mm**:正常,有插入/拔出提示
- **说明**dmesg 中 -5 错误集中在 pcm3/pcm4若显示器接在 HDMI1 则 pcm2 可能有不同表现,需结合实际接法复测
### WindowsHDMI 正常3.5mm 无声)
```
AudioEndpoint: ASUS MG279 (英特尔(R) 显示器音频) | Status: OK
Media devices: Realtek ALC5682 I2S Audio | Status: OK
英特尔(R) 显示器音频 | Status: OK
```
- **HDMI**Intel 显示器音频驱动正常ASUS MG279 可输出声音
- **3.5mm**Realtek ALC5682 驱动已加载Status OK但实际无声音、无插入/拔出提示
---
## 三、差异对比表
| 项目 | Linux (Ubuntu) | ChromeOS | Windows |
|------|----------------|----------|---------|
| **内核/系统** | 6.17.0-14-generic | 5.15.186-24551 (ChromeOS 定制) | Windows 10 LTSC 19044 |
| **SOF 固件** | `intel/sof/community/sof-cml.ri` | `intel/sof/intel-signed/sof-cml.ri` | CoolStar csaudiointcsof.sys报错/ Intel IntcDAud.sys |
| **拓扑文件** | `sof-tplg/sof-cml-rt5682.tplg.zst` | `sof-cml-rt5682.tplg` (35711 字节) | 无Windows 音频端点)|
| **音频服务** | PulseAudio / PipeWire | CRAS (Chrome OS Audio Server) | Windows Audio (WASAPI) |
| **HDMI 行为** | STREAM_PCM_PARAMS 失败 (-5) | 正常播放 | 正常播放 |
| **3.5mm 行为** | 正常 | 正常 | 无声、无插入/拔出提示 |
---
## 四、同脚本采集对比ChromeOS vs Linux
基于 `audio_chromeos_scripts_on_chromeos_localhost_*``audio_chromeos_scripts_on_linux_jack-Kaisa_*`(相同脚本、相同硬件 Kaisa、同一显示器 ASUS MG279的对比
| 项目 | ChromeOS (localhost) | Linux (jack-Kaisa) |
|------|---------------------|-------------------|
| **内核** | 5.15.186-24551 | 6.17.0-14-generic |
| **固件实际加载** | `sof-cml.ri` → intel-signed | `intel/sof/community/sof-cml.ri` |
| **拓扑** | sof-cml-rt5682.tplg (35711 字节) | sof-cml-rt5682.tplg.zst |
| **ELD** | eld#2.3 有效ASUS MG279 | eld#2.3 有效ASUS MG279 |
| **HDMI pcm3** | cras: LastOpen **OK**Plugged **yes** | dmesg: STREAM_PCM_PARAMS **-5** |
**结论**在同一硬件、同一显示器、ELD 均有效的前提下ChromeOS 上 pcm3 可正常打开Linux 上则失败。差异集中在:
1. **固件**Linux 6.17 加载 **community** 固件ChromeOS 使用 **intel-signed**Linux 的 `/lib/firmware` 中虽有 intel-signed但内核选择了 community 路径)
2. **内核**5.15 与 6.17 的 SOF 驱动在 HDMI 路径上可能不同
3. **拓扑**ChromeOS 为未压缩 .tplgLinux 为 .tplg.zst来源与版本可能不同
**建议尝试**:强制 Linux 使用 intel-signed 固件(见 `OPERATION_Force_Intel_Signed_Firmware.md`)。**实测**:替换 `community/sof-cnl.ri.zst` 并重启后 HDMI 仍失败,且可能影响 3.5mm 插拔检测;详见第五节、第八节。
---
## 五、若 HDMI 仍失败,可能原因(按优先级分析)
> 以下分析仅在「HDMI 已连接状态下 Linux 仍无声音」时适用。
### 1. 拓扑(拓扑是相同硬件,应等效)
| 项目 | ChromeOS | Linux | 结论 |
|------|----------|-------|------|
| 拓扑文件 | sof-cml-rt5682.tplg (35711 字节) | sof-cml-rt5682.tplg.zst → 解压 ~35 KB | **等效** |
| 存放路径 | intel/sof/ | intel/sof-tplg/ | 仅路径不同 |
| PCM/端点 | HDMI1/2/3, Port1, DMIC | 同左 | 一致 |
**结论**同一硬件Kaisa拓扑结构应相同。解压后大小接近~35 KB格式差异.tplg vs .tplg.zst不会导致 IPC 失败。**拓扑本身可基本排除**。
### 2. 固件(已测试,非主因)
- 已用 intel-signed 替换 community 固件并重启HDMI 仍失败
- 说明固件版本**不是**主要差异,问题更可能在驱动或驱动与固件的交互
### 3. 内核 / 驱动(当前重点怀疑)
| 项目 | ChromeOS | Linux |
|------|----------|-------|
| 内核 | 5.15.186-24551 | 6.17.0-14-generic |
| SOF 驱动 | 5.15 系列 | 6.17 系列 |
**已知情况**
- 5.16+ 有 SOF IPC 回归报告suspend/resume 后音频恢复失败)
- 6.16+ 有 Intel Alder Lake SOF 相关异常报告
- 错误 -5 (EIO) 常见于 DAI 在 hw_params 前未正确初始化
**结论**6.17 相比 5.15 的 SOF 驱动改动较大HDMI 相关的 DAI 初始化或 IPC 逻辑变化更可能导致 `STREAM_PCM_PARAMS ipc failed (-5)`。**建议尝试 5.15 LTS 内核验证**。
### 4. 音频栈差异
- CRAS 为 ChromeOS 定制,可能有针对 Chromebox 的 workaround
- 通用 LinuxPulseAudio/PipeWire → ALSA → SOF无此类定制
---
## 六、建议排查与尝试
### 1. 内核版本(优先):用 Live CD 测试
Ubuntu 22.04 LTS 默认使用 5.15 内核,与 ChromeOS 一致。可借助 Live CD 在不安装系统的情况下验证 5.15 上 HDMI 是否正常。
1. **下载 Ubuntu 22.04 LTS 的 Live ISO**
- 官网 <https://releases.ubuntu.com/22.04/> 提供的是 **22.04.5**(较新,可能已带 HWE 6.x 内核)
- 若需 5.15 内核,请从 **旧版镜像** 下载 22.04.1 或 22.04.2
- <https://old-releases.ubuntu.com/releases/22.04/> 或 <https://old-releases.ubuntu.com/releases/22.04.2/>
- 如:`ubuntu-22.04.2-desktop-amd64.iso`22.04.2 时仍多为 5.15
2. **制作 Live USB**:用 Ventoy、Rufus 或 `dd` 写入 U 盘,从 U 盘启动。
3. **启动后选择「尝试 Ubuntu」**,不安装。
4. **在 Live 环境中验证 HDMI 音频**
```bash
uname -r # 一般显示 5.15.0-xx-generic
speaker-test -D plughw:0,3 -c 2 -l 1 # 测试 HDMI
```
5. **说明**22.04.3、22.04.4、22.04.5 等较新 ISO 可能已带 HWE6.x内核为稳妥起见优先用 old-releases 的 22.04.1 或 22.04.2 镜像;若本地只有 22.04.5,可在启动菜单中尝试选择带 `generic` 的内核,或在安装后禁用 HWE 再切回 5.15。
### 2. 向 SOF 社区反馈
- 提供 dmesg 中的 `STREAM_PCM_PARAMS ipc failed (-5)` 日志
- 说明Chromebox Kaisa、Coreboot、community 固件、ChromeOS 固件可工作的对比情况
- 参考:[thesofproject/sof](https://github.com/thesofproject/sof)、[alsa-devel](https://mailman.alsa-project.org/hyperkitty/list/alsa-devel@alsa-project.org/)
### 3. NHLT 的优先级
- 当前ChromeOS 和 Linux 均无 NHLTChromeOS 正常,说明 **NHLT 缺失不是 HDMI 失败的根本原因**
- 若在 Coreboot 中补齐 NHLT 后仍有问题,应继续从固件/内核/拓扑方向排查
---
## 七、结论概要
| 结论 | Linux | ChromeOS | Windows |
|------|-------|----------|---------|
| 硬件一致 | sof-rt5682, 同左 | sof-rt5682, 同左 | Realtek ALC5682 + Intel 显示器音频,同硬件 |
| 采集条件 | HDMI1 已插入 | HDMI1 已插入 | HDMI 已连接 |
| 问题表现 | HDMIpcm3/4 -5 错误3.5mm 正常 | 均正常 | HDMI 正常3.5mm 无声、无插入提示 |
| 下一步 | 确认 pcm 与物理端口对应,复测 HDMI若「原来有声现在无声」见第八节 | — | [OPERATION_Windows_Audio.md](OPERATION_Windows_Audio.md)README W1W4 |
---
## 八、Linux「原来有声音、现在没有」原因分析
排查前先**分清是哪种输出没声**HDMI / 显示器、3.5mm 耳机,或两者皆无。不同情况对应不同原因。
### 1. 分辩:哪种声音没了
| 情况 | 与本项目采集结论的关系 | 最可能原因 |
|------|------------------------|------------|
| **HDMI / 显示器** | 已记录 Linux 上 pcm3/pcm4 出现 `STREAM_PCM_PARAMS ipc failed (-5)`ChromeOS 正常 | **多为 6.x 内核下 SOF + HDMI 路径长期问题**,不是典型「硬件突然损坏」;若曾以为 HDMI 有过声,可能是接在 **pcm2HDMI1**、或与其它系统/设备混淆 |
| **3.5mm / 模拟** | 采集时 Linux 上 **3.5mm 正常**`speaker-test` 在 **plughw:0,2** 可播(设备号以本机 `aplay -L` 为准) | 若现在连 3.5mm 也无声:优先查 **固件是否仍为实验替换版**、**默认输出是否指到打不开的 HDMI**、**PipeWire/Pulse 静音或服务异常** |
### 2. 若没声的是 HDMI
- **机制**:错误在 DSP 与固件之间的 IPC`hw_params`),属 **驱动/内核与 HDMI PCM 的兼容性**。
- **固件**:已用 intel-signed 覆盖 `community/sof-cnl.ri.zst` 并重启后 HDMI 仍失败,说明 **单靠换该固件不能恢复 HDMI**。
- **下一步**:第六节 **5.15 Live CD** 对比验证,判断是否为 **6.x SOF 回归**。
### 3. 若没声的是 3.5mm(以前正常)
常与 `OPERATION_Force_Intel_Signed_Firmware.md` 中的固件实验相关:
1. **固件未恢复**intel-signed 覆盖 community 后曾出现插拔提示异常;须从 `.bak` 恢复并 **重启**(见该文档「固件实验后回退检查清单」)。
2. **默认输出选成 HDMI**HDMI 打不开时,桌面仍可能选其为默认,表现为「全无声音」;在系统设置中改默认输出为 **模拟/耳机**,或直接用 ALSA 测 **plughw:0,2**。
3. **系统更新**:升级 `linux-firmware` 或内核后,对照「更新后首次无声」时间线;可尝试重启或回退内核包。
### 4. 通用快速自检
根据 `aplay -L` 调整卡号与设备号(以下为 Kaisa 上常见示例):
```bash
uname -r
aplay -l
aplay -L | head -80
speaker-test -D plughw:0,2 -c 2 -l 1 # 常见为 3.5mm / Port1
speaker-test -D plughw:0,3 -c 2 -l 1 # 常见为某路 HDMI以 aplay -L 为准)
sudo dmesg | grep -iE 'sof|audio|error' | tail -40
```
- **0,2 有声、HDMI 无声**:与本文 HDMI/SOF 分析一致。
- **0,2 也无声**:查固件回退、`systemctl --user status pipewire`(或 pulseaudio、`wpctl status` / `pactl info` 中的默认 sink 与静音。
### 5. 若仅 HDMI 异常5.15 Live 验证
按 **第六节** 使用 Ubuntu 22.04 较早点版本 Live ISO优先 [old-releases](https://old-releases.ubuntu.com/releases/22.04/) 的 22.04.1 / 22.04.2,避免 22.04.5 自带 HWE 6.x在 Live 环境中执行 `uname -r` 与 `speaker-test` 对比 HDMI 是否恢复。
### 6. 结论摘要
- **HDMI**:与「同机 ChromeOS 有 HDMI、Linux 无」的长期现象一致,主因倾向 **内核 6.x 与 SOF 在 HDMI PCM 上的行为**;拓扑与单次固件替换已不足以解释/修复。
- **3.5mm 从有到无**:优先 **回退 community 固件并重启**,再查 **默认设备与静音**

View File

@@ -0,0 +1,188 @@
# 操作说明:强制 Linux 使用 intel-signed 固件
针对 Chromebox 10 代Kaisa在 Linux 下 HDMI 无声、`STREAM_PCM_PARAMS ipc failed (-5)` 的问题,尝试强制使用 intel-signed 固件ChromeOS 上可正常工作的版本)。
---
## 背景说明
- **当前现象**Linux 加载 `intel/sof/community/sof-cml.ri`(实际通过 `sof-cml.ri.zst -> sof-cnl.ri.zst` 加载ChromeOS 使用 `intel/sof/intel-signed/` 下的对应固件
- **原因**:内核在检测到 Google Chromebook/BIOS 时,会通过 DMI 强制使用 community 路径(见 `sof-pci-dev.c``community_key_platforms`
- **建议**:先尝试**方式二**(替换文件)做快速验证;若有效且希望持久化,再考虑**方式一**(模块参数)
---
## 方式一:通过 snd-sof-pci 模块参数指定固件路径
### 1. 确认模块与参数
```bash
# 查看 snd-sof-pci 模块的固件相关参数
modinfo snd_sof_pci | grep -E "fw_path|fw_filename"
```
应能看到 `fw_path``fw_filename`(部分内核版本可能标记为 deprecated但仍可用
### 2. 确认固件路径
```bash
ls -la /lib/firmware/intel/sof/intel-signed/sof-cml* /lib/firmware/intel/sof/intel-signed/sof-cnl*
```
CML 平台通过 `sof-cml.ri.zst -> sof-cnl.ri.zst` 引用 CNL 固件。需存在 `sof-cnl.ri.zst``sof-cml.ri.zst`,内核 firmware 加载器支持 `.ri.zst` 自动解压。
### 3. 临时测试(当前会话)
```bash
# 卸载 SOF 相关模块(需先停止使用声卡的进程,如浏览器、播放器等)
sudo modprobe -r snd_sof_pci_intel_cnl snd_sof_pci snd_sof
# 指定 fw_path 为 intel-signed 目录后重新加载
sudo modprobe snd_sof fw_path=intel/sof/intel-signed
# 若 fw_path 在 snd_sof_pci 上,则用:
# sudo modprobe snd_sof_pci fw_path=intel/sof/intel-signed
```
> **说明**`fw_path` 为相对于 `/lib/firmware/` 的路径,不要以 `/` 开头。
### 4. 验证是否生效
```bash
dmesg | grep -i "Firmware file"
```
应显示 `intel/sof/intel-signed/sof-cml.ri``sof-cml.ri.zst`,而非 `community/sof-cml.ri`
### 5. 永久生效(若临时测试有效)
```bash
# 创建 modprobe 配置
echo 'options snd_sof_pci fw_path=intel/sof/intel-signed' | sudo tee /etc/modprobe.d/sof-intel-signed.conf
# 若你的内核中 fw_path 在 snd_sof 上,则改为:
# echo 'options snd_sof fw_path=intel/sof/intel-signed' | sudo tee /etc/modprobe.d/sof-intel-signed.conf
# 更新 initramfs
sudo update-initramfs -u
# 重启
sudo reboot
```
### 6. 恢复默认(若无效或出现新问题)
```bash
sudo rm /etc/modprobe.d/sof-intel-signed.conf
sudo update-initramfs -u
sudo reboot
```
---
## 方式二:替换 community 路径下的固件文件
CML 平台实际加载的是 `sof-cml.ri.zst -> sof-cnl.ri.zst`,即 **sof-cnl.ri.zst** 才是真正的固件文件。通过用 intel-signed 的 `sof-cnl.ri.zst` 覆盖 community 下的同名文件,使驱动在继续使用 community 路径时实际加载 intel-signed 内容。
### 1. 确认文件结构
```bash
ls -la /lib/firmware/intel/sof/community/sof-cml* /lib/firmware/intel/sof/community/sof-cnl*
ls -la /lib/firmware/intel/sof/intel-signed/sof-cml* /lib/firmware/intel/sof/intel-signed/sof-cnl*
```
典型结构:
- `community/sof-cml.ri.zst``sof-cnl.ri.zst`(软链接)
- `community/sof-cnl.ri.zst`实际固件community 构建)
- `intel-signed/sof-cnl.ri.zst`实际固件Intel 签名)
### 2. 备份原固件
```bash
sudo cp -a /lib/firmware/intel/sof/community/sof-cnl.ri.zst /lib/firmware/intel/sof/community/sof-cnl.ri.zst.bak
```
### 3. 替换固件
```bash
sudo cp /lib/firmware/intel/sof/intel-signed/sof-cnl.ri.zst /lib/firmware/intel/sof/community/sof-cnl.ri.zst
```
> `sof-cml.ri.zst` 是软链接,无需修改;驱动通过它加载 `sof-cnl.ri.zst`,替换后者即可。
### 4. 重新加载模块或重启
```bash
# 方式 A重启推荐避免依赖未释放
sudo reboot
# 方式 B不重启重新加载模块
sudo modprobe -r snd_sof_pci_intel_cnl snd_sof_pci snd_sof
sudo modprobe snd_sof_pci_intel_cnl
```
### 5. 验证
```bash
# 查看加载的固件路径(仍为 community但内容已是 intel-signed
dmesg | grep -i "Firmware file"
# 测试 HDMI 播放(设备号以 aplay -L 为准,常见为 plughw:0,3
aplay -L | grep -A1 "HDMI"
speaker-test -D plughw:0,3 -c 2 -l 1
```
### 6. 恢复原固件(若无效或出现新问题)
```bash
sudo cp /lib/firmware/intel/sof/community/sof-cnl.ri.zst.bak /lib/firmware/intel/sof/community/sof-cnl.ri.zst
sudo modprobe -r snd_sof_pci_intel_cnl snd_sof_pci snd_sof
sudo modprobe snd_sof_pci_intel_cnl
```
---
## 注意事项
| 项目 | 说明 |
|------|------|
| **方式二与系统升级** | 替换 `/lib/firmware/` 下的文件后,升级 `linux-firmware` 时可能被覆盖,需在升级后重新执行替换,或改用方式一 |
| **固件来源** | 若本机 `intel-signed` 下无 `sof-cnl.ri.zst`,可从 ChromeOS 或 [thesofproject/sof-bin](https://github.com/thesofproject/sof-bin) 获取后放入对应目录 |
| **模块参数位置** | 不同内核版本可能将 `fw_path` 放在 `snd_sof``snd_sof_pci`,需用 `modinfo` 确认 |
| **3.5mm 耳机** | 若替换后 3.5mm 出现异常,可立即按恢复步骤回退 |
---
## 固件实验后回退检查清单
若曾用方式二覆盖 `community/sof-cnl.ri.zst`,实验结束后应逐项确认,避免「原来 3.5mm 有声、现在全无」仍由错误固件或默认输出引起。
1. **恢复文件**
```bash
sudo test -f /lib/firmware/intel/sof/community/sof-cnl.ri.zst.bak && \
sudo cp /lib/firmware/intel/sof/community/sof-cnl.ri.zst.bak \
/lib/firmware/intel/sof/community/sof-cnl.ri.zst
```
若无 `.bak`,需从包管理器重装 `linux-firmware`(或等价包)以恢复发行版文件。
2. **重启**(推荐)
仅 `modprobe -r` 在 `snd_sof` 占用时常失败;**重启**可确保加载 community 原版固件。
3. **验证固件与 3.5mm**
```bash
sudo dmesg | grep -i "Firmware file"
speaker-test -D plughw:0,2 -c 2 -l 1
```
设备号以 `aplay -L` 为准。
4. **桌面默认输出**
若默认 sink 仍为 HDMI而 HDMI 在 Linux 上打不开,会表现为「没声音」;在声音设置中改为 **模拟 / 耳机**。
5. **进一步说明**
见 `ANALYSIS_Audio.md` 第八节「Linux『原来有声音、现在没有』原因分析」。
---
## 参考
- 分析文档:`ANALYSIS_Audio.md`
- 内核源码:`sound/soc/sof/sof-pci-dev.c``community_key_platforms`、`fw_path`

View File

@@ -0,0 +1,91 @@
# Windows 音频修复说明Chromebox 10 代 / Kaisa
针对 **Coreboot 刷机后**HDMI英特尔显示器音频正常**3.5mm / Realtek ALC5682 I2S 无声、无插拔提示** 的情况。与 Linux 问题相反,修法依赖 **CoolStar / Chrultrabook 驱动栈**,不是桌面机通用 Realtek 安装包。
分析背景见 [ANALYSIS_Audio.md](ANALYSIS_Audio.md);采集样例见 `collected/audio_topology_windows_*.txt`
---
## 现象与要点(对照设备管理器)
| 设备 | 常见状态 | 含义 |
|------|----------|------|
| **英特尔(R) 显示器音频** | OK | HDMI 走 HDA一般无需再动 |
| **Realtek ALC5682 I2S Audio** | OK 但无声 | I2S codec 驱动已挂,但路由或与 SOF 协同异常 |
| **CoolStar SOF Audio (WDM)** | **Error** | 不少机型上 **3.5mm 依赖 SOF 相关栈**此处报错时容易出现「ALC5682 看似正常却不出声」 |
**结论**:优先消除 **CoolStar SOF Audio** 错误,再按官方顺序重装 **ALC5682 I2S**,不要单独用网上下载的通用 Realtek 安装程序覆盖。
---
## 一、准备
1. 确认机型为 **Kaisapuff 系)** 或与你主板一致的 Chrultrabook 条目。
2. 准备 **CoolStar 驱动**:从购买授权时提供的 **驱动门户** 或 [CoolStar Chromebook Windows](https://coolstar.org/chromebook/windows-install.html) 机型页获取 **当前推荐版本**(包内通常含 HD Audio、SOF、I2S 等)。
3. 备份当前系统或创建还原点。
---
## 二、推荐安装顺序(概要)
具体以 **Chrultrabook Post-install****CoolStar 包内 readme** 为准,常见顺序为:
1. 安装/更新 **CoolStar HD Audio**(若包内要求)。
2. 安装/更新 **CoolStar SOF Audio (Intel/I2S)**(需有效授权时按说明激活)。
3. 安装/更新 **Realtek ALC5682 I2S**(多在同一个包或后续步骤中)。
4. **重启**后再测 3.5mm。
参考:[Chrultrabook Post-install 音频](https://docs.chrultrabook.com/docs/installing/post-install.html)。
---
## 三、设备管理器排查
### 1. 处理 CoolStar SOF Audio (WDM) 的 Error
1. **属性 → 常规**:记录 **错误代码**(如 10、43 等)与文字说明。
2. **属性 → 驱动程序**
- **更新驱动**:指向 CoolStar 解压目录(**不要让 Windows 自动搜索互联网**)。
- 若无效:**卸载设备**(可选勾选「删除此设备的驱动程序软件」)→ 重启 → 用 **「操作 → 扫描检测硬件改动」** 或重新运行 CoolStar 安装程序。
3. 仍 Error到 [Chrultrabook 论坛](https://forum.chrultrabook.com/) 搜索 **机型名 + SOF + 错误码**;或向 CoolStar 支持提交工单(附 `pnputil` / 设备实例 ID
### 2. Realtek ALC5682 I2S Audio
1. 在 SOF 设备已正常或至少安装流程完整执行后,对 **ALC5682** 再执行一次 **更新驱动**(指定 CoolStar 目录)。
2. 必要时 **卸载 ALC5682** → 重启 → 再安装,避免残留旧 `oem*.inf` 冲突。
3. 不要用 **Alienware/台式机** 等通用 Realtek UAD 包——ACPI/I2S 与 Chromebox 不一致。
---
## 四、系统侧检查
1. **设置 → 系统 → 声音**:默认输出选 **耳机 / Realtek / 模拟**(勿只选「显示器音频」)。
2. 确认 **Windows Audio**、**Windows Audio Endpoint Builder** 服务为「正在运行」。
3. 运行 **声音疑难解答**,排除应用独占或静音。
---
## 五、仍无声时
1. **事件查看器**:应用程序和服务日志 → Microsoft → Windows → Audio 相关项,查看与插拔、驱动加载有关的错误时间是否与重装一致。
2. **论坛**:带关键字 **Kaisa / puff、ALC5682、headphone、jack、CSAUDIO** 检索;同板卡已有解决方案时直接复现步骤。
3. **插孔检测 / 注册表**属进阶README **W4**),仅在确认驱动版本与 SOF 状态正常后、且论坛有明确指引时再改,避免系统不稳定。
---
## 六、与仓库任务对应
| README | 内容 |
|--------|------|
| **W1W2** | 本机驱动需求与芯片确认ALC5682 I2S + CoolStar SOF |
| **W3** | 按上文消除 Error、重装 I2S、设默认设备 |
| **W4** | 插拔提示:依赖 HDA/codec 与 jack 检测,多在驱动与 DDI 正确后恢复 |
---
## 参考链接
- <https://docs.chrultrabook.com/docs/installing/post-install.html>
- <https://forum.chrultrabook.com/>
- <https://coolstar.org/chromebook/windows-install.html>
- 对比分析:[ANALYSIS_Audio.md](ANALYSIS_Audio.md)

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,367 +0,0 @@
#!/bin/bash
#
# Chromebox 10 代 - 音频硬件拓扑收集脚本(跨平台版)
# 可自动检测运行环境ChromeOS 或 Linux
#
# 用于 C1a/C1c 任务:在 Linux 或 ChromeOS 下收集音频硬件拓扑信息
#
# 用法: ./collect_audio_topology.sh [输出文件]
# 默认输出到: audio_topology/collected/audio_topology_${ENV}_$(hostname)_$(date).txt
# 其中 ENV 为 chromeos 或 linux
#
# 建议:
# - 在 Linux 下用 sudo 运行以获取完整 dmesg/journalctl
# - 在 ChromeOS 下直接运行即可
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUTPUT_DIR="${SCRIPT_DIR}/collected"
mkdir -p "$OUTPUT_DIR"
# ============================================
# 环境检测
# ============================================
detect_environment() {
# 检测是否为 ChromeOS
if [ -f /etc/lsb-release ] && grep -q "Chrome OS" /etc/lsb-release 2>/dev/null; then
echo "chromeos"
elif [ -f /etc/os-release ] && grep -q "cros" /etc/os-release 2>/dev/null; then
echo "chromeos"
elif [ -d /mnt/stateful_partition ] || [ -d /home/chronos ]; then
# ChromeOS 特有的目录
echo "chromeos"
else
echo "linux"
fi
}
ENV_TYPE=$(detect_environment)
echo "检测到运行环境: $ENV_TYPE"
# 根据环境生成输出文件名
if [ "$ENV_TYPE" = "chromeos" ]; then
OUTPUT="${1:-${OUTPUT_DIR}/audio_topology_chromeos_$(hostname)_$(date +%Y%m%d_%H%M%S).txt}"
else
OUTPUT="${1:-${OUTPUT_DIR}/audio_topology_linux_$(hostname)_$(date +%Y%m%d_%H%M%S).txt}"
fi
TMP_DIR=$(mktemp -d)
trap "rm -rf $TMP_DIR" EXIT
log() {
echo "[$(date +%H:%M:%S)] $*"
}
section() {
echo "" >> "$OUTPUT"
echo "========================================" >> "$OUTPUT"
echo "### $1" >> "$OUTPUT"
echo "========================================" >> "$OUTPUT"
echo "" >> "$OUTPUT"
}
run_cmd() {
local desc="$1"
shift
echo "# $desc" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
if "$@" >> "$OUTPUT" 2>&1; then
true
else
echo "(命令返回非零,可能部分信息缺失)" >> "$OUTPUT"
fi
echo "\`\`\`" >> "$OUTPUT"
echo "" >> "$OUTPUT"
}
# 带超时的命令执行(防止某些命令卡住)
run_cmd_timeout() {
local timeout_sec="$1"
local desc="$2"
shift 2
echo "# $desc" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
if timeout "$timeout_sec" "$@" >> "$OUTPUT" 2>&1; then
true
else
echo "(命令执行超时或失败)" >> "$OUTPUT"
fi
echo "\`\`\`" >> "$OUTPUT"
echo "" >> "$OUTPUT"
}
log "开始收集音频硬件拓扑..."
log "运行环境: $ENV_TYPE"
log "输出文件: $OUTPUT"
: > "$OUTPUT"
echo "# Chromebox 10 代 - 音频硬件拓扑" >> "$OUTPUT"
echo "# 运行环境: $ENV_TYPE" >> "$OUTPUT"
echo "# 收集时间: $(date -Iseconds)" >> "$OUTPUT"
echo "# 主机: $(hostname)" >> "$OUTPUT"
echo "" >> "$OUTPUT"
# --- 系统信息 ---
section "系统信息"
run_cmd "uname -a" uname -a
run_cmd "内核版本" uname -r
if [ -f /etc/lsb-release ]; then
run_cmd "Release (ChromeOS)" cat /etc/lsb-release
elif [ -f /etc/os-release ]; then
run_cmd "Release (Linux)" cat /etc/os-release | grep -E "^(NAME|VERSION)="
fi
run_cmd "CPU 信息" cat /proc/cpuinfo | grep -E "model name|processor" | head -10
run_cmd "内存信息" cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable"
# --- PCI 音频设备 ---
section "PCI 音频相关设备"
if command -v lspci &>/dev/null; then
run_cmd "lspci -nn | grep -i audio (含设备 ID)" bash -c "lspci -nn | grep -i audio || echo '(无匹配)'"
run_cmd "lspci -v -s $(lspci | grep -i audio | cut -d' ' -f1 | head -1)" bash -c "lspci -v -s $(lspci | grep -i audio | head -1 | cut -d' ' -f1) 2>/dev/null || true"
else
echo "# lspci 不可用" >> "$OUTPUT"
fi
# --- 播放/录音设备列表 ---
section "ALSA 设备列表"
if command -v aplay &>/dev/null; then
run_cmd "aplay -l (播放设备)" aplay -l
run_cmd "aplay -L (ALSA 设备描述)" aplay -L 2>/dev/null | head -30 || true
else
echo "# aplay 未安装" >> "$OUTPUT"
fi
if command -v arecord &>/dev/null; then
run_cmd "arecord -l (录音设备)" arecord -l
fi
run_cmd "cat /proc/asound/cards" cat /proc/asound/cards 2>/dev/null || true
run_cmd "cat /proc/asound/pcm (PCM 设备明细)" cat /proc/asound/pcm 2>/dev/null || true
# --- /proc/asound 目录结构 ---
section "/proc/asound 目录结构"
run_cmd "ls -la /proc/asound" ls -la /proc/asound 2>/dev/null || true
for card_dir in /proc/asound/card[0-9]*; do
if [ -d "$card_dir" ]; then
card=$(basename "$card_dir")
echo "# $card 目录内容:" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
ls -la "$card_dir" 2>/dev/null >> "$OUTPUT" || true
echo "\`\`\`" >> "$OUTPUT"
fi
done
# --- Codec 信息 (HDA) ---
section "HDA Codec 信息"
for codec in /proc/asound/card*/codec*; do
if [ -f "$codec" ]; then
echo "# $codec" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
cat "$codec" >> "$OUTPUT" 2>/dev/null || echo "(无法读取)" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
fi
done
# --- HDMI ELD 内容 ---
section "HDMI ELD 内容"
for eld in /proc/asound/card*/eld*; do
if [ -f "$eld" ]; then
echo "# $eld" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
cat "$eld" >> "$OUTPUT" 2>/dev/null || echo "(无法读取,或 ELD 为空/未连接)" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
fi
done
# --- /sys/class/sound 设备 ---
section "/sys/class/sound 设备"
if [ -d /sys/class/sound ]; then
run_cmd "ls -la /sys/class/sound" ls -la /sys/class/sound
for card in /sys/class/sound/card[0-9]*; do
if [ -d "$card" ]; then
echo "# $card 设备属性:" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
for f in id number; do
[ -f "$card/$f" ] && echo "$f: $(cat "$card/$f" 2>/dev/null)" >> "$OUTPUT"
done
echo "\`\`\`" >> "$OUTPUT"
fi
done
fi
# ============================================
# 平台相关收集(根据环境执行不同的命令)
# ============================================
if [ "$ENV_TYPE" = "chromeos" ]; then
# ========== ChromeOS 特有信息 ==========
# --- SOF 固件和拓扑信息 ---
section "SOF Firmware and Topology"
run_cmd "SOF firmware directory" ls -la /lib/firmware/intel/sof/ 2>/dev/null || echo "# SOF firmware directory not found" >> "$OUTPUT"
run_cmd "SOF topology directory" ls -la /lib/firmware/intel/sof-tplg/ 2>/dev/null || echo "# SOF topology directory not found" >> "$OUTPUT"
# --- CRAS 音频服务器信息 ---
section "CRAS Audio Server"
if command -v cras_test_client &>/dev/null; then
run_cmd "CRAS server info" cras_test_client --dump_server_info 2>/dev/null || echo "# cras_test_client --dump_server_info failed" >> "$OUTPUT"
run_cmd "CRAS audio thread info" cras_test_client --dump_a 2>/dev/null || true
fi
# --- PCI 设备详细信息 ---
section "PCI Audio Device Details"
if [ -d /sys/bus/pci/devices/0000:00:1f.3 ]; then
for f in class device vendor subsystem_device subsystem_vendor irq; do
[ -f "/sys/bus/pci/devices/0000:00:1f.3/$f" ] && echo "$f: $(cat /sys/bus/pci/devices/0000:00:1f.3/$f 2>/dev/null)" >> "$OUTPUT"
done
run_cmd "PCI audio driver" ls -la /sys/bus/pci/devices/0000:00:1f.3/driver 2>/dev/null || true
fi
# --- /dev/snd 设备 ---
section "/dev/snd devices"
run_cmd "ls -la /dev/snd" ls -la /dev/snd 2>/dev/null || echo "# /dev/snd not found" >> "$OUTPUT"
else
# ========== Linux 特有信息 ==========
# --- 内核日志 ---
section "内核日志 (dmesg) 音频相关"
echo "# dmesg | grep -iE 'snd|hda|audio|codec|hdmi'" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
if dmesg 2>/dev/null | grep -iE 'snd|hda|audio|codec|hdmi' >> "$OUTPUT"; then
true
else
echo "(需要 root 权限,请用 sudo 重新运行)" >> "$OUTPUT"
fi
echo "\`\`\`" >> "$OUTPUT"
# --- journalctl 内核日志 ---
if command -v journalctl &>/dev/null; then
section "journalctl 内核日志 (SOF/音频)"
echo "# journalctl -b -k --no-pager | grep -iE 'sof|snd|hda|audio|hdmi' | tail -80" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
if journalctl -b -k --no-pager 2>/dev/null | grep -iE 'sof|snd|hda|audio|hdmi' | tail -80 >> "$OUTPUT"; then
true
else
echo "(journalctl 需 root 权限)" >> "$OUTPUT"
fi
echo "\`\`\`" >> "$OUTPUT"
fi
# --- ACPI NHLT 表 ---
section "ACPI NHLT 表"
if [ -d /sys/firmware/acpi/tables ]; then
echo "# ls /sys/firmware/acpi/tables/ | grep -i nhlt" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
ls /sys/firmware/acpi/tables/ 2>/dev/null | grep -i nhlt >> "$OUTPUT" || echo "(未找到 NHLT 表)" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
fi
# --- sof-logger ---
section "sof-logger (可选)"
if command -v sof-logger &>/dev/null; then
echo "# sof-logger -t 2>/dev/null | tail -30" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
SOF_LOG=$(timeout 3 sof-logger -t 2>/dev/null | tail -30) || true
if [ -z "$SOF_LOG" ]; then
echo "(sof-logger 执行超时或需 root 权限)" >> "$OUTPUT"
else
echo "$SOF_LOG" >> "$OUTPUT"
fi
echo "\`\`\`" >> "$OUTPUT"
fi
# --- 音频服务 (PulseAudio/PipeWire) ---
section "音频服务 (PulseAudio / PipeWire)"
RUN_PACTL() {
if [ -n "${SUDO_USER:-}" ] && [ -d "/run/user/$(id -u "$SUDO_USER" 2>/dev/null)" ]; then
runuser -u "$SUDO_USER" -- env XDG_RUNTIME_DIR="/run/user/$(id -u "$SUDO_USER")" "$@"
else
"$@"
fi
}
if command -v pactl &>/dev/null; then
run_cmd "pactl info" RUN_PACTL pactl info 2>/dev/null || true
run_cmd "pactl list cards" RUN_PACTL pactl list cards 2>/dev/null | grep -E "Name:|device.description|active profile" >> "$OUTPUT" 2>/dev/null || true
run_cmd "pactl list sinks" RUN_PACTL pactl list sinks 2>/dev/null | grep -E "Name:|device.description|State" | head -30 >> "$OUTPUT" 2>/dev/null || true
fi
fi
# ========== 通用信息(两个平台都收集) ==========
# --- 音频相关内核模块 ---
section "音频相关内核模块"
run_cmd "lsmod | grep -iE 'snd|hda|sound'" bash -c "lsmod | grep -iE 'snd|hda|sound' || echo '(无匹配)'"
# --- ALSA 混音器状态 ---
section "ALSA 混音器状态"
if command -v amixer &>/dev/null; then
run_cmd_timeout 5 "amixer -c 0 contents (关键控件)" amixer -c 0 contents 2>/dev/null | grep -E "numid=|name=|values=" | head -100 >> "$OUTPUT" || true
fi
# --- SOF 固件信息 ---
section "SOF 固件 (Intel Sound Open Firmware)"
if [ -d /lib/firmware/intel ]; then
echo "# /lib/firmware/intel/ 中的 SOF 相关文件:" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
ls -la /lib/firmware/intel/ 2>/dev/null | grep -E 'sof|avs' >> "$OUTPUT" || echo "(未找到 SOF 固件)" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
for tplg_dir in /lib/firmware/intel/sof-tplg /lib/firmware/intel/sof; do
if [ -d "$tplg_dir" ]; then
echo "# 拓扑文件 ($tplg_dir):" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
ls -la "$tplg_dir/" 2>/dev/null | grep -E '\.tplg' | head -30 >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
fi
done
fi
# --- 主板信息 ---
section "主板/机型信息"
if [ -d /sys/class/dmi/id ]; then
echo "# DMI 信息:" >> "$OUTPUT"
echo "\`\`\`" >> "$OUTPUT"
for f in board_name product_name sys_vendor bios_version; do
[ -f "/sys/class/dmi/id/$f" ] && echo "$f: $(cat /sys/class/dmi/id/$f 2>/dev/null)" >> "$OUTPUT"
done
echo "\`\`\`" >> "$OUTPUT"
fi
# --- 收集信息摘要 ---
section "收集信息摘要"
echo "脚本: $0" >> "$OUTPUT"
echo "脚本目录: $SCRIPT_DIR" >> "$OUTPUT"
echo "运行环境: $ENV_TYPE" >> "$OUTPUT"
echo "输出文件: $OUTPUT" >> "$OUTPUT"
echo "文件大小: $(du -h "$OUTPUT" 2>/dev/null | cut -f1)" >> "$OUTPUT"
echo "行数: $(wc -l < "$OUTPUT" 2>/dev/null)" >> "$OUTPUT"
# ============================================
# 平台特定的下一步提示
# ============================================
section "下一步操作提示"
if [ "$ENV_TYPE" = "chromeos" ]; then
echo "1. 如需更完整的信息,请打开 chrome://system" >> "$OUTPUT"
echo "2. 找到 'audio' 部分并点击 'Expand'" >> "$OUTPUT"
echo "3. 将展开的内容复制粘贴到文件末尾" >> "$OUTPUT"
echo "" >> "$OUTPUT"
echo "--- 请在此处粘贴 chrome://system 的 AUDIO 部分 ---" >> "$OUTPUT"
else
echo "1. 如需更完整的 dmesg 信息,请用 sudo 重新运行此脚本" >> "$OUTPUT"
echo "2. 检查 PulseAudio/WirePlumber 服务状态systemctl --user status pipewire" >> "$OUTPUT"
echo "3. 测试 HDMI 音频speaker-test -D hw:0,3 -c 2 -t wav" >> "$OUTPUT"
fi
log "收集完成!"
log "运行环境: $ENV_TYPE"
log "输出文件: $OUTPUT"
log ""
log "文件命名规则已明确标识运行环境:"
if [ "$ENV_TYPE" = "chromeos" ]; then
log " - 文件名包含 'chromeos'"
log " - 文件头部有 '# 运行环境: chromeos'"
else
log " - 文件名包含 'linux'"
log " - 文件头部有 '# 运行环境: linux'"
fi