libusb是一个跨平台的usb通讯库,我们在使用笔记本电脑来识别常用标准化设备(鼠标,键盘,kinect)等设备时,一般通过lsusb就可以将每个硬件检测出啦。但是对于自己研制的硬件如摄像头和麦克风,PC或嵌入式设备上并没有为它做过驱动,这个时候我们需要使用libusb库来进行设备检测和通讯。
$ sudo apt-get install libudev-dev
首先进行编译链工具,交叉编译链需要根据主机和目标机的类型不同来进行选择,常用的交叉编译链如下几种:
1) arm-none-linux-gnueabi-gcc :是 Codesourcery 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
2) arm-linux-gnueabihf-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
3) aarch64-linux-gnu-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARMv8 64位目标中的裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
4) arm-none-elf-gcc:是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
5) arm-none-eabi-gcc:是 GNU 推出的的ARM交叉编译工具。可用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
在这里,本人使用的嵌入式设备系统为ARMv8,且为64位,所以在这里选择aarch64-linux-gnu-gcc,所以执行如下命令进行安装:
$ sudo apt-get install g++-aarch64-linux-gnu
$ sudo apt-get install gcc-aarch64-linux-gnu
如果上述安装方法遇到问题,可以尝试源码安装,需要在官网(下载较慢)或网站(速度较快)下载。
安装完成后,我们可以执行如下命令检查一下
$ aarch64-linux-gnu-gcc -v
下载网站为https://sourceforge.net/projects/libusb/,在这里我选择了libusb-1.0.22.tar.bz2。然后按下面四步进行设置:
1)在主目录下新建一个libusb文件夹:
$ mkdir libusb
2)首先切换到源码文件夹的路径:
$ cd libusb
然后将libusb源码包解压缩后放入libusb中。其目录即为/home/ebort/libusb/libusb-1.0.22,其中ebort为本人用户名。
3)切换到libusb-1.0.22文件夹下:
$ cd libusb-1.0.22
4)在该目录下新建一个文件夹,用来存放我们即将编译和安装后的文件:
$ mkdir install
$ ./configure --build=i686-linux --host=arm-linux --prefix=/home/ebort/libusb/libusb-1.0.22/install CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ --disable-udev
可以看到在./configure中,添加了很多的参数,这些参数含义如下:
--build:表示目前先在x86系统上进行编译,64位或32位ubuntu系统均可
--host:表示将要运行在arm架构的嵌入式设备上,在这里我们需要提前获取到目标设备的系统,本人为ARMv8,且为64位。
--prefix 是指要将编译后的库文件等放置在哪,这里我的地址为/home/ebort/libusb/libusb-1.0.22/install,
CC 为编译.c文件所使用的交叉编译链,直接指定我们刚下载的编译链即可
CXX:为编译.cpp文件所使用的交叉编译链,也是直接指定我们刚下载的编译链即可
在配置完后,可以看到在该目录中多了Makefile文件,该文件用于后续的编译和安装。
最后依次执行如下命令即可完成编译和安装:
$ sudo make
$ sudo make install
编译和安装完成后,可以在我们之前新建的install目录下看到多了几个文件目录,如下:
在lib中的即为动态库文件,在include中即为头文件。
1)在我们上一步编译出的include里面没有usb.h文件!这需要我们再额外编译0.1系列的compat兼容支持包,用它来产生usb.h。
首先下载libusb-compat-0.1.4或0.1.5版本,在官网上下载或从如下网站下载:https://download.csdn.net/download/weixin_43046653/11262040。
2) 然后将libusb-compat-0.1.4源码包解压缩后放入libusb中。其目录即为/home/ebort/libusb/libusb-compat-0.1.4,其中ebort为本人用户名。
3)切换到libusb-compat-0.1.4文件夹下:
$ cd libusb-compat-0.1.4
执行如下命令,进行环境检测和配置:
$ ./configure --build=i686-linux --host=arm-linux --prefix=/home/ebort/libusb/libusb-1.0.22/install CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ PKG_CONFIG_PATH=/home/ebort/libusb/libusb-1.0.22/install/lib/pkgconfig
可以看到在./configure中,添加了很多的参数,大部分参数和我们在配置libusb时的参数相同,不需要更改,只需要在尾部添加配置路径即可,这个路径也正是我们在libusb安装路径中生成的pkgconfig目录。
最后依次执行如下命令即可完成编译和安装:
$ sudo make
$ sudo make install
编译和安装完成后,可以在我们之前新建的install目录下看到多了几个文件目录,如下:
可以发现在include中多了usb.h文件。
1)首先切换到libusb-1.0.22目录下:
$ cd ~/libusb/libusb-1.0.22/
2)然后将install文件夹进行压缩:
$ tar jcvf libusb.tar.bz install
3)之后将压缩包拷贝到嵌入式设备上,使用scp命令:
$ scp libusb.tar.bz [email protected]:/usr/lib
4)为了进行测试,我们可以将libusb-1.0.22目录中examples中的listdevs.c也拷贝到嵌入式设备中:
$ cd examples
$ scp listdevs.c [email protected]:/home/jetbot
其中,jetbot为目标机(嵌入式linux)设备的用户名,192.168.1.112为ip地址,/usr/lib是指将libusb放入系统默认库路径中,/home/jetbot是要将测试文件拷贝到目标机的主目录中。
1)首先将从PC上拷贝过来的libusb压缩包解压缩,解压缩的路径自选,在这里我还是主目录下:
$ cd ~/usr/lib
$ tar libusb.tar.bz
2) 然后对我们拷贝进来的测试案例listdevs.c进行测试:
$ cd /home/jetbot
$ gcc -I/usr/lib/libusb/include/libusb-1.0 listdevs.c -L/usr/lib/libusb/lib -lusb-1.0
在gcc后面有几个参数,分别如下:
-I(i的大写,不是1)后面紧跟测试文件listdevs.c代码中#include要包含的头文件的存放地址/usr/lib/libusb/include/libusb-1.0
-L(大写的L)后面紧跟动态库文件的存放地址/usr/lib/libusb/lib
该过程执行完毕后,会在该目录中生成一个可执行文件a.out
3)运行测试:
执行如下命令,观察输出是否将嵌入式设备上插的所有usb硬件检测出来,即检测出来设备的PID和VID
$ ./a.out