如何检测 usb0 设备(USB 小工具又名 g_ether)的断开连接?

How to detect disconnection of usb0 device (USB gadget aka g_ether)?

提问人:ivand 提问时间:8/18/2022 最后编辑:ivand 更新时间:11/19/2023 访问量:552

问:

两台 Linux 机器(嵌入式板和 PC)通过 USB 电缆相互连接,并通过 USB 小工具/以太网建立通信。双方都有IP地址,ping工作等。

我需要找到一种方法来检测板侧的 USB 电缆断开连接,最好使用单个 Bash 命令。

ifconfig usb0即使拔下电缆,仍显示 IP 地址,并且该设备仍处于“UP”和“RUNNING”状态。

网络 嵌入式-Linux

评论

1赞 0andriy 8/21/2022
您的主板如何处理 ID 引脚?它看起来像是硬件(PCB 级别)问题或软件问题。例如,我的英特尔 Edison 开发板在拔下电缆时会按预期做出反应。
0赞 ivand 8/22/2022
感谢您的提示 - 硬件/软件看起来一团糟:在电路板端,ID 被拉下拉(应该被拉上拉,对吧?),但驱动程序 (atmel_usba_udc.c) 无论如何都不处理 ID 引脚。/sys/class/udc/300000.gadget/state 有时会在拔下时从“配置”切换到“默认”,但并非总是如此。
1赞 0andriy 8/24/2022
取决于 usage.ID 引脚接地或浮动,用于主机/小工具检测。否则,如果我没记错的话,当它具有特定的电阻(对地和 VBUS )时——充电器检测。您可以在相应的 USB 规格中找到所有这些。

答:

0赞 Durmus 8/19/2022 #1

一种方法是检查文件:

/sys/class/net/usb0/operstate

如果文件内容为“up”,则链接存在。如果内容“关闭”,则没有链接。

评论

0赞 ivand 8/20/2022
不幸的是,即使拔下电缆,它也会“向上”。看起来这是一个已知的内核问题,我也尝试过 udev 和 ifplugd 无济于事。可能必须定期执行 ping。
1赞 ivand 8/23/2022 #2

在我的特殊情况下,结果是硬件 + 软件问题:驱动程序 (atmel_usba_udc) 使用 USB 电源 (VBUS) 来检测连接,因为它充当从站并且电源由主机提供。然而,在PCB中,电路板本身同时为所有USB端口无条件地提供电源。

通常任何标准方法都应该有效:ifconfig 或 sysfs。

0赞 user2461794 11/15/2023 #3

在PiZero上有同样的问题作为小工具(驱动程序)。
不幸的是,似乎也不可用。
g_cdc/sys/class/net/usb0/carrier

测试current_speed似乎非常成功地检测驱动程序加载后的连接/断开状态(留出一些时间让它稳定下来)。
如果连接了电缆,则可能是 或 。
当电缆未连接时,它是 ,因此:
current_speedhigh-speedfull-speedUNKNOWN

udc_gadget="$( dirname "$( find -L /sys/class/udc/* -maxdepth 2 -type f -name "is_a_peripheral")" )"
[ "$( cat "$udc_gadget"/current_speed )" = "UNKNOWN" ] && echo "not connected"