一、什么是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压缩文件即可,
2.源码编译
1. 将源码拷贝到编译环境中,进行解压:
sudo tar -xjf libusb-1.0.23.tar.bz2
解压后,进入文件目录,目录下文件结构如下:
这里重点部分来了!!!选择我们目标运行平台的交叉编译链工具,比如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目录下存放了静态链接库。结构如下:
判断以下静态库的架构:
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. 测试代码:
点击查看代码- #include <stdio.h>
- #include <stdlib.h>
- #include "libusb.h"
- int main() {
- libusb_context *ctx = NULL;
- libusb_device **devs;
- ssize_t cnt;
- // 初始化libusb
- if (libusb_init(&ctx) < 0) {
- fprintf(stderr, "Failed to initialize libusb\n");
- return 1;
- }
- // 获取设备列表
- cnt = libusb_get_device_list(ctx, &devs);
- if (cnt < 0) {
- fprintf(stderr, "Failed to get device list\n");
- libusb_exit(ctx);
- return 1;
- }
- // 打印设备信息
- for (ssize_t i = 0; i < cnt; ++i) {
- struct libusb_device_descriptor desc;
- if (libusb_get_device_descriptor(devs[i], &desc) == 0) {
- printf("Device %d: VendorID=%04x ProductID=%04x\n", (int)i, desc.idVendor, desc.idProduct);
- }
- }
- // 释放设备列表
- libusb_free_device_list(devs, 1);
- // 清理libusb
- libusb_exit(ctx);
- return 0;
- }
复制代码 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
现象应该如下:
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |