libusb_open возвращает «LIBUSB_ERROR_NOT_SUPPORTED» в Windows 7

Я разрабатывал драйверы USB с помощью LibUSB в Linux, но теперь я хочу, чтобы один из моих драйверов был скомпилирован для Windows (я делаю это впервые).

Моя среда

Я работаю над Windows 7, используя компилятор MinGW (также используя Dev-cpp IDE), и я Я использую предварительно скомпилированную библиотеку libusb, загруженную с эта ссылка.

Мое устройство. Это сенсорное устройство HID. Таким образом, для Windows драйверы не требуются. У меня есть дополнительная конечная точка для получения определенных данных отладки.

Мой код:

Я скомпилировал код для перечисления всех устройств и USB-устройств, подключенных к моей машине, и код работает. Теперь я добавляю код для открытия устройства, чтобы получить дескриптор устройства и начать общение. Но функция возвращает -12 То есть LIBUSB_ERROR_NOT_SUPPORTED.

Как я могу решить эту проблему?

Я искал в Интернете и не нашел определенного решения этой проблемы. Хотя это код, который прекрасно работает в Linux.

P.S.: я добавил весь код ниже. Функция DoList(); работает нормально, но функция GetTRSDevice(); дает сбой на libusb_open(dev, &handle);.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libusb.h>


libusb_device_handle* deviceHandle = NULL;

int DoList();
libusb_device_handle* GetTRSDevice(void);

int main()
{
    int ret = libusb_init(NULL);
    if (ret < 0) {
        printf("Failed to init libusb");
        return ret;
    }

    DoList();
    deviceHandle = GetTRSDevice();
    if(!deviceHandle) {
        printf("Failed to locate device");
        goto fail_dev_open;
    }

    printf("Device opened");

    libusb_close(deviceHandle);
    fail_dev_open:
        libusb_exit(NULL);

    return(ret);
}

int DoList()
{
    libusb_device **devs;
    ssize_t cnt;


    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0)
        return (int) cnt;

    libusb_device *dev;
    int i = 0;

    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(dev, &desc);
        if (r < 0) {
            fprintf(stderr, "failed to get device descriptor");
            return(-1);
        }

        printf("%04x:%04x (bus %d, device %d)\n",
               desc.idVendor, desc.idProduct,
               libusb_get_bus_number(dev), libusb_get_device_address(dev));
    }
    libusb_free_device_list(devs, 1);
    return 0;
}

libusb_device_handle* GetTRSDevice(void)
{
    int i = 0;
    ssize_t cnt;
    libusb_device *dev;
    libusb_device **devs;
    libusb_device_handle* handle = NULL;

    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0) {
        printf("Failed libusb_get_device_list");
        return(0);
    }

    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int ret = libusb_get_device_descriptor(dev, &desc);
        if (ret < 0) {
            printf("Failed libusb_get_device_descriptor");
            continue;
        }
        if(desc.idVendor == 0X238f && desc.idProduct == 1) {
            int ret = libusb_open(dev, &handle);
            if (ret < 0) {
                printf("Failed libusb_open: %d\n\r",ret);
                break;
            }
            #ifndef WIN32
                libusb_detach_kernel_driver(handle, 0);
            #endif
            ret = libusb_claim_interface(handle,0);
            if (ret < 0) {
                libusb_close(handle);
                handle=NULL;
                break;
            }
            break;
        }
    }
    libusb_free_device_list(devs, 1);
    return(handle);
}

person Prajosh Premdas    schedule 27.06.2013    source источник


Ответы (4)


Кажется, вам нужно установить драйвер winusb - libusb может получить информацию об устройствах без этого драйвера, но не может их открыть.

http://libusb.6.n5.nabble.com/LIBUSB-ERROR-NOT-SUPPORTED-td5617169.html:

В среду, 4 апреля 2012 г., в 23:52, Куан Фом Минь ‹[скрытая электронная почта]> написал:

хотя я никогда не устанавливаю драйвер winusb, но я использую libusb для получения информации о моем USB (USB Kingston, и уже распознается системой)

Да, это возможно. Но вы не можете открыть устройство и сделать дальнейшие действия. Это запутанная часть для новых пользователей в отношении libusb для Windows, а также для Mac OS X. libusb может получить некоторую базовую информацию об устройстве с неподходящим драйвером (например, запоминающее устройство USB), но не сможет открыть устройство, не заменив драйвер на поддерживаемый.

-- Сяофань

