【问题标题】:How to detect "Over Current" event of an USB device?如何检测 USB 设备的“过电流”事件?
【发布时间】:2011-09-20 12:59:26
【问题描述】:

我必须检测 USB 设备的“过电流”事件。

我正在使用 Linux 系统和 C/C++ 语言进行开发。

我该怎么做?

【问题讨论】:

  • 这完全取决于设备。这就像要求我们修车而不告诉我们是什么车。
  • 夜莺的权利。您用于访问设备的 USB 库(如果您使用库)也很重要
  • 我当然用的是 libusb-0.1.13!
  • 哦,当然是 libusb-0.1.13!我们怎么会傻到没有意识到。
  • 这取决于操作系统和 USB 主机驱动程序,但不取决于设备。这就像要求我们找出哪些汽车正在超速行驶。您必须告诉我们在哪条道路上设置限速器,但您不需要知道路上每辆车的品牌和型号。

标签: c++ linux usb libusb


【解决方案1】:

您可以使用uevents。这是一些tutorial。 要观看uevents,您必须绑定特定的NETLINK_KOBJECT_UEVENT

int create_socket()
{
    int                sock   = -1;
    int                result = 0;
    struct sockaddr_nl snl;

    memset(&snl, 0x00, sizeof(struct sockaddr_nl));
    snl.nl_family = AF_NETLINK;
    snl.nl_pid    = getpid();
    snl.nl_groups = -1;

    sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
    if (sock != -1)
    {
        result = bind(sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
        if (result < 0)
        {
            dbg("bind failed, exit\n");
            close(sock);
            sock = -1;
        }
    }
    else
        dbg("error getting socket, exit\n");
    return sock;
}

int main() {
...    
    sock = create_socket();
    while(sock != -1)
    {
        buflen = recv(sock, &buffer, sizeof(buffer), 0);
        // parse buffer for event description
        ...
    }
}

其中一个事件肯定会指示过电流状态。

【讨论】:

    【解决方案2】:

    它可能会帮助您查看特定根端口/主机控制器的源代码。

    例如:http://www.spinics.net/lists/linux-usb/msg49451.html 解释了使用特定主机控制器驱动程序的过流检测。

    【讨论】:

    • 谢谢,但它在内核中?!?用户空间有可用的接口吗?
    • @Gianfranco:内核的每个用户空间接口都有一些内核端代码。如果存在,您将通过查看驱动程序找到它。如果是 uevents,请查看 Rajish 的回答,了解如何在用户空间接收这些事件。但它可能很容易使用/proc/bus/usb 或其他一些接口。我不能告诉你你的驱动程序是否有用户空间接口,因为我不知道你的系统使用什么驱动程序。
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多