【问题标题】:How to detect when a usb cable is connected/disconnected on the device side in Linux 2.6.37?如何在 Linux 2.6.37 的设备端检测 USB 电缆何时连接/断开?
【发布时间】:2016-02-08 22:55:41
【问题描述】:

我有一个运行 linux 2.6.37 的嵌入式设备。

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

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

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

我找到了这个udev approach,但我认为它在我的内核版本中不可用。因为我在/dev 中没有找到任何与 USB 相关的节点。 This discussing 也表明它可能不可行,以太。

我还找到了linux hotplug 并尝试了 netlink 示例,但是当我连接/断开 USB 电缆时,我没有看到任何运行该示例的输出。

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

我该如何做到这一点?

【问题讨论】:

    标签: linux usb


    【解决方案1】:

    为此,您可以使用inotify(7) 功能,在/sys 中创建某些设备节点后,该功能在所有 linux 内核中都可用。

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

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

    【讨论】:

    • 据我所知,libusb 是一个主机端库,但我的问题更多是关于设备端的。
    • 如果您不想自己挖掘来获取 USB 设备信息,我建议您使用。插入设备后,udevd 会收到一个事件,使其能够在设备供应商 ID 和设备 ID 上选择正确的设备驱动程序(如果可用)
    【解决方案2】:

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

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

    如果与主机握手成功则读取为“外设”,如果失败则读取为“空闲”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2011-12-25
      • 2015-09-03
      • 2017-03-16
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多