1

HID (USB) デバイスのシステム パスを動的に見つける方法を探しています。

私の Ubuntu マシンでは /dev/usb/hiddevX ですが、hiddevices が別の場所にマウントされるディストリビューションがあると思います。

具体的には、HID デバイスを開くために C プログラムでこれが必要です。これは、デバイスがどこにマウントされていても、すべてのシステムで機能するはずです。

現在の機能:

int openDevice(int vendorId, int productId) {

    char devicePath[24];
    unsigned int numIterations = 10, i, handle;

    for (i = 0; i < numIterations; i++) {

        sprintf(devicePath, "/dev/usb/hiddev%d", i);

        if((handle = open(devicePath, O_RDONLY)) >= 0) {

            if(isDesiredDevice(handle, vendorId, productId))
                break;

            close(handle);
        }
    }

    if (i >= numIterations) {
        ThrowException(Exception::TypeError(String::New("Could not find device")));
    }

    return handle;
}

うまく機能しますが、ハードコードされた/dev/usb/hiddevが好きではありません

編集:他の一部のプログラマーが /dev/usb/hid/hiddevX および /dev/hiddevX へのフォールバックを使用していることが判明したため、それらのフォールバックも組み込みました。

更新された方法:

/**
 * Returns the correct handle (file descriptor) on success
 *
 * @param int vendorId
 * @param int productId
 * @return int
 */
int IO::openDevice(int vendorId, int productId) {

    char devicePath[24];

    const char *devicePaths[] = {
        "/dev/usb/hiddev\%d",
        "/dev/usb/hid/hiddev\%d",
        "/dev/hiddev\%d",
        NULL
    };

    unsigned int numIterations = 15, i, j, handle;

    for (i = 0; devicePaths[i]; i++) {

        for (j = 0; j < numIterations; j++) {

            sprintf(devicePath, devicePaths[i], j);

            if((handle = open(devicePath, O_RDONLY)) >= 0) {

                if(isDesiredDevice(handle, vendorId, productId))
                    return handle;

                close(handle);
            }
        }
    };

    ThrowException(Exception::Error(String::New("Couldn't find device!")));
    return 0;
};
4

0 に答える 0