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。
识别流程
完整脚本
脚本先列出所有 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 硬件,脚本输出“未发现”提示即视为正常路径,不报错退出。