确定HID设备的系统路径

时间:2012-12-19 19:31:13

标签: c++ linux usb hid mount-point

我正在寻找一种动态查找HID(USB)设备系统路径的方法。

在我的Ubuntu机器上它是/ dev / usb / hiddevX,但我想有一些发行版可以在其他地方安装hiddevices。

更具体一点:我需要在C程序中打开HID设备 - 这应该适用于每个系统,无论设备安装在何处。

当前功能:

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

编辑:事实证明有些other programmers使用了回退到/ 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;
};

0 个答案:

没有答案