找回密码
 立即注册
首页 业界区 安全 RK35XX 嵌入式linux移植usblib

RK35XX 嵌入式linux移植usblib

少屠 2025-9-26 11:32:53
一、什么是libusb

libusb 是一个开源的、跨平台的用户态 USB 设备访问库,允许应用程序直接与 USB 设备通信,无需依赖内核驱动。
这对于开发者简化了对于复杂的USB驱动的编写。而且可移植性非常好,不会出现我在A内核版本设备下编译的驱动,拿到B内核版本设备下不能运行的问题。
二、libusb的开发形式

libusb支持多平台,包括但不限于linux(arm+x86)、Windows、Android等。
libusb以源码形式开源,通过编译平台的编译链工具对源码进行编译生成静态链接库,拿到静态链接库就可以开发自己的应用了。
下面以嵌入式linux平台(RK35XX)为例介绍移植、使用过程.
二、如何在嵌入式linux设备上移植libusb

1.源码获取

libusb的源码托管在GitHub上,链接地址如下:
[https://github.com/libusb/libusb/releases]
选择一个版本的tar.bz2压缩文件即可,
1.png

2.源码编译

1. 将源码拷贝到编译环境中,进行解压:

sudo tar -xjf libusb-1.0.23.tar.bz2
解压后,进入文件目录,目录下文件结构如下:
2.png

这里重点部分来了!!!选择我们目标运行平台的交叉编译链工具,比如RK平台的交叉编译链工具为:aarch64-linux-gnu
一定需要确保你的编译平台已经正确安装了该交叉编译链工具,在shell中输入aarch几个关键字后TAB键可以自动补全就说明已经安装好交叉编译链工具了。
2.接下来,我们生成Makefile

在根目录下输入以下命令:
./configure --host=aarch64-linux-gnu --disable-udev --prefix=/home/.../libusb_install
其中:
--host 参数后面跟的指定交叉编译链工具前缀,这里我们选择的是aarch64-linux-gnu
--disable-udev 是关闭udev编译,有些编译环境没有该库,会导致报错
--prefix 参数后面跟的是静态链接库的安装位置,默认的话放在/usr/lib目录下了,需要注意的是,该目录一定需要存在,且为空目录,否则后面的make install会失败。
3. 编译

在源码根目录下执行以下命令:
sudo make
4. 安装

在源码根目录下执行以下命令:
make install
如果没有报错,会在你的安装目录下生成include、lib两个目录,
其中include里,存放了usblib的头文件,lib目录下存放了静态链接库。结构如下:
3.png

判断以下静态库的架构:
file /home/.../usb_lib_installed/lib/libusb-1.0.so.0.2.0
结果应该输出为:
ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=007c750c75544f910a8fb574b6231d19ab69ee79, with debug_info, not stripped
至此,我们就完成了RK平台的usblib的编译过程,我们就可以用静态链接库和头文件去开发自己的应用了。
3. usblib的开发

这里我们就以获取usb设备列表并打印为例,说明usblib库的使用及编译。
1. 测试代码:

点击查看代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "libusb.h"
  4. int main() {
  5.     libusb_context *ctx = NULL;
  6.     libusb_device **devs;
  7.     ssize_t cnt;
  8.     // 初始化libusb
  9.     if (libusb_init(&ctx) < 0) {
  10.         fprintf(stderr, "Failed to initialize libusb\n");
  11.         return 1;
  12.     }
  13.     // 获取设备列表
  14.     cnt = libusb_get_device_list(ctx, &devs);
  15.     if (cnt < 0) {
  16.         fprintf(stderr, "Failed to get device list\n");
  17.         libusb_exit(ctx);
  18.         return 1;
  19.     }
  20.     // 打印设备信息
  21.     for (ssize_t i = 0; i < cnt; ++i) {
  22.         struct libusb_device_descriptor desc;
  23.         if (libusb_get_device_descriptor(devs[i], &desc) == 0) {
  24.             printf("Device %d: VendorID=%04x ProductID=%04x\n", (int)i, desc.idVendor, desc.idProduct);
  25.         }
  26.     }
  27.     // 释放设备列表
  28.     libusb_free_device_list(devs, 1);
  29.     // 清理libusb
  30.     libusb_exit(ctx);
  31.     return 0;
  32. }
复制代码
2. 编译APP

使用RK35XX平台的交叉编译链工具对我们的APP进行编译:
aarch64-linux-gnu-gcc usb_wr_test.c -o usb_wr_testAPP -L./usb_lib_1.0.0.23_install/lib/ -lusb-1.0 -I./usb_lib_1.0.0.23_install/include/libusb-1.0.so.0.2.0
-L 参数路径必须包含 libusb-1.0.so 或 libusb-1.0.so.0。
-I 参数路径必须包含 libusb.h(路径末尾的 libusb-1.0 是必须的)。
如果编译失败,请检查-L 和-I的目录是否为usblib的安装目录。
若提示找不到lusb-1.0,请检查静态链接库的架构,是否为 arm 64bit
判断以下静态库的架构:
file /home/.../usb_lib_installed/lib/libusb-1.0.so.0.2.0
编译成功后,会在本目录下生成usb_wr_testAPP 的目标文件,我们通过ADB、SSH等方式拷贝至目标板卡中。
3. 运行

通过串口、adb等方式登录到RK板卡中后,给usb_wr_testAPP 赋予可执行权限:
chmod +x usb_wr_testAPP
随后,插入一个USB设备,运行APP:
./usb_wr_testAPP
现象应该如下:
4.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册