9

Linux で LibUSB を使用して USB ドライバーを開発してきましたが、現在、ドライバーの 1 つを Windows 用にコンパイルしたいと考えています (これは初めてです)。

私の環境

MinGWコンパイラ (Dev-cpp IDE も使用) を使用して Windows 7 で作業しており、このリンクからダウンロードしたコンパイル済みの libusb ライブラリを使用しています。

のデバイス: HID タッチ デバイスです。そのため、Windows にはドライバーは必要ありません。特定のデバッグ データを取得するための追加のエンドポイントがあります。

私のコード:

マシンに接続されているすべてのデバイスと USB デバイスを一覧表示するコードをコンパイルしましたが、コードは機能します。ここで、デバイス ハンドルを取得して通信を開始できるように、デバイスを開くコードを追加します。しかし、関数は -12 を返します。つまり、LIBUSB_ERROR_NOT_SUPPORTEDです。

この問題を解決するにはどうすればよいですか?

インターネットで検索しましたが、この問題の明確な解決策が見つかりませんでした。Linuxで美しく機能するコードですが。

PS:以下のコード全体を追加しました。関数は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);
}
4

4 に答える 4

0

これと同じ問題があり、Zadig で WinUSB ドライバーをインストールしても解決しませんでした。

一貫して、別の USB ポートにLogitech Unifying Receiverが接続されている場合にのみ、libusb_open() が LIBUSB_ERROR_NOT_SUPPORTED を返すことがわかりました。これにより、pyusb libusb1 バックエンドが「NotImplementedError: Operation not supported or unimplemented on this platform」のような例外を発生させます。

Logitech レシーバーを取り外したので (有線キーボードを使用しています)、問題は解決しました。Logitech レシーバーが別の USB ポートでこのエラーを引き起こす理由または方法を知りたいのですが、わかりません。

于 2020-02-11T09:18:33.387 に答える
0

Zadigが機能しないという同じ問題がありました。USB-Cハブを介さずに、デバイスをラップトップに直接接続することを修正しました

于 2021-01-05T11:58:16.440 に答える