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:
@@ -45,3 +45,5 @@
|
||||
|
||||
- 目标平台:Chromebox(10 代 Intel,Coreboot 刷机后)
|
||||
- 目标系统: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)
|
||||
|
||||
250
audio_topology/ANALYSIS_Audio.md
Normal file
250
audio_topology/ANALYSIS_Audio.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# Linux / ChromeOS / Windows 音频拓扑对比分析
|
||||
|
||||
基于 `collected/` 目录下采集数据的对比,分析 Chromebox 10 代(Kaisa)在三平台上的音频差异。
|
||||
|
||||
> **说明**:Linux 采集时 HDMI1 已插入显示器。dmesg 中 -5 错误出现在 pcm3(HDMI2)、pcm4(HDMI3),pcm2(HDMI1)是否有相同问题需结合实际接法确认。
|
||||
|
||||
---
|
||||
|
||||
## 〇、三平台问题概况
|
||||
|
||||
| 平台 | HDMI 声音 | 3.5mm 耳机声音 | 插入/拔出提示 |
|
||||
|------|-----------|----------------|---------------|
|
||||
| **ChromeOS** | ✅ 有 | ✅ 有 | ✅ 有 |
|
||||
| **Linux** | HDMI1 已插,pcm2/3/4 对应关系待确认 | ✅ 有 | ✅ 有 |
|
||||
| **Windows** | ✅ 有 | ❌ 无 | ❌ 无 |
|
||||
|
||||
**观察**:Windows 与 Linux 表现相反——Windows 有 HDMI 无 3.5mm,Linux 有 3.5mm、HDMI 待测。硬件/音频路径相同,差异在驱动,Windows 下 3.5mm(RT5682 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(采集时) | Linux:HDMI1 已插 | eld#2.3 有效 | AudioEndpoint 检测到显示器 | Linux/ChromeOS 一致;Windows 等效 |
|
||||
| NHLT | 未找到 | 未找到 | Coreboot 下未提供 | **均缺失**(Coreboot 下常见)|
|
||||
|
||||
**结论**:硬件、拓扑在三平台一致,差异在驱动。NHLT 缺失并非 Linux 特有,ChromeOS / Windows 也无 NHLT。
|
||||
|
||||
---
|
||||
|
||||
## 二、关键差异:三平台 HDMI / 3.5mm 表现
|
||||
|
||||
### ChromeOS(HDMI、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=3(HDMI2)**:LastOpen **OK**,Plugged **yes**
|
||||
- 音频走 CRAS → ALSA → SOF,HDMI 与 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()
|
||||
```
|
||||
|
||||
- **pcm3(HDMI2)**、**pcm4(HDMI3)**:`STREAM_PCM_PARAMS` IPC 失败,错误码 **-5 (EIO)**
|
||||
- **pcm2(HDMI1)**:采集时已插入显示器,amixer 显示 `HDMI/DP,pcm=2 Jack` 为 on
|
||||
- **3.5mm**:正常,有插入/拔出提示
|
||||
- **说明**:dmesg 中 -5 错误集中在 pcm3/pcm4,若显示器接在 HDMI1 则 pcm2 可能有不同表现,需结合实际接法复测
|
||||
|
||||
### Windows(HDMI 正常,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 为未压缩 .tplg,Linux 为 .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
|
||||
- 通用 Linux:PulseAudio/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 可能已带 HWE(6.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 均无 NHLT,ChromeOS 正常,说明 **NHLT 缺失不是 HDMI 失败的根本原因**
|
||||
- 若在 Coreboot 中补齐 NHLT 后仍有问题,应继续从固件/内核/拓扑方向排查
|
||||
|
||||
---
|
||||
|
||||
## 七、结论概要
|
||||
|
||||
| 结论 | Linux | ChromeOS | Windows |
|
||||
|------|-------|----------|---------|
|
||||
| 硬件一致 | sof-rt5682, 同左 | sof-rt5682, 同左 | Realtek ALC5682 + Intel 显示器音频,同硬件 |
|
||||
| 采集条件 | HDMI1 已插入 | HDMI1 已插入 | HDMI 已连接 |
|
||||
| 问题表现 | HDMI:pcm3/4 -5 错误;3.5mm 正常 | 均正常 | HDMI 正常;3.5mm 无声、无插入提示 |
|
||||
| 下一步 | 确认 pcm 与物理端口对应,复测 HDMI;若「原来有声现在无声」见第八节 | — | [OPERATION_Windows_Audio.md](OPERATION_Windows_Audio.md);README W1–W4 |
|
||||
|
||||
---
|
||||
|
||||
## 八、Linux「原来有声音、现在没有」原因分析
|
||||
|
||||
排查前先**分清是哪种输出没声**:HDMI / 显示器、3.5mm 耳机,或两者皆无。不同情况对应不同原因。
|
||||
|
||||
### 1. 分辩:哪种声音没了
|
||||
|
||||
| 情况 | 与本项目采集结论的关系 | 最可能原因 |
|
||||
|------|------------------------|------------|
|
||||
| **HDMI / 显示器** | 已记录 Linux 上 pcm3/pcm4 出现 `STREAM_PCM_PARAMS ipc failed (-5)`,ChromeOS 正常 | **多为 6.x 内核下 SOF + HDMI 路径长期问题**,不是典型「硬件突然损坏」;若曾以为 HDMI 有过声,可能是接在 **pcm2(HDMI1)**、或与其它系统/设备混淆 |
|
||||
| **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 固件并重启**,再查 **默认设备与静音**。
|
||||
188
audio_topology/OPERATION_Force_Intel_Signed_Firmware.md
Normal file
188
audio_topology/OPERATION_Force_Intel_Signed_Firmware.md
Normal 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`)
|
||||
91
audio_topology/OPERATION_Windows_Audio.md
Normal file
91
audio_topology/OPERATION_Windows_Audio.md
Normal 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. 确认机型为 **Kaisa(puff 系)** 或与你主板一致的 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 | 内容 |
|
||||
|--------|------|
|
||||
| **W1–W2** | 本机驱动需求与芯片确认(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)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
Reference in New Issue
Block a user