一、前言
基于Linux 平台USB驱动开发,主要有内核驱动的开发和libusb的无驱设计;首先为什么要选第三方库Libusb,可能是基于Libusb的程序只涉及到应用层,使用起来更加方便;如果是在内核驱动,就要考虑到内核大小、内核版本的兼容,如果客户需要把你的USB模块加入他们的平台,那岂不是还要重新根据客户要求裁剪、编写内核?又假如有许多客气,而且每个客气的平台不一样,那是不是需要为每个客户定制一个内核呀?所以……
记得前两天一直在搭建基于S5P4418平台Embedded arm_5.8QT和Embedded host_ 5.8QT,感触最多就是装的Linux环境和编译器版的不同,结局就可能会不同,不清楚开发环境对本文的例子的例子有多大的影响,我还是负责任地贴出我的环境,还介绍了UBS设备的连接以及库文件的安装。
环境: windows7_32bit+VMware_10.0.1_32bit+Ubuntu_12.04.5 LTS_32bit
编译器: gcc与g++ version 4.9.4
二、USB设备与虚拟机Linux的连接
USB工作模式:①存储模式,②传输模式。
要读取USB所传的实时数据,把UBS的模式设置为传输模式;
在Linux上所读到USB的Vid与Pid值,是用来寻找相匹配的USB设备,endpoint是在传输数据时需要用到的端口。
三、第三方Libusb-1.0.9库的安装
下载源码包libusb-1.0.9.tar.bz2,用tar -xvf命令解压任意文件夹,进入解压的文件夹运行①./configure②make③make install;安装的头文件与库文件一般在/usr目录下,④cd /usr⑤find -name “libusb.h“可以找到安装库的头文件,动态库.so文件一般头文件上层目录的lib目录下,为什么要这样?等下用到的时候再作解释;
在测试libusb库的时候,直接用gcc编译出现fatal error: libusb.h: No such file or directory,上面所提到的头文件与动态库文件路径就有用了,编译的时候添加 -I/头文件路径与-L/动态库文件路径,编译OK。当然,理论上应该可以把它们的路径加入环境变量,由于时间有限……
可以看到example中的demo能正常运行了~
Libusb库example测试源码
#include <stdio.h>
#include <sys/types.h>
#include <libusb.h>
static void print_devs(libusb_device **devs)
{
libusb_device *dev;
int i = 0;
while ((dev = devs[i++]) != NULL) {
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(dev, &desc);
if (r < 0) {
fprintf(stderr, "failed to get device descriptor");
return;
}
printf("%04x:%04x (bus %d, device %d)\n",
desc.idVendor, desc.idProduct,
libusb_get_bus_number(dev), libusb_get_device_address(dev));
}
}
int main(void)
{
libusb_device **devs;
int r;
ssize_t cnt;r = libusb_init(NULL);
if (r < 0)
return r;
cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0)
return (int) cnt;
print_devs(devs);
libusb_free_device_list(devs, 1);
libusb_exit(NULL);
return 0;
}
三、Libusb-1.0.9库的来实现USB的数据读取
#include <stdio.h>
#include <sys/types.h>
#include <libusb.h>
#define USB_VID 0x0547 //USB的产商ID
#define USB_PID 0x0503 //USB的产品ID
#define EP0ADDR 0x01 //Write端口0地址,通道0
#define EP1ADDR 0x81 //Read 端口1地址,通道1
#define EP2ADDR 0x02 //Write端口2地址,通道2
#define EP3ADDR 0x86 //Read 端口3地址,通道3
#define USB_TIMEOUT 10000 //传输数据的时间延迟
#define COL 1024 //图像每一行均为1024个点
/********** IMage ************/
#define IR_ROW 485 //一帧图像总行数