2011-08-19 141 views
8

你好我的工作与使用用于USB联网g_ether驱动程序的USB端口的嵌入式Linux设备上。Linux的USB连接/断开事件

当USB插头连接在dmesg的输出是:

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

当USB电缆被拔掉没有消息被写入到dmesg的。

用C我怎么能监听连接/断开事件?

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

+0

你至少有udev吗? – Keith

+0

不幸的是我没有。在没有udev的用户模式下,不可能听到这种类型的事件吗? –

+0

我相信这是获取内核事件的最佳方式。另一种方法是在[linux-hotplug](http://linux-hotplug.sourceforge.net/)中的旧版usbd。 – Keith

回答

4

如果您希望在单个进程中执行所有操作,则必须使用libudev从udevd或直接从内核获取事件。

看,这可能是在您的应用程序(?缺乏文档)使用libudev问题,另一种是使用udevadm程序,它可以:通过udevd处理后

  • 报告设备事件(udevadm monitor --udev --property
  • 报告devive直接从内核(udevadm monitor --kernel --property)事件,以及当前设备的
  • 转储的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打印类似的东西(与初始added事件对于已经任何USB设备插入):

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运行;但为什么这是一个问题呢? (有些工作可以删除此依赖关系)

2

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

plain libudev和解析输出之间的一个步骤是修改udevadm源。该解决方案减少了所需的资源,并完全跳过了解析过程。当您查看udev软件包时,您会在udev目录中找到udevd和udevadm的来源。

在那里,你有udevadm.c的主程序,udevadm-monitor.cudevadm monitor源。收到的每个活动都将通过print_device()打印。这是你插入你的代码的地方。

如果你的内存是紧张,可以去掉不需要的代码controlinfosettletest-builtintesttrigger。在我的系统(Ubuntu 12.04)上,这将udevadm的大小减少了大约75%。

-3

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

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

证明:message by Greg Kroah-Hartman

+0

来源?你能解释一下你的推理和从哪里开始实施吗? – bschlueter

+0

我编辑了我的答案以获得更详细的解释。如果您决定观看内核消息,则可以看到如何在dmesg源代码中继续/ proc/kmsg,或者可以使用某些syslog守护进程PLUS日志文件监视程序(如swatch)。 – edo1

相关问题