一、前言
我调试的一块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板子上运行,运行结果一看就知道怎么区分同一节点下的相同设备。