首页 > 解决方案 > 相当于 PyUSB usb.util.find_descriptor 的 libusb

问题描述

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 规范中没有看到任何类似的东西。在 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

似乎不起作用。

标签: c++usblibusb

解决方案


推荐阅读