ARMV8-64嵌入式设备linux环境下libusb交叉编译与移植测试

目的:本博客所实现的功能是在嵌入式设备(Navida jetson nano)上使用libusb识别自制的麦克风阵列

libusb是一个跨平台的usb通讯库,我们在使用笔记本电脑来识别常用标准化设备(鼠标,键盘,kinect)等设备时,一般通过lsusb就可以将每个硬件检测出啦。但是对于自己研制的硬件如摄像头和麦克风,PC或嵌入式设备上并没有为它做过驱动,这个时候我们需要使用libusb库来进行设备检测和通讯。

1. 在PC(台式机或笔记本)上进行的操作:

1.安装libudev-dev

$ sudo apt-get install libudev-dev

2. 安装交叉编译链工具

首先进行编译链工具,交叉编译链需要根据主机和目标机的类型不同来进行选择,常用的交叉编译链如下几种:
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

结果如下,可见我们选择的是正确的
在这里插入图片描述

3.下载和解压libusb源码

下载网站为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

4. 检查和配置libusb的编译和安装环境:

$ ./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文件,该文件用于后续的编译和安装。

5 libusb编译和安装

最后依次执行如下命令即可完成编译和安装:

$ sudo make
$ sudo make install 

编译和安装完成后,可以在我们之前新建的install目录下看到多了几个文件目录,如下:
在这里插入图片描述
在lib中的即为动态库文件,在include中即为头文件。

6. 下载和解压libusb-compat-0.1.4

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

7.检查和配置libusb-compat的编译和安装环境

执行如下命令,进行环境检测和配置:

$  ./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目录。

8 libusb-compat 编译和安装

最后依次执行如下命令即可完成编译和安装:

$ sudo make
$ sudo make install 

编译和安装完成后,可以在我们之前新建的install目录下看到多了几个文件目录,如下:
在这里插入图片描述可以发现在include中多了usb.h文件。

9 打包和移植

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 jetbot@192.168.1.112:/usr/lib

4)为了进行测试,我们可以将libusb-1.0.22目录中examples中的listdevs.c也拷贝到嵌入式设备中:

$ cd examples
$ scp listdevs.c jetbot@192.168.1.112:/home/jetbot

其中,jetbot为目标机(嵌入式linux)设备的用户名,192.168.1.112为ip地址,/usr/lib是指将libusb放入系统默认库路径中,/home/jetbot是要将测试文件拷贝到目标机的主目录中。

2. 在嵌入式设备(jetson nano)上进行的操作:

10.嵌入式设备上测试:

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

如图所示,是本人在测试时候的结果,可见其根据libusb将自制的硬件设备检测出来了。
在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值