一、前言

  我调试的一块ARM板上接了一个USBHUB,这个USBHUB上连接了3块相同的网卡,系统启动后这3块网卡会被自动按顺序命名为ethx,应用程序是根据网卡名区分不同的网卡的,但是如果某个网卡坏了,那么系统依然是按照已有的网卡进行排序,这样一来网卡名称就会乱掉。需要做的是将网卡名称和硬件上网卡所在位置进行对应,因此需要有一种方法知道哪张网卡在哪个位置。

  网上查找资料说需要移植一个libusb库,在移植过程中查找资料也遇到一些坑,在这里我将我测试通过的方法写下来。

  我的虚拟机环境是Ubuntu18.04。

二、下载libusb库

  网上各种乱七八糟的下载,就这个好用:

  https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.23/

  

三、编译libusb

  先解压:tar xvf libusb-1.0.23.tar.bz2

  进入libusb-1.0.23目录下配置:

   ./configure --build=x86_64 --host=arm-linux --prefix=/mnt/hgfs/share/USB/libusb-tool CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ --disable-udev

  参考这篇文章:https://blog.csdn.net/weixin_43767587/article/details/107128937?spm=1001.2014.3001.5502

  网上有些文章写的要安装udev,其实不需要,加入--disable-udev参数即可

  然后make

  再sudo make install

  这样一来/mnt/hgfs/share/USB/libusb-tool这个路径下就有东西了,其目录结构如下:

  

   其中libusb.h是需要包含的文件夹,lib目录下是编译出来的库

四、测试程序

  测试程序参考这篇文章(但是不参考编译过程):https://blog.csdn.net/fengbingchun/article/details/105712776

  我对其进行了简单的修改,使其能直接用:

  example.c

 1 #include <stdio.h>
 2 //#include "funset.hpp"
 3 #include "libusb.h"
 4  
 5 int test_libusb_get_devices_list()
 6 {
 7     // reference: examples/listdevs.c
 8     int ret = libusb_init(NULL);
 9     if (ret != 0) {
10         fprintf(stderr, "fail to init: %d\n", ret);
11         return -1;
12     }
13  
14     libusb_device** devs = NULL;
15     ssize_t count = libusb_get_device_list(NULL, &devs);
16     if (count < 0) {
17         fprintf(stderr, "fail to get device list: %d\n", count);
18         libusb_exit(NULL);
19         return -1;
20     }
21  
22     libusb_device* dev = NULL;
23     int i = 0;
24  
25     while ((dev = devs[i++]) != NULL) {
26         struct libusb_device_descriptor desc;
27         ret = libusb_get_device_descriptor(dev, &desc);
28         if (ret < 0) {
29             fprintf(stderr, "fail to get device descriptor: %d\n", ret);
30             return -1;
31         }
32  
33         fprintf(stdout, "%04x:%04x (bus: %d, device: %d) ",
34             desc.idVendor, desc.idProduct, libusb_get_bus_number(dev), libusb_get_device_address(dev));
35  
36         uint8_t path[8];
37         ret = libusb_get_port_numbers(dev, path, sizeof(path));
38         if (ret > 0) {
39             fprintf(stdout, "path: %d", path[0]);
40             for (int j = 1; j < ret; ++j)
41                 fprintf(stdout, ".%d", path[j]);
42         }
43         fprintf(stdout, "\n");
44     }
45  
46     libusb_free_device_list(devs, 1);
47     libusb_exit(NULL);
48  
49     return 0;
50 }
51 
52 
53 int main()
54 {
55     test_libusb_get_devices_list();
56     return 0;
57 }

  编译:aarch64-linux-gnu-gcc example.c -I /mnt/hgfs/share/USB/libusb-tool/include/libusb-1.0/ -L /mnt/hgfs/share/USB/libusb-tool/lib/ -lusb-1.0 -lpthread -o libusb_test

  生成的libusb_test拷贝到arm板子上运行,运行结果一看就知道怎么区分同一节点下的相同设备。