对于libusb库 的交叉编译,该项目难度并不大,但也有一些坑点。该文章目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,会用一些技巧来绕过正常的交叉编译,你问我为啥?因为交叉编译的时候有难解的问题,不是不能解决,而是代价相对qemu代价显得略大。老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux Debian 板子上。
@1 why,为什么要搞一个libusb出来呢?
最开始的时候 是只有usb内核层的驱动的,但是随着 应用和linux 内核之间 兼容性的矛盾不断升级,慢慢衍生出了libusb这么个东西。接下来我们详细讲讲这是咋回事儿~。
当使用我们产品的客户有多个linux内核平台,有2.4的、2.6的、3.2的,4.9的,随着平台数量的增加,你的工作量线性的增加,而且最为蛋疼的是还有好多客户自定义的版本,每一次新环境,新平台你就增加一次工作量,天天不用干别的了,就编译吧。但这可不行,一个优秀的工程师怎么会把大把时间放在无意义的事情上呢,于是呢,就搞了libusb,以后大家都用这个,都兼容这个,这样就不用干那些没啥卵用的活儿了。就这样一个标准库诞生了。
@2 what,libusb是啥?
libusb是给应用软件开发和usb驱动协同操作(在底层读取usb内容)的功能时提供的库。它设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能相差不大,只是libusb更加接近USB规范。使得libusb的使用也比开发内核驱动相对容易的多。
@3 how,libusb怎么用?
直接在github上下载项目:GitHub - libusb/libusb library
然后 跟着下面的步骤 编译后生成libusb的静态库和动态库,用户层库,根据需要使用即可。
首先确保环境没有问题,需要提前安装:
sudo apt install -y make dh-autoreconf libudev-dev
之后在libusb项目当前目录下执行:
./autogen.sh
./configure
make
make DESTDIR=$PWD/out_x86_64 install
这样就编译完了。生成文件内容为:
└── usr
└── local
├── include
│ └── libusb-1.0
│ └── libusb.h
└── lib
├── libusb-1.0.a
├── libusb-1.0.la
├── libusb-1.0.so -> libusb-1.0.so.0.3.0
├── libusb-1.0.so.0 -> libusb-1.0.so.0.3.0
├── libusb-1.0.so.0.3.0
└── pkgconfig
└── libusb-1.0.pc
说明:这里分享两种方法,交叉编译和虚拟机编译,这种方式也适用于大部分的交叉编译项目。
@1 交叉编译方法
需要先安装交叉编译器,如下所示:
sudo apt install binutils-aarch64-linux-gnu-dbg binutils-aarch64-linux-gnu cpp-aarch64-linux-gnu \
g++-10-aarch64-linux-gnu g++-9-aarch64-linux-gnu g++-aarch64-linux-gnu g++ \
gcc-10-aarch64-linux-gnu-base gcc-9-aarch64-linux-gnu-base gcc-aarch64-linux-gnu \
pkg-config-aarch64-linux-gnu qemu-efi-aarch64 gcc arch-test
之后执行以下命令:
./configure --host=aarch64-linux-gnu --prefix=$PWD/out_aarch64/ \
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ --disable-udev
make
make install
生成文件除了格式外和PC端都一样,搞定~~。
@qemu虚拟机编译方法
交叉编译器aarch64走了一遍,不通的原因在于缺少 libudev的支持,而再搞一个aarch64版本的libudev库比较麻烦,还要再下载源码编译啥的,省点事儿,咱直接就上虚拟机,搞一个aarch64的虚拟机,流程如下:
#创建一个虚拟fs文件系统
$sudo qemu-debootstrap --arch arm64 bullseye /mnt/data/arm64 http://deb.debian.org/debian/
#进入到文件系统
$sudo chroot /mnt/data/arm64/
#退出文件系统
$exit
之后 执行 $sudo chroot /mnt/data/arm64/,进入到 虚拟机中,接下来执行和ubuntu PC端一样的流程,详细 如下所示:
./autogen.sh
./configure
make
make DESTDIR=$PWD/out_aarch64 install
生成文件除了格式外和PC端都一样,搞定~~。
使用lsusb找到对应的设备,如下所示:
XXX/etc/udev/rules.d$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 038: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 039: ID 413c:2113 Dell Computer Corp. Dell KB216 Wired Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
记录下对应的idVendor和idProduct,比如第一行的idVendor和idProduct分别为:1d6b和0003。
Linux修改USB设备节点权限
cd /etc/udev/rules.d/
vim XXX.rules
内容如下:
SUBSYSTEM=="usb",ATTRS{idVendor}=="1d6b", ATTRS{idProduct}=="0003",MODE="0666"
之后执行命令:
udevadm control --reload-rules
udevadm trigger
否则不生效。