linux usb connect / disconnect事件

时间:2011-08-19 00:28:27

标签: c linux networking usb driver

您好我正在使用带有usb端口的嵌入式linux设备,该端口使用g_ether驱动程序进行USB网络连接。

连接usb插头后,dmesg输出为:

  

g_ether小工具:全速配置#2:RNDIS

拔下usb线时,没有信息写入dmesg。

使用C我如何监听连接/断开连接事件?

嵌入式Linux操作系统没有任何附加功能。没有dbus守护程序或hotplug帮助程序脚本。我甚至不确定这些是否会有所帮助。

3 个答案:

答案 0 :(得分:5)

如果您希望单个流程中的所有内容,则必须使用libudev从udevd或直接从内核获取事件。

看到在您的应用程序中使用libudev可能有问题(缺少文档?),另一种方法是使用udevadm程序,该程序可以:

  • udevdudevadm monitor --udev --property),
  • 处理后报告设备事件
  • 直接从内核(udevadm monitor --kernel --property)和
  • 报告devive事件
  • dump udevd的当前设备数据库(但不是内核的!)(udevadm info --query all --export-db

udevadm是udev包的一部分,但如果您只使用它来报告内核事件,则不需要udevd。您可以通过让您的流程生成并解析其标准输出来使用它(但您必须通过stdbuf -o L启动它。)

无论哪种方式,它可能都需要做很多工作。我已经在我的NCD programming language中实现了很多这样的功能,包括监控USB设备。你可能想看看NCD;它对很多配置任务很有用,并且可以很好地处理热插拔。例如,此NCD程序将USB设备事件打印到标准输出:

process main {
    sys.watch_usb() watcher;
    println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
    watcher->nextevent();
}

这将使NCD打印出类似的内容(对于已插入的任何USB设备,发生初始added事件):

added /dev/bus/usb/002/045 0409:0059
added /dev/bus/usb/002/046 046d:c313
added /dev/bus/usb/002/047 046d:c03e
added /dev/bus/usb/002/048 0557:2008
removed /dev/bus/usb/002/048 0557:2008

您也可以仅使用NCD,并解析标准输出 - 这比直接使用udevadm更容易使用。

请注意,NCD本身使用udevadm 要求udevd运行;但是为什么这个问题呢? (有些工作可以删除这种依赖)

答案 1 :(得分:3)

您可以使用libudev或解析udevadm输出@Ambroz Bizjak建议。虽然,我建议不要添加额外的进程(stdbuf)和语言(NCD),只是为了解析udevadm的输出。

普通libudev和解析输出之间的步骤是修改udevadm源。该解决方案减少了所需的资源并完全跳过了解析过程。查看udev包时,您将在udev目录中找到udevd和udevadm的源代码。

在那里,您拥有udevadm.c中的主例程和udevadm monitorudevadm-monitor.c的来源。收到的每个活动都将通过print_device()打印。这是您插入代码的地方。

如果你的内存紧张,你可以删除controlinfosettletest-builtintest和{{}不需要的代码1}}。在我的系统(Ubuntu 12.04)上,这会将udevadm的大小减少大约75%。

答案 2 :(得分:-1)

不幸的是,连接/断开连接时没有产生udev事件,因此几乎不可能监视这些事件。
你可以监控内核消息(这似乎是疯狂的想法)。可能更好的方法是修改内核。

更新:我不明白为什么这个答案得到负面评价 也许有人混合USB主机部分(在设备插拔/拔出时产生UDEV事件)和USB设备/小工具部分(不会产生此类事件)
因此,如果您的Linux计算机作为小工具(连接到某些USB主机的USB设备)工作,则无法捕获插拔事件。

证明:message by Greg Kroah-Hartman