• 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项目当前目录下执行:

    1. ./autogen.sh
    2. ./configure
    3. make
    4. make DESTDIR=$PWD/out_x86_64 install

     这样就编译完了。生成文件内容为:

    1. └── usr
    2. └── local
    3. ├── include
    4. │   └── libusb-1.0
    5. │   └── libusb.h
    6. └── lib
    7. ├── libusb-1.0.a
    8. ├── libusb-1.0.la
    9. ├── libusb-1.0.so -> libusb-1.0.so.0.3.0
    10. ├── libusb-1.0.so.0 -> libusb-1.0.so.0.3.0
    11. ├── libusb-1.0.so.0.3.0
    12. └── pkgconfig
    13. └── libusb-1.0.pc

    2.2 aarch64交叉编译与移植

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

    @1 交叉编译方法

    需要先安装交叉编译器,如下所示:

    1. sudo apt install binutils-aarch64-linux-gnu-dbg binutils-aarch64-linux-gnu cpp-aarch64-linux-gnu \
    2. g++-10-aarch64-linux-gnu g++-9-aarch64-linux-gnu g++-aarch64-linux-gnu g++ \
    3. gcc-10-aarch64-linux-gnu-base gcc-9-aarch64-linux-gnu-base gcc-aarch64-linux-gnu \
    4. pkg-config-aarch64-linux-gnu qemu-efi-aarch64 gcc arch-test

    之后执行以下命令:

    1. ./configure --host=aarch64-linux-gnu --prefix=$PWD/out_aarch64/ \
    2. CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ --disable-udev
    3. make
    4. make install

     生成文件除了格式外和PC端都一样,搞定~~。

    @qemu虚拟机编译方法

    交叉编译器aarch64走了一遍,不通的原因在于缺少 libudev的支持,而再搞一个aarch64版本的libudev库比较麻烦,还要再下载源码编译啥的,省点事儿,咱直接就上虚拟机,搞一个aarch64的虚拟机,流程如下:

    1. #创建一个虚拟fs文件系统
    2. $sudo qemu-debootstrap --arch arm64 bullseye /mnt/data/arm64 http://deb.debian.org/debian/
    3. #进入到文件系统
    4. $sudo chroot /mnt/data/arm64/
    5. #退出文件系统
    6. $exit

    之后 执行 $sudo chroot /mnt/data/arm64/,进入到 虚拟机中,接下来执行和ubuntu PC端一样的流程,详细 如下所示:

    1. ./autogen.sh
    2. ./configure
    3. make
    4. make DESTDIR=$PWD/out_aarch64 install

     生成文件除了格式外和PC端都一样,搞定~~。

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

    使用lsusb找到对应的设备,如下所示:

    1. XXX/etc/udev/rules.d$ lsusb
    2. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    3. Bus 001 Device 038: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
    4. Bus 001 Device 039: ID 413c:2113 Dell Computer Corp. Dell KB216 Wired Keyboard
    5. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    记录下对应的idVendor和idProduct,比如第一行的idVendor和idProduct分别为:1d6b和0003。

    Linux修改USB设备节点权限

    1. cd /etc/udev/rules.d/
    2. vim XXX.rules

    内容如下:

    SUBSYSTEM=="usb",ATTRS{idVendor}=="1d6b", ATTRS{idProduct}=="0003",MODE="0666"
    

    之后执行命令:

    1. udevadm control --reload-rules
    2. udevadm trigger

    否则不生效。

  • 相关阅读:
    【玩转腾讯云】使用轻量应用服务器和calibre-web搭建个人在线图书馆
    ts json的中boolean布尔值或者int数字都是字符串,转成对象对应类型
    探索人工智能的深度神经网络:理解、应用与未来
    PingCAP Clinic 诊断服务简介
    刷题学习记录
    多线程使用
    mingw-gcc编译窗体和console
    MBR主引导记录
    【字符】压缩文本文件
    压力测试-JMeter的多种形式参数化
  • 原文地址:https://blog.csdn.net/vviccc/article/details/126411782