libusb 相当于 PyUSB usb.util.find_descriptor

问题描述

PyUSB 有一个名为 usb.util.find_descriptor 的小实用函数,顾名思义,它允许我搜索具有特定条件的描述,例如:

ep = usb.util.find_descriptor(
    intf,# match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

我需要在使用 libusb 构建的 C++ 应用程序中使用相同的功能。但是我在 libusb API specification 中没有看到任何类似的东西。在 libusb 之上实现相同功能的最简单方法是什么?

我使用的是 Linux,如果这有区别的话。但是,除非严格要求,否则我宁愿不添加任何额外的依赖项。

更新

这是我目前所拥有的:

  libusb_config_descriptor* config;
  int ret = libusb_get_config_descriptor(m_dev,0 /* config_index */,&config);
  if (ret != LIBUSB_SUCCESS) {
    raise_exception(std::runtime_error,"libusb_get_config_descriptor() Failed: " << usb_strerror(ret));
  }

  // Do not assume endpoint_in is 1
  const libusb_interface *interface = config->interface;
  const libusb_interface_descriptor configuration = interface->altsetting[0];
  for(int i = 0; i < configuration.bNumEndpoints; ++i) {
    const libusb_endpoint_descriptor endpoint = configuration.endpoint[i];

    if ((endpoint.bEndpointAddress & LIBUSB_ENDPOINT_IN) == LIBUSB_ENDPOINT_IN) {
      endpoint_in = endpoint.bEndpointAddress >> 8; // 3 first bytes
      log_debug("endpoint_in: " << endpoint_in); 
    }
  }

迭代就是这样工作的,尽管它看起来很丑陋,而且大部分是不可重用的。此外,使用以下命令提取端点编号:

endpoint_in = endpoint.bEndpointAddress >> 8; // 3 first bytes

似乎不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)