如何在 Linux 2.6.37 中检测设备端的 USB 电缆何时为 connected/disconnected?

How to detect when a usb cable is connected/disconnected on the device side in Linux 2.6.37?

我有一个运行 linux 2.6.37.

的嵌入式设备

我希望我的应用程序知道何时连接了 USB。

目前我可以通过池化来实现 /sys/devices/platform/musb/musb-hdrc.0/vbus.

但是这种方法不区分 USB 充电器或 USB 主机。

我发现这个udev approach but I don't think it's available in my version of the kernel. because I did not find any USB related nodes in my /dev. This discussing也说明可能不可行,ether

我也找到了 linux hotplug 并尝试了 netlink 示例,但是当我 connect/disconnect USB 电缆时我没有看到任何输出 运行 这个示例。

我想做的是检测设备上的连接类型,当 USB 连接时,准备(卸载文件系统)并切换到 g_file_storage 如果设备连接到主机,什么也不做如果设备连接到充电器。

我该如何实现?

为此,您可以使用 inotify(7) 功能,所有 linux 内核都可用,一旦在 /sys.[=16 中创建了某个设备节点,它就会被唤醒=]

要知道你有什么类型的设备,你必须从正确的 usb ioctl 调用中读取 usb 信息(或者如果你不是内核接口专家,使用 libusb 接口)以获得 device vendordevice iddevice class 字段来自设备。通常,热插拔软件会收到这些事件的通知(通过一个特殊的套接字)。您没有正确初始化设备的最可能原因是 udev 系统配置文件中的一些错误配置,通常每个可能的 device vendor/device id 对都有一个条目并允许它加载适当的设备驱动程序来控制它。该过程继续使用设备驱动程序模块动态创建实际设备,并且由于某些其他内核事件到 udevd,它们将出现在 /dev/ 文件系统中。

阅读 <linux_src>/Documentation 中的适当文档(此目录目录属于 linux 内核源代码,因此您可能需要安装它),以及 udevd(8) 手册页以能够添加一个新的USB。

在 2.6.37 内核上,这可以通过轮询来完成

/sys/devices/platform/musb-omap2430.0/musb-hdrc.0/mode

如果与主机的握手成功,那么它将显示为 "peripheral",如果失败,它将显示为 "idle"。