背景
有个项目,需要在openwrt的linux系统中使用libusb与挂载的一颗芯片进行USB通信,我要尝试在应用层通过libusb与外挂芯片进行USB通信。
调研
网上刚开始检索时,有网友说openwrt上不能使用libusb,因为openwrt是裁剪的linux系统,没有usbfs、有的说因为没有 /proc/bus/usb目录,而libusb依赖这个目录,所以不能用... ...
我首先先看了下网友说的libusb这部分的源码,截取如下:
static const char *find_usbfs_path(void)
{
const char *path = "/dev/bus/usb";
const char *ret = NULL;
if (check_usb_vfs(path)) {
ret = path;
} else {
path = "/proc/bus/usb";
if (check_usb_vfs(path))
ret = path;
}
/* look for /dev/usbdev*.* if the normal places fail */
if (ret == NULL) {
struct dirent *entry;
DIR *dir;
path = "/dev";
dir = opendir(path);
if (dir != NULL) {
while ((entry = readdir(dir)) != NULL) {
if (_is_usbdev_entry(entry, NULL, NULL)) {
/* found one; that's enough */
ret = path;
usbdev_names = 1;
break;
}
}
closedir(dir);
}
}
... ...
... ...
}
通过以上代码可以看到,libusb其实会查找 /dev/bus/usb、/proc/bus/usb这2个目录,任意一个存在则说明可以支持,而我的系统就是存在 /dev/bus/usb而没有/proc/bus/usb,所以看起来是可以用的,于是开始移植libusb。
移植
下载libusb源码,我下载的版本是libusb-1.0.22
./configure --host=mips-openwrt-linux --disable-udev
make
如果要开启libusb的日志,config时加上--enable-debug-log 参数即可
我的板载的精简Linux系统不支持lsusb命令,所以我也将lsusb命令移植过去了,有点麻烦,依赖挺多的,需要移植udev、lsusb等,其中,我的udev选择的是eudev-3.2.9,lsusb选择的是usbutils-008,通过config配置usbutils时还要通过LIBUSB_CFLAGS、LIBUSB_LIBS指定libsub库路径,这部分的详细过程自行百度吧。
如果以上make出错,检查下makefile中的交叉编译器参数对不对、去掉-m32、-m64等参数。
测试结果
root@OpenWrt:~# ./a.out
[/home/xxx/USB-Code/SDK/src/usb.c]L0069:libusb_init success!
[/home/xxx/USB-Code/SDK/src/usb.c]L0076:libusb_get_device_list success: 0!
[/home/xxx/USB-Code/SDK/src/usb.c]L0088:find dev: vid = 2301 pid = 0709
[/home/xxx/USB-Code/SDK/src/usb.c]L0103:libusb_open success!
[/home/xxx/USB-Code/SDK/src/usb.c]L0118:libusb_claim_interface success!
[/home/xxx/USB-Code/SDK/src/usb.c]L0138:libusb_bulk_transfer ok, send_len = 8
[/home/xxx/USB-Code/SDK/src/usb.c]L0292:libusb_bulk_transfer ok, recv_len = 32
结论
还是要多尝试、多阅读源码、实践出真知!
最后需要注意下mips架构是大端,与x86、arm(默认小端)不同,通讯时注意下大小端的问题。