#!/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/"