2. 识别USB4主机控制器与设备拓扑

任务说明

本案例在 Linux 上识别 USB4 主机控制器(Host Router),并读取内核暴露的设备拓扑。核心手段:用 lspci 定位 PCI 上的 USB4/Thunderbolt 控制器,用 sysfs 确认其驱动与设备节点,用 debugfs 的 /sys/kernel/debug/thunderbolt 查看拓扑树。

环境与依赖

  • 内核需启用 USB4/Thunderbolt 支持(CONFIG_USB4、CONFIG_THUNDERBOLT),并挂载 debugfs。
  • 工具:pciutils(提供 lspci)、bash。读取 debugfs 通常需要 root。

识别流程

lspci 扫描 PCI 匹配 USB4/Thunderbolt 控制器 (class 0c0330) sysfs 确认驱动 /sys/bus/pci/devices/… debugfs 拓扑 /sys/kernel/debug/thunderbolt 输出设备树 domain/router/port

完整脚本

脚本先列出所有 USB4/Thunderbolt 控制器,再逐个打印其驱动绑定与 debugfs 拓扑。若系统无 USB4 控制器或无 debugfs 节点,会给出明确提示而非报错退出。

#!/usr/bin/env bash
# usb4_topology.sh - 识别 USB4 主机控制器并查看拓扑
set -u

DBG=/sys/kernel/debug/thunderbolt

echo "== 1. lspci 中的 USB4/Thunderbolt 控制器 =="
# 0c0330 = USB4/Thunderbolt 主机控制器
mapfile -t CTRLS < <(lspci -Dn | awk '$3 ~ /^0c0330/ {print $1}')
if [ ${#CTRLS[@]} -eq 0 ]; then
  echo "未发现 USB4/Thunderbolt 控制器 (class 0c0330)。"
else
  for bdf in "${CTRLS[@]}"; do
    echo "--- $bdf ---"
    lspci -s "$bdf" -nn
    dev="/sys/bus/pci/devices/$bdf"
    drv=$(basename "$(readlink -f "$dev/driver" 2>/dev/null)" 2>/dev/null)
    echo "driver: ${drv:-none}"
  done
fi

echo
echo "== 2. debugfs 拓扑 =="
if [ ! -d "$DBG" ]; then
  echo "debugfs 未挂载或无 thunderbolt 节点。"
  echo "尝试: mount -t debugfs none /sys/kernel/debug"
  exit 0
fi

for dom in "$DBG"/*; do
  [ -d "$dom" ] || continue
  echo "domain: $(basename "$dom")"
  for r in "$dom"/*; do
    [ -d "$r" ] || continue
    name=$(basename "$r")
    [ -f "$r/name" ] && name="$(cat "$r/name")"
    echo "  router: $(basename "$r") ($name)"
    for p in "$r"/*; do
      [ -d "$p" ] || continue
      echo "    port: $(basename "$p")"
    done
  done
done

运行方式

chmod +x usb4_topology.sh
sudo ./usb4_topology.sh

若 debugfs 未挂载,先执行 sudo mount -t debugfs none /sys/kernel/debug。

验证与判定标准

  • 第 1 节应列出至少一个 class 为 0c0330 的 PCI 设备,并显示其 driver(通常为 thunderbolt)。
  • 第 2 节应打印出 domain → router → port 的层级结构,router 名称与 lspci 中的控制器对应。
  • 若系统无 USB4 硬件,脚本输出“未发现”提示即视为正常路径,不报错退出。