虚拟机Linux访问usb设备,通过Libusb库方法实现读写usb设备所获取的实时图像数据

一、前言

基于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的模式设置为传输模式;
点击虚拟机的设置
至少选中上面两项_只能在ubuntu系统关机状态下更改
点击连接设备
这里写图片描述
这里写图片描述
在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 //一帧图像总行数
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值