Libusb как получить VID и PID - PullRequest
0 голосов
/ 21 марта 2019

У меня есть код, который может найти все подключенные USB-устройства, их VendorID и ProductID.

Мне нужна программа, которая может найти подключенное устройство по VID и PID с монитора или сенсорной панели. Я нашел libusb_class_code, в котором есть видео класса, но я не нашел ни одной функции, которая возвращает libusb_class_code.

libusb_context *context = nullptr;
libusb_device **list = nullptr;

libusb_init(&context);
int count = libusb_get_device_list(context, &list);

for (size_t idx = 0; idx < count; ++idx)
{
    libusb_device *device = list[idx];
    libusb_device_descriptor desc = { 0 };

    libusb_get_device_descriptor(device, &desc);

    cout << "idVendor  " << desc.idVendor << "\t";
    cout << "idProduct " << desc.idProduct << endl;

}

1 Ответ

0 голосов
/ 21 марта 2019

Если вы хотите получить доступ к данному устройству по VID и PID, есть специальная функция libusb_open_device_with_vid_pid.

Это простой пример, который показывает, как открыть устройствообработайте интерфейс, прочитайте данные и закройте его.

libusb_context       *context    = NULL   ;
libusb_device_handle *dev_handle = NULL   ;
libusb_device        **devs               ;
int                  rc          = 0      ;
ssize_t              count                ; //holding number of devices in list

//----------------------------------------------------------------------------
// Initialize the library
//----------------------------------------------------------------------------
rc = libusb_init(&context);
assert(rc == 0);

//----------------------------------------------------------------------------
// open usb device by vendor ID and Product ID
//----------------------------------------------------------------------------
dev_handle = libusb_open_device_with_vid_pid(context,VENDOR_ID,PRODUCT_ID);
assert(dev_handle == NULL);

//----------------------------------------------------------------------------
// Check that the kernel is attached
//----------------------------------------------------------------------------
if(libusb_kernel_driver_active(dev_handle, 0))
{
    rc = libusb_detach_kernel_driver(dev_handle, 0); // detach driver
    assert(rc == 0);
}

//----------------------------------------------------------------------------
// claim the interface
//----------------------------------------------------------------------------
rc = libusb_claim_interface(dev_handle, 0);
assert(rc < 0);

//----------------------------------------------------------------------------
// start the bulk transfer
//----------------------------------------------------------------------------
rc = libusb_bulk_transfer(dev_handle, (64 | LIBUSB_ENDPOINT_OUT), data, 4, &actual, 0);
assert (rc != 0 || actual != 5);

//----------------------------------------------------------------------------
// release the interface before closing the device
//----------------------------------------------------------------------------
rc = libusb_release_interface(dev_handle, 0);
assert(rc != 0);

//----------------------------------------------------------------------------
// close the device
//----------------------------------------------------------------------------
libusb_close(dev_handle);

//----------------------------------------------------------------------------
// exit
//----------------------------------------------------------------------------
libusb_exit(context);


...