赞
踩
目录
开发环境:win10/64位、VS2019企业版(Microsoft Visual Studio Enterprise 2019)
先不关心源码,直接下载库文件,然后配置VS2019引用库文件即可。libusb-1.0.20下载地址:
https://udomain.dl.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z
解压之后,需要关注这两个个目录:
新建工程:略。如下,新建一个C工程,命名为test_for_usb。
接下来要配置这个工程使用库(xxx.lib)文件。
(1) 将解压目录里面的libusb.h拷贝到当前工程目录下
(2) 配置附加包含目录
添加libusb.h的路径(实际上就是当前工程的路径) 到“附加包含目录中”。
工程右键--->属性--->C/C++--->常规--->附加包含目录。最后单击“应用”按钮结束配置。
(3)将头文件添加到工程中
头文件--->添加--->现有项--->选择libusb.h
(1)库文件的拷贝
对于64位的系统,选择MS64目录。将libusb-1.0.20\MS64\dll\下的libusb-1.0.lib文件复制到当前工程目录下:
(2)将libusb-1.0.lib添加到“附加依赖项”。
右键工程--->配置属性--->链接器--->输入--->附加依赖项。最后单击“确定”和“应用”结束配置。
(3)将libusb-1.0.lib所在目录添加到“附加库目录”
libusb-1.0.lib所在目录实际上就是当前工程所在目录。
右键工程--->配置属性--->链接器--->常规--->附加库目录。最后单击“确定”和“应用”结束配置。
使用静态版本的libusb库,那么就要把“运行时库”设置为“多线程DLL(/MD)”。
右键工程--->配置属性--->C/C++--->代码生成--->运行库。最后单击“确定”和“应用”结束配置。
注意:以上的所有配置,包括库文件的选择,都是针对64位平台(X64)的。
如果不禁用Windows驱动程序强制签名,在安装自定义的驱动时,可能会碰到这个问题:
“System policy has been modified to reject unsigned drivers”,如下图。
禁用驱动程序强制签名即可。以win10为例,解决过程:Win10怎么禁用驱动程序强制签名-百度经验 (baidu.com)
针对环境搭建,设计了一个简单的USB设备。设备实现Bulk传输,除控制传输端点0外,还有Bulk-IN1和Bulk-OUT2两个数据传输端点。把PID和VID都设计为0x10e6,设备描述符中的设备类、子类和协议都设置为0, 接口描述符中对应的三个字段都设置为0xff,表示这是一个自定义的设备(不使用MSC协议)。
附:设备描述符
---===>Device Information<===--- ConnectionStatus: ===>Endpoint Descriptor<=== ===>Endpoint Descriptor<=== ===>Device Descriptor<=== ===>Configuration Descriptor<=== ===>Interface Descriptor<=== ===>Endpoint Descriptor<=== ===>Endpoint Descriptor<=== |
USB设备插入PC,控制传输枚举阶段结束,设备管理器出现“未知设备”。
这个设备比较简单,设备端只需要处理几条控制传输指令(bulk传输指令可以不理会,事实上由于描述符有几个字段设置的原因,HOST也不会下发相关的SCSI指令)即可。如下:
需要下载Zadig,Zadig是一个Windows平台上专门用于安装USB相关驱动的小软件,下载后解压即可。连接如下:
复制后,打开浏览器即可自动下载,如下图:
解压之后,在bin目录下有可执行文件inf-wizard.exe
选择自己这个未知的设备:
注意:对应设备描述符中的VID和PID
厂商名称和设备名称可以自由填写
找个目录保存生成的xxx.inf文件之后,开始安装驱动。
安装中
安装成功:
驱动安装成功后,再查看设备管理器,设备驱动就正常了:
接下来libusb就可以访问设备了。
main.c
#include <stdio.h> #include "libusb.h" int main(void) { int res; struct libusb_device_handle* usb_handle = NULL; struct libusb_device* usb_dev = NULL; struct libusb_device_descriptor dev_desc; libusb_init(NULL); usb_handle = libusb_open_device_with_vid_pid(NULL, 0x10e6, 0x10e6); if (usb_handle != NULL) { usb_dev = libusb_get_device(usb_handle); if (usb_dev != NULL) { //get device descriptor res = libusb_get_device_descriptor(usb_dev, &dev_desc); if (res == 0) { printf("get device desc success\n"); printf("bLength:0x%02x\n", dev_desc.bLength); printf("bDescriptorType:0x%02x\n", dev_desc.bDescriptorType); printf("bcdUSB:0x%04x\n", dev_desc.bcdUSB); printf("bDeviceClass:0x%02x\n", dev_desc.bDeviceClass); } else { printf("fail to get device desc\n"); libusb_close(usb_handle); } } } else { printf("can not find device:0x1010\n"); } libusb_exit(NULL); return 0; } |
运行如下:
程序可以访问USB驱动,并获取相关设备信息。接下来要实现数据的读写。
(1)配置VS,使用到的资源文件是libusb.h和libusb-1.0.lib
(2)整个环境搭建,会使用到这两个资源包
(3)关于驱动程序的编写和测试要有USB设备的配合。
关于libusb的详细API介绍和使用例程,官网Spec链接为:
libusb: libusb-1.0 API Reference
下一篇:实现Bulk数据双向传输。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。