Files
chromebox_10th_audio_driver/audio_topology/collect_chromeos_audio_topology.sh

319 lines
13 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
#
# Chromebox 10 代 - 原生 ChromeOS 音频硬件拓扑收集脚本(增强版)
# 用于 C1c 任务:在原生 ChromeOS 下收集硬件拓扑,供与 Coreboot+Linux/Windows 对比
#
# 用法(在 ChromeOS 上):
# 1. 打开 crosh浏览器按 Ctrl+Alt+T
# 2. 输入 shell 进入 bash如果提示符是 crosh>,输入 shell 后回车)
# 3. 将本脚本保存到 Downloads 目录(通常路径为 /home/user/xxxxxxxx/MyFiles/Downloads/
# 4. 在 shell 中执行bash 脚本文件名.sh
# 5. 执行完成后,在同目录生成 audio_topology_chromeos_*.txt 文件
#
# 示例:
# Welcome to crosh, the ChromeOS developer shell.
# If you got here by mistake, don't panic! Just close this tab and carry on.
# Type 'help' for a list of commands.
# If you want to customize the look/behavior, you can use the options page.
# Load it by using the Ctrl-Shift-P keyboard shortcut.
# crosh> shell
# Sudo commands will not succeed by default.
# If you want to use sudo commands, use the VT-2 shell
# (Ctrl-Alt-{F2/Right arrow/Refresh}) or build the image with the
# login_enable_crosh_sudo USE flag:
# $ USE=login_enable_crosh_sudo emerge-$BOARD chromeos-login
# or
# $ USE=login_enable_crosh_sudo cros build-packages --board=$BOARD
# chronos@kaisa-rev4 / $ cd /home/user/
# chronos@kaisa-rev4 /home/user $ ls
# 214dee0ea6dfb3392dcd2f8a1e3299338445715b
# chronos@kaisa-rev4 /home/user $ cd 214dee0ea6dfb3392dcd2f8a1e3299338445715b/MyFiles/Downloads/
# chronos@kaisa-rev4 /home/user/214dee0ea6dfb3392dcd2f8a1e3299338445715b/MyFiles/Downloads $ bash collect_chromeos_audio_topology.sh
#
# 输出文件位置:
# 脚本所在目录(通常是 /home/user/xxxxxxxx/MyFiles/Downloads/
# 文件名audio_topology_chromeos_$(hostname)_$(date).txt
#
# 查看结果:
# cat audio_topology_chromeos_*.txt # 直接查看
# 或用 ChromeOS 的文件应用打开 Downloads 目录找到该文件
#
# 注意:
# - ChromeOS 使用 CRAS 音频服务器,无 PulseAudio
# - 部分信息需在浏览器打开 chrome://system找到「audio」一节点击 Expand
# - 将展开的内容复制粘贴到输出文件末尾的指定位置
# - 脚本需要 bash如果提示 bash 不存在,用 sh 执行即可
set -e
# 获取脚本所在目录(通常是 Downloads
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUTPUT_DIR="${OUTPUT_DIR:-$SCRIPT_DIR}"
OUTPUT="${1:-${OUTPUT_DIR}/audio_topology_chromeos_$(hostname)_$(date +%Y%m%d_%H%M%S).txt}"
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"
"$@" >> "$OUTPUT" 2>&1 || echo "(command failed or not available)" >> "$OUTPUT"
echo '```' >> "$OUTPUT"
echo "" >> "$OUTPUT"
}
log "Collecting ChromeOS audio topology..."
log "Output: $OUTPUT"
log "Script directory: $SCRIPT_DIR"
log ""
log "提示:文件生成后可以用 cat $OUTPUT 查看,或在文件管理器 Downloads 目录中找到"
: > "$OUTPUT"
echo "# Chromebox 10 - ChromeOS (native) audio topology (Enhanced Collection)" >> "$OUTPUT"
echo "# Collected: $(date -Iseconds 2>/dev/null || date)" >> "$OUTPUT"
echo "# Host: $(hostname)" >> "$OUTPUT"
echo "# Script directory: $SCRIPT_DIR" >> "$OUTPUT"
echo "# Note: Add content from chrome://system -> audio section manually if needed." >> "$OUTPUT"
echo "" >> "$OUTPUT"
# --- System ---
section "System"
run_cmd "uname -a" uname -a
run_cmd "Release (if exists)" cat /etc/lsb-release 2>/dev/null || true
run_cmd "CPU Info" cat /proc/cpuinfo | grep -E "model name|processor" | head -10 2>/dev/null || true
run_cmd "Memory Info" cat /proc/meminfo | grep -E "MemTotal|MemFree" 2>/dev/null || true
# --- ALSA (kernel layer, CRAS sits on top) ---
section "ALSA /proc/asound"
run_cmd "cat /proc/asound/cards" cat /proc/asound/cards 2>/dev/null || echo "(no /proc/asound/cards)" >> "$OUTPUT"
run_cmd "cat /proc/asound/pcm" cat /proc/asound/pcm 2>/dev/null || true
run_cmd "cat /proc/asound/version" cat /proc/asound/version 2>/dev/null || true
run_cmd "ls -la /proc/asound" ls -la /proc/asound 2>/dev/null || true
for card_dir in /proc/asound/card[0-9]*; do
[ -d "$card_dir" ] || continue
card=$(basename "$card_dir")
echo "# $card dir:" >> "$OUTPUT"
echo '```' >> "$OUTPUT"
ls -la "$card_dir" 2>/dev/null >> "$OUTPUT" || true
echo '```' >> "$OUTPUT"
done
# --- Codec (HDA) ---
section "HDA Codec"
for codec in /proc/asound/card*/codec*; do
[ -f "$codec" ] || continue
echo "# $codec" >> "$OUTPUT"
echo '```' >> "$OUTPUT"
cat "$codec" 2>/dev/null >> "$OUTPUT" || true
echo '```' >> "$OUTPUT"
done
# --- HDMI ELD ---
section "HDMI ELD"
for eld in /proc/asound/card*/eld*; do
[ -f "$eld" ] || continue
echo "# $eld" >> "$OUTPUT"
echo '```' >> "$OUTPUT"
cat "$eld" 2>/dev/null >> "$OUTPUT" || true
echo '```' >> "$OUTPUT"
done
# --- sysfs sound ---
section "/sys/class/sound"
run_cmd "ls -la /sys/class/sound" ls -la /sys/class/sound 2>/dev/null || true
# 更详细的sysfs信息
section "Sound device sysfs details"
for sound_dev in /sys/class/sound/card*; do
[ -d "$sound_dev" ] || continue
echo "# $sound_dev:" >> "$OUTPUT"
echo '```' >> "$OUTPUT"
ls -la "$sound_dev/" 2>/dev/null >> "$OUTPUT" || true
echo '```' >> "$OUTPUT"
done
# --- PCI (if available) ---
section "PCI audio (if lspci exists)"
if command -v lspci &>/dev/null; then
run_cmd "lspci -nn | grep -i audio" bash -c "lspci -nn | grep -i audio || echo '(none)'"
run_cmd "lspci -v -s $(lspci | grep -i audio | cut -d' ' -f1)" bash -c "lspci -v -s $(lspci | grep -i audio | head -1 | cut -d' ' -f1) 2>/dev/null || true"
else
echo "# lspci not available on this ChromeOS image" >> "$OUTPUT"
echo "" >> "$OUTPUT"
fi
# --- 新增: 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"
# 查找具体的拓扑文件
if [ -d /lib/firmware/intel/sof-tplg ]; then
run_cmd "SOF topology files detail" ls -la /lib/firmware/intel/sof-tplg/ | grep -i rt5682 2>/dev/null || true
fi
# SOF内核日志
run_cmd "SOF kernel log (last 20)" dmesg | grep -i sof | tail -20 2>/dev/null || true
run_cmd "SOF firmware version" dmesg | grep -i "firmware.*version" | grep -i sof | tail -5 2>/dev/null || true
# --- 新增: 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 I/O devices" cras_test_client --dump_iodev_list 2>/dev/null || true
run_cmd "CRAS audio thread info" cras_test_client --dump_a 2>/dev/null || true
else
echo "# cras_test_client not available" >> "$OUTPUT"
# 尝试查找cras_test
run_cmd "Find cras_test" find /usr/bin -name "*cras*" 2>/dev/null | head -10 || true
fi
# --- 新增: ALSA 控制信息 ---
section "ALSA Controls"
run_cmd "amixer contents" amixer contents 2>/dev/null || echo "# amixer not available" >> "$OUTPUT"
run_cmd "amixer info" amixer info 2>/dev/null || true
run_cmd "amixer scontrols" amixer scontrols 2>/dev/null || true
# --- 新增: aplay/arecord设备列表 ---
section "Audio Devices"
if command -v aplay &>/dev/null; then
run_cmd "aplay -l (playback devices)" aplay -l 2>/dev/null || true
run_cmd "aplay -L (playback device names)" aplay -L 2>/dev/null | head -30 || true
fi
if command -v arecord &>/dev/null; then
run_cmd "arecord -l (capture devices)" arecord -l 2>/dev/null || true
fi
# --- 新增: PCI设备详细信息 ---
section "PCI Audio Device Details"
if [ -d /sys/bus/pci/devices/0000:00:1f.3 ]; then
run_cmd "PCI audio class" cat /sys/bus/pci/devices/0000:00:1f.3/class 2>/dev/null || true
run_cmd "PCI audio device" cat /sys/bus/pci/devices/0000:00:1f.3/device 2>/dev/null || true
run_cmd "PCI audio vendor" cat /sys/bus/pci/devices/0000:00:1f.3/vendor 2>/dev/null || true
run_cmd "PCI audio subsystem device" cat /sys/bus/pci/devices/0000:00:1f.3/subsystem_device 2>/dev/null || true
run_cmd "PCI audio subsystem vendor" cat /sys/bus/pci/devices/0000:00:1f.3/subsystem_vendor 2>/dev/null || true
run_cmd "PCI audio IRQ" cat /sys/bus/pci/devices/0000:00:1f.3/irq 2>/dev/null || true
run_cmd "PCI audio driver" ls -la /sys/bus/pci/devices/0000:00:1f.3/driver 2>/dev/null || true
else
# 尝试查找其他音频PCI设备
audio_pci=$(lspci | grep -i audio | head -1 | cut -d' ' -f1)
if [ -n "$audio_pci" ] && [ -d "/sys/bus/pci/devices/0000:$audio_pci" ]; then
run_cmd "PCI audio details (from lspci)" ls -la "/sys/bus/pci/devices/0000:$audio_pci/" 2>/dev/null | head -20 || true
fi
fi
# --- 新增: ACPI设备信息 ---
section "ACPI Audio Devices"
if [ -d /sys/bus/acpi/devices ]; then
run_cmd "ACPI devices with audio" ls -la /sys/bus/acpi/devices/ | grep -i audio 2>/dev/null | head -10 || echo "# No ACPI audio devices found" >> "$OUTPUT"
fi
# --- 新增: 音频模块信息 ---
section "Audio Kernel Modules"
run_cmd "Loaded audio modules" lsmod | grep -E "snd|sof|hda" 2>/dev/null | head -30 || true
run_cmd "Module parameters" modinfo snd_sof_pci 2>/dev/null | head -15 || true
# --- 新增: /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"
# --- 新增: 音频相关服务 ---
section "Audio Services"
# Check CRAS process
run_cmd "CRAS process info" ps aux | grep -E "[c]ras" || echo "# CRAS process not found" >> "$OUTPUT"
# Check CRAS via dbus (if available)
if command -v dbus-send &>/dev/null; then
run_cmd "CRAS volume via dbus" dbus-send --system --print-reply --dest=org.chromium.cras /org/chromium/cras org.chromium.cras.Control.GetVolume 2>/dev/null || true
run_cmd "CRAS output devices via dbus" dbus-send --system --print-reply --dest=org.chromium.cras /org/chromium/cras org.chromium.cras.Control.GetOutputDevices 2>/dev/null | head -20 || true
else
echo "# dbus-send not available" >> "$OUTPUT"
fi
# Check if CRAS is responding to test client
if command -v cras_test_client &>/dev/null; then
run_cmd "CRAS client test" cras_test_client --dump_server_info 2>/dev/null | head -10 || true
else
echo "# cras_test_client not available" >> "$OUTPUT"
fi
# List all audio-related processes
run_cmd "Audio-related processes" ps aux | grep -E "cras|alsa|snd|sof|pulse" | grep -v grep 2>/dev/null | head -20 || true
# Check systemd services (if any - some ChromeOS builds have limited systemd)
if command -v systemctl &>/dev/null; then
run_cmd "Systemd audio services" systemctl list-units --type=service | grep -E "cras|alsa|sound|audio" 2>/dev/null | head -10 || true
else
echo "# systemctl not available on this ChromeOS build" >> "$OUTPUT"
fi
# Check init scripts (traditional SysV init)
if [ -d /etc/init ]; then
run_cmd "Upstart audio jobs" ls -la /etc/init/ | grep -E "cras|alsa" 2>/dev/null || true
fi
# --- 新增: 音频配置文件 ---
section "Audio Configuration Files"
run_cmd "ASoC machine driver" dmesg | grep -i "asoc.*machine" | tail -5 2>/dev/null || true
run_cmd "CRAS config" ls -la /etc/cras/ 2>/dev/null || echo "# No CRAS config directory" >> "$OUTPUT"
# --- CRAS / ALSA utils (if present) ---
section "Audio tools (optional)"
run_cmd "which cras_test aplay amixer cras_test_client" bash -c "which cras_test aplay amixer cras_test_client 2>/dev/null || true"
if command -v cras_test &>/dev/null; then
run_cmd "cras_test --help 2>&1 | head -5" bash -c "cras_test --help 2>&1 | head -5" || true
fi
# --- DMI / board (if readable) ---
section "Board (DMI-like)"
for f in /sys/class/dmi/id/board_name /sys/class/dmi/id/product_name /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/board_version /sys/class/dmi/id/bios_version; do
[ -f "$f" ] && echo "$f: $(cat "$f" 2>/dev/null)" >> "$OUTPUT"
done
# --- 新增: 收集时间戳和文件信息 ---
section "Collection Info"
echo "Script: $0" >> "$OUTPUT"
echo "Script directory: $SCRIPT_DIR" >> "$OUTPUT"
echo "Output file: $OUTPUT" >> "$OUTPUT"
echo "File size: $(du -h "$OUTPUT" 2>/dev/null | cut -f1)" >> "$OUTPUT"
echo "Line count: $(wc -l < "$OUTPUT" 2>/dev/null)" >> "$OUTPUT"
# --- 最终提示 ---
section "Next Steps"
echo "1. Open chrome://system in Chrome browser" >> "$OUTPUT"
echo "2. Find 'audio' section and click 'Expand'" >> "$OUTPUT"
echo "3. Copy all the expanded content" >> "$OUTPUT"
echo "4. Paste it below this line:" >> "$OUTPUT"
echo "" >> "$OUTPUT"
echo "--- PASTE chrome://system AUDIO SECTION HERE ---" >> "$OUTPUT"
echo "" >> "$OUTPUT"
echo "" >> "$OUTPUT"
echo "--- END OF chrome://system AUDIO SECTION ---" >> "$OUTPUT"
log "Done! Enhanced collection complete."
log "Output file: $OUTPUT"
log "File is in the same directory as this script: $SCRIPT_DIR"
log ""
log "Next steps:"
log "1. Open chrome://system in Chrome browser"
log "2. Find 'audio' section and click 'Expand'"
log "3. Copy all the expanded content"
log "4. Edit $OUTPUT and paste at the marked location"
log ""
log "To view the file: cat $OUTPUT"
log "To copy to Downloads: cp $OUTPUT ~/Downloads/"