Linux aarch64交叉编译之libusb库

对于libusb库 的交叉编译,该项目难度并不大,但也有一些坑点。该文章目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,会用一些技巧来绕过正常的交叉编译,你问我为啥?因为交叉编译的时候有难解的问题,不是不能解决,而是代价相对qemu代价显得略大。老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux Debian 板子上。

1 libusb简介

@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的静态库和动态库,用户层库,根据需要使用即可。

2 Linux 本地编译 & 交叉编译

2.1 Linux(ubuntu20.04)上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

2.2 aarch64交叉编译与移植

说明:这里分享两种方法,交叉编译和虚拟机编译,这种方式也适用于大部分的交叉编译项目。

@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端都一样,搞定~~。

3 usb设备节点无root读写权限问题

使用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

否则不生效。

你可能感兴趣的:(Linux,系统,linux,debian,运维)