person antiduh    schedule 27.06.2013
comment
Спасибо за ответ. Насколько я понимаю от вас, если я разрабатываю этот драйвер и распространяю его как часть приложения. Тогда люди, использующие мое приложение, должны установить этот драйвер. - person Prajosh Premdas; 27.06.2013
comment
Казалось бы да, но я только usb в винде с родным win32 api делал. К вашему сведению, если у вас есть информация об устройстве и вы хотите иметь возможность открыть его для записи в него в win32, вызовите CreateFileEx для «пути» устройства, который обычно имеет вид \.\MyHidDevice (поскольку он находится в пространстве диспетчера объектов Windows). Поиграйте с WinObj, если вам интересно. - person antiduh; 27.06.2013
comment
Я считаю, что libusb в Windows - это серая зона, может кто-нибудь, пожалуйста, поделитесь со мной учебником, ссылками и т. Д., Для начала. Печально то, что для того, чтобы заставить libusb работать в Linux, требуется всего несколько минут, и люди предполагают то же самое в Windows. - person Prajosh Premdas; 27.06.2013
comment
Это сложно. Функции SetupDI, HidD_, HidP_ — это то, с чего вам следует начать. HidD_GetHidGuid, SetupDiGetClassDevs, SetupDIENumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail — это то, что вам нужно. - person antiduh; 27.06.2013
comment
У меня уже есть несколько протестированных и выпущенных драйверов, которые хорошо работают в Linux с libusb. У меня не хватает времени, чтобы переписать драйвер и в Windows. Так может ли кто-нибудь предложить мне лучший способ вперед. libusb в windows напоминает мне ящик Пандоры. - person Prajosh Premdas; 27.06.2013
comment
Должна быть возможность настроить установщик для установки правильных драйверов, чтобы он работал в Windows. - person antiduh; 27.06.2013
comment
Просто добавить. У меня установлен драйвер для оборудования, и я не могу заставить систему переопределить драйвер для нового драйвера winusb, как уже упоминалось. Если кто-то сталкивался с этой проблемой, поделитесь своим опытом здесь. - person Prajosh Premdas; 28.06.2013

Вы можете легко установить драйвер WinUSB или другие драйверы, поддерживаемые libusb (libusb-win32 и libusbK), с помощью приложения Zadig, которое было разработано специально для решения этой проблемы. См. https://zadig.akeo.ie.

Однако следует помнить одну вещь: если вы замените драйвер Mass Storage или HID-драйвер (который Windows устанавливает автоматически) на WinUSB, вы сможете получить доступ к своему устройству только через libusb и не сможете получить доступ к своему устройство как Mass Storage или HID, пока вы не удалите драйвер WinUSB.

Наконец, если у вас есть контроль над прошивкой вашего устройства, также можно создавать устройства, которые будут автоматически устанавливать драйвер WinUSB в Vista или более поздней версии, чтобы пользователям не приходилось выполнять установку драйвера вручную (для этого может потребоваться подключение к Центру обновления Windows для Windows 7 или более ранней версии, но должно работать даже без подключения к Интернету для Windows 8 или более поздней версии). См. https://github.com/pbatard/libwdi/wiki/WCID-Devices.

[ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ] Я являюсь автором Zadig/libwi, вики-страниц WCID, а также участником бэкенда libusb для Windows.

person Akeo    schedule 19.07.2014
comment
Могу ли я получить дигитайзер или мышь, которые также работают с этим драйвером? - person Prajosh Premdas; 22.07.2014
comment
Задиг работал отлично. Одна из проблем для меня заключалась в том, что я отключил службу Windows Update. Zadig нужна эта служба для установки WinUSB на ваше устройство. - person Gabe Halsmer; 15.04.2015
comment
Когда я перехожу по ссылке для загрузки Zadig, обнаруживается вирус: Вам не разрешено передавать файл zadig-2.4.exe, так как он заражен вирусом W32/Agent.QWHDAR!tr. - person John Mills; 28.11.2018
comment
Боюсь, это ложное срабатывание. Если вы получите человека от поставщика антивируса, которого вы используете, чтобы подтвердить наличие вируса, вы обнаружите, что они в конечном итоге укажут, что это было ложное срабатывание с их стороны. В любом случае, если вы считаете, что файл, который вы пытаетесь загрузить, заражен, вам обязательно следует связаться с поставщиком антивируса, чтобы он либо подтвердил, либо отозвал его. - person Akeo; 28.11.2018

У меня была такая же проблема, и она не была решена путем установки драйверов WinUSB с помощью Zadig.

Я постоянно обнаруживал, что libusb_open() возвращает LIBUSB_ERROR_NOT_SUPPORTED тогда и только тогда, когда у меня подключен приемник Logitech Unifying. в другой порт USB. Это приводит к тому, что серверная часть pyusb libusb1 вызывает исключение типа «NotImplementedError: операция не поддерживается или не реализована на этой платформе».

Я удалил приемник Logitech (поэтому я использую проводную клавиатуру), и проблема для меня решена. Я хотел бы знать, почему или как приемник Logitech может вызвать эту ошибку на другом USB-порту, но я этого не знаю.

person richarddonkin    schedule 11.02.2020

У меня была такая же проблема с неработающим Zadig. Я исправил это, подключив устройство напрямую к ноутбуку, а не через концентратор USB-C.

person Fritz    schedule 05.01.2021