9

私はlibusbを使用して、いくつかのusbデバイスを列挙します。今、私は「デバイスパス」を取得するのが好きです。私はグーグルで成功しなかったので、私はそれがusbdevice-pathと呼ばれていないと思います。

USBデバイスをLinuxに接続すると、にメッセージが表示されます。これは、USB温度センサー(このようなもの)を使用したこのdmesgような「デバイスパス」の例です。

USBポートに直接: [68448.099682] generic-usb 0003:0C45:7401.0056: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.0-1/input0=> 12.0-1

別のポートに直接: [68560.853108] generic-usb 0003:0C45:7401.0058: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:13.0-1/input0=> 13.0-1

最初に使用されたポートのUSBハブへ: [68600.245809] generic-usb 0003:0C45:7401.005A: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4/input0=> 12.2-1.4

同じUSBハブの別のポートへ: [68647.925092] generic-usb 0003:0C45:7401.005C: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3/input0=> 12.2-1.3

以前に使用されたusbハブ上のusbハブへの今: [68740.715518] generic-usb 0003:0C45:7401.005E: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4/input0=> 12.2-1.4.4

簡単に言うと、カーネルメッセージには、物理​​的なUSBデバイスの場所への一意のパスが常に含まれています(前の太字のテキストを参照)。libusbを介してユーザースペースでこの「パス」を取得することは可能ですか?struct usb_busとで色んなことをやってみましstruct usb_deviceたが、いつも失敗しました。

これらのUSB温度計の複数を識別するためにこれが必要です。これは、一意のシリアル番号がなく、実行時に「再接続」するだけで、異なるUSBIDを取得する場合があるためです。ですから、それらを識別する唯一の方法は、物理的な場所を経由することだと思います。

助けてくれてありがとう、

よろしくケビンM。

-編集-

現在、次のコードを使用してUSBデバイスを検索しています。

usb_dev_handle *find_lvr_winusb() {

     struct usb_bus *bus;
        struct usb_device *dev;

        for (bus = usb_busses; bus; bus = bus->next) {
        for (dev = bus->devices; dev; dev = dev->next) {
                        if (dev->descriptor.idVendor == VENDOR_ID && 
                                dev->descriptor.idProduct == PRODUCT_ID ) {
                                usb_dev_handle *handle;
                                if(debug) {
                                  printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n", VENDOR_ID, PRODUCT_ID);
                                    printf("INFO: %d\n", dev->bus->location);
                                    printf("INFO: %d %s\n", bus->location, bus->dirname);
                                }

                                if (!(handle = usb_open(dev))) {
                                        printf("Could not open USB device\n");
                                        return NULL;
                                }
                                return handle;
                        }
                }
        }
        return NULL;
}

しかし、このコードでは、一意の物理位置IDを取得できません。はbus->location整数を返します(bus-> dirnameには同じものが含まれますが、文字列として)。これは一意ではありません。私はusbに階層があり、dmesgiでこの階層パスを見ることができることを知っています。

libusbを使用すると、バスID(?)と一部のデバイスIDしか取得できません。しかし、これらの温度センサーを2つ以上識別する必要があるため、役に立ちません。温度センサーが接続をリセットし(5〜60秒ごと)、バスIDが一意でない場合、デバイスIDは常に変化します。残念ながら、温度センサーには一意のシリアルIDがありません。

したがって、物理パスがデバイスを識別する唯一の方法だと思います。

よろしくケビンM。

4

3 に答える 3

7

libusb 1.0.12以降、libusb_get_port_path()が導入され、1.0.16では、バストポロジをクエリできるlibusb_get_port_numbers()に置き換えられました。

于 2014-07-07T10:50:03.357 に答える
3

sysfs構造パスの全体的な夏:

1-1.3:1.0

|_usb root hub - bus number - 1
  |_ port number - 1 of root hub
    |_port number - 3 of intermediate hub
      |_current configuration number - 1
        |_ current interface number - 0

詳細はこちら

于 2015-04-08T14:11:19.530 に答える
0

ここのように、それは可能です

すべてのバスですべてのUSBデバイスをスキャンするだけです。必要なVID/PIDが見つかったら、それがデバイスです。

または、もっと簡単にすることもできます。デバイスを接続するときに/ dev/thermoXのようなシンボリックリンクを作成するudev-ruleを記述します。後で必要なのは、必要な/ dev/thermoXを開くことだけです。

于 2013-01-11T14:12:57.707 に答える