libusb_open gibt unter Windows 7 'LIBUSB_ERROR_NOT_SUPPORTED' zurück

Ich habe USB-Treiber mit LibUSB unter Linux entwickelt, aber jetzt möchte ich einen meiner Treiber für Windows kompilieren lassen (dies ist das erste Mal, dass ich das mache).

Meine Umgebung

Ich arbeite unter Windows 7 mit demMinGW Compiler (auch mit Dev-cpp IDE) und ich verwende eine vorkompilierte libusb-Bibliothek, die von heruntergeladen wurdedieser Link.

Mein Gerät: Es ist ein HID-Touch-Gerät. Für Windows sind also keine Treiber erforderlich. Ich habe einen zusätzlichen Endpunkt, um bestimmte Debug-Daten abzurufen.

Mein Code:

Ich habe einen Code kompiliert, um alle an mein Gerät angeschlossenen Geräte und USB-Geräte aufzulisten, und der Code funktioniert. Jetzt füge ich Code zum Öffnen des Geräts hinzu, sodass ich ein Gerätehandle erhalte und die Kommunikation beginne. Aber die Funktion gibt -12 zurück.LIBUSB_ERROR_NOT_SUPPORTED.

Wie kann ich dieses Problem beheben?

Ich habe im Internet gesucht und keine eindeutige Lösung für dieses Problem gefunden. Während es Code ist, der unter Linux wunderbar funktioniert.

P .: Ich habe den gesamten Code unten hinzugefügt. DasDoList(); Funktion funktioniert gut, aber dieGetTRSDevice(); Funktion schlägt bei fehllibusb_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);
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage