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);
}