gpt4 book ai didi

c - linux usb连接/断开事件

转载 作者:IT王子 更新时间:2023-10-29 00:07:11 27 4
gpt4 key购买 nike

你好,我正在开发一个带有 USB 端口的嵌入式 Linux 设备,该设备使用 g_ether 驱动程序进行 USB 联网。

当 USB 插头连接时,dmesg 输出为:

g_ether gadget: full speed config #2: RNDIS

当拔下 USB 电缆时,不会向 dmesg 写入任何消息。

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

嵌入式 linux 操作系统没有任何附加功能。没有 dbus 守护进程或热插拔辅助脚本。我什至不确定这些是否有帮助。

最佳答案

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

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

  • 在被udevd处理后报告设备事件(udevadm monitor --udev --property),
  • 直接从内核报告设备事件(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 打印出类似的内容(对于任何已插入的 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,并解析 this 标准输出 - 这比直接使用 udevadm 更容易处理。

请注意,NCD 本身使用 udevadm,并且它确实需要运行 udevd;但为什么这是一个问题呢? (通过一些工作可以消除这种依赖)

关于c - linux usb连接/断开事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7115731/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com