您现在的位置: USB开发网 > USB技术文档 > USB主机驱动及应用
- USB主机驱动及应用

LibUSB+VS2010在Windows7上的编译过程

------分隔线----------------------------

  LibUSB是一个跨平台的usb驱动程序开发包,libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比开发内核驱动相对容易的多。libusb无疑为那些不是专业驱动程序开发人员提供了一种开发USB驱动程序的捷径。另外一个快速驱动程序开发工具DriverStudio虽然也不错(有关DriverStudio的例子可以看本站USB开源项目),  但DriverStudio从Win7开始就不再更新了,无法在win7下使用。所以在WIN7下使用LibUSB进行快速进行USB驱动程序开发是个不错的选择。LibUSB具有以下特点:

  • 能够与任意一个已安装的USB设备进行通信
  • 可被用作自己开发的USB设备的驱动程序
  • 支持批量和中断传输
  • 支持USB规范中定义的所有标准设备请求
  • 支持USB设备制造商的自定义请求

  通过调用几个函数,就可以驱动USB设备了或者与已安装好的USB设备进行通信,使用流程通常如下:

  1. 调用usb_init函数,进行初始化。
  2. 打开要进行通信的USB设备的句柄。首先依次调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的ID(VID/PID),找到相应的USB设备;最后调用usb_open函数打开该USB设备,在这里假设总线上没有相同VID和PID的USB设备。如果总线上存在着相同VID和PID的设备(如用多接口实现的复合设备就有相同的PID和VID),还需要进行其他条件判断,比如设备名称,以保证是打开的是期望的USB设备)。
  3. 与USB设备进行通信。使用usb_control_msg函数,向USB设备读取数据或写入数据。
  4. 关闭USB设备。完成所有操作后,调用usb_close函数关闭已经打开的USB设备。

  编程环境:VS2010+WINDDK+LibUSB,可以去官网上直接下载源码,地址是http://sourceforge.net/projects/libusb-win32/files/。VS2010用来编译libusb-win32的动态链接库、相关工具和DEMO程序的。我们还需要WINDDK来编译驱动,即生成libusb0.sys文件。从官方提供的make.cfg文件上来看,使用的是WINDDK 7600.16385.0(WINDOW XP及以上版本) WINDDK 6001.18002(WINDOWS 2000及以下版本)。此处用的是 WINDDK 7600.16385.1,打开源码中的工程文件如下图所示: 

 

libusb-1

  inf-wizard——设备驱动安装信息文件生成向导。此向导可以扫描计算机上的USB设备,并可以获取你选择的设备的VID及PID生成inf文件。 

 

libusb-2 

 

libusb-3

 

 

 

  编译工程,没有报错,但libusb-sys生成目录下也没有libusb0.sys文件,libusb-sys是靠WINDDK来编译链接的。

  查看libusb-sys的项目属性页,在[配置属性]的栏里,查看“生成命令行”。 

  1. CD"$(ProjectDir)..\ddk_make" 
  2.  
  3. CMD /C make.cmd"arch=x86" "app=driver" "noclean=true""outdir=$(OutDir)" "DIR_INTERMEDIATE=$(IntDir)""debugmode=true

查看目录下的make.cfg文件。

  1. ; Default WinDDKdirectory(s) Adjust these values to match your environment  
  2.   
  3. ; (REQUIRED)  
  4.   
  5. WINDDK_BASE=Z:\WinDDK  
  6.   
  7. WINDDK_DIR=!WINDDK_BASE!\7600.16385.0\  
  8.   
  9. ;  
  10.   
  11. ; (optional)  
  12.   
  13. WINDDK_W2K_DIR=!WINDDK_BASE!\6001.18002\  

 

 

  

把这两项改成你的WINDDK安装路径。

  1. ; Default WinDDKdirectory(s) Adjust these values to match your environment 
  2.  
  3. ; (REQUIRED) 
  4.  
  5. WINDDK_BASE=D:\WinDDK 
  6.  
  7. WINDDK_DIR=!WINDDK_BASE!\7600.16385.1\ 

编译一下libusb-sys。

编译报错error MSB3073: ,修改ddk_make/make.cmd,Line175 W2K(末尾) 修改成WIN7,编译成功。

然后编译libwdi,老是报错error MSB3073,网上查了半天资料都没有解决办法,最终找到问题原因,所包含的文件没有放置在对应位置。

从编译的libusb-win32-src-1.2.6.0(可以从http://sourceforge.net/apps/trac/libusb-win32/wiki下载)中复制对应文件到E:/libusb-win32,注意目录是E:\libusb-win32\bin\x86,对应修改config.h的目录路径如下: 

  1. /* embed WinUSB driver files from thefollowing DDK location */  
  2.  
  3. #ifndef DDK_DIR  
  4.  
  5. #define DDK_DIR "D:/WinDDK/7600.16385.1" 
  6.  
  7. #endif 
  8.  
  9. /* embed libusb0 driver files from thefollowing location */ 
  10.  
  11. #ifndef LIBUSB0_DIR 
  12.  
  13. #define LIBUSB0_DIR "E:/libusb-win32" 
  14.  
  15. #endif 

 

然后inf-wizard工程编译又出现问题,error LNK2019: 无法解析的外部符号,通过添加编译生成的libwdi .lib到工程路径中即可解决,最终编译完成整个项目。

libusb-4

 

------分隔线----------------------------
联系我们
  • Q Q: 1148374829 点击这里给我发消息
  • 旺旺:jhoneqhsieh 点击这里给我发消息
  • 电话:(0)15923141204
  • 淘宝网店
USB开源项目