创建libusb-win32编译环境,及快速调试方法(已结帖)
崩溃了,今天在虚拟机上测试设备时,发现了VS2008编译的libusb0.dll对VC++ 9的 Runtime 库有依赖性。使用/MT选项编译的话,这个dll有100多K。显然不行。唉,终于明白为什么libusb-win32使用gcc编译这个dll了。花了4个小时的时间,在资料几乎没有的情况下,搞明白了官方推荐的 MinGW/Msys 编译方法。在这里鄙视一下libusb-win32项目组,编译方法寥寥几行就说完了,简单也就罢了,结果还没有用。
所以下面的VS2008编译的方法就仅供大家参考吧。高手就不用了,新手的话,可能还能加深对编译的理解。
贴上libusb-win32项目组提供的编译方法说明,昭告天下。。。我再说一遍,上面的方法行不通。好了,今天就到这了,睡觉!明天继续
This folder contains batch files to compile libusb-win32 with Microsoft's DDK.
Requirements:
1) Use WinDDK 6001.18002 for Windows 2000 to Windows 7 compatibility.
(NOTE: WinDDK 6001.18002 is that last to support Windows 2000)
How to compile:
1) install the DDK
2) open a DDK build environment, either a "checked" or a "free" one
3) launch one of the following batch files to compile the sources:
make_driver.bat: builds the driver
make_dll.bat: builds the DLL
make_install_filter.bat: builds install-filter.exe utility
make_test.bat: builds the command line version of the test tool
make_test_win.bat: builds the Windows version of the test tool
make_all.bat: builds everything, driver, DLL, and the test tools
---------------------------------------------------------------------------------------------------------------
在看世界怀,睡不着,索性把MinGW/Msys编译方法给说了,明天回公司再睡了。
同样的,这个也需要WINDDK。MinGW只是完成了VS2008的功能,编译的脚本libusb-win32的开发包里已经有了,我们只要略加修改make.cfg文件就可以了,make.cfg中WINDDK路径的修改请参照下面的介绍的方法。
MinGW是一个很开放的WINDOWS下的编译器,你可以放心的把它应用在商业上,并且这个也是免费的,具体的参见MinGW的License。MinGW可以像cygwin一样的安装方式——只要一个下载管理器就能下载,管理MinGW的软件包。
MinGW的管理器 ourdev_561767.zip(文件大小:129K) (原文件名:MinGW-5.1.6.exe.zip)
只要选择最小安装就可以了。为了方便日后使用,你也可以选择安装g++和gmake。这些只占用一百多兆的空间。
然后,再修改make.cfg中DLLTOOL的路径,我装在E盘,这是我的make.cfg的相关内容
; Path to gcc dlltool tool (http://www.mingw.org/)
; (optional)
DLLTOOL=E:\MinGW\bin\dlltool.exe
编译方法。
使用命令提示符,进入到ddk_make文件夹中,输入make.cmd。这时会自动打印帮助文件,(可恶的libusb-win32项目组竟然把帮助文件藏在这!)
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561768.jpg
(原文件名:ddkmake.jpg)
输入make.cmd "arch=x86"进行编译。OK。。
//================================================================================
OK,这些都有了,下面是很重要的一点,就是如何利用STM32的 STM32的 Virtual_COM_Port 例程快速上手libusb-win32的库。前提是我们要为这个Virtual_COM_Port 安装我们的驱动程序而不是ST的CDC驱动。具体方法,参考下面的介绍。
STM32的 Virtual_COM_Port 例程请参考ST的官方文档,我就不多说了。
testbulk相当于libusb-win32的“Hello,World”。我们就用这个例程向STM32的USART1发送数据,或是接收USART1的数据。
Virtual_COM_Port 的 VID为0x0483 PID为 0x5470
Virtual_COM_Port 使用endpoint1作为上行通道(IN),使用endpoint3作为下行通道(OUT)
Virtual_COM_Port 使用STM32的USART1;(我的板子是“红牛”开发板)
Virtual_COM_Port USART1的默认配置为 波特率:9600;校验位:ODD;数据位:7;停止位:1
我们要修改bulk.c文件的相关内容
#define MY_VID 0x0483
#define MY_PID 0x5740
#define EP_IN 0x81
#define EP_OUT 0x03
再修改下main函数,在main函数中加入
int i;
for(i= 0; i< 64; i++) tmp = i;
重新编译一下。
连接开发板上的USAR1。使用串口调试助手,并按 波特率:9600;校验位:ODD;数据位:7;停止位:1 进行配置.
首先运行testbulk.exe。你会发现串口调试助手会收到USART1发来的数据 00 01 02....
向串口发送数据,你会发现testbulk.exe也会收到数据。
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561769.jpg
(原文件名:test.jpg)
//==================================================================================
最近STM32 的USB应用似乎很火,刚好我也有个项目涉及到USB驱动。因为之前一直用USBASP为AVR单片机下载程序,所以对USBASP所用到USB通信库libusb-win32有个名字及出处的印象。终于,5天前天对她有了第一步的了解。USB我也是新手,刚接触几天而以,但这两天用自己编译的驱动跟STM32通信上后,还是小有点成就感的。拿人家的手短,得了好处,自然要为她宣传鼓噪一番,本着开源共享的精神,厚着脸皮班门弄斧开了这个帖。当然,还是那句话,不看广告,看疗效。到底好不好用,就由列位看官自行斟酌。
在此我还推荐一个调试libusb-win32很好的一个例程,那就是STM32的 Virtual_COM_Port 例程,用这个你可以很快的上手libusb-win32的库。闲话少说,下面我们进入正题。
国际惯例,还是先介绍一下libusb-win32,下面是抄的别人的(纠正一下,现在libusb-win32也支持WINDOWS VISTA/WINDOWS 7了)。。。
//----------------------------------------------------------
LibUSB-Win32是一个用于Windows操作系统(Win98SE、WinME、Win2k和WinXP)上的通用USB设备驱动程序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备。该驱动程序具有以下特点:
l 能够与任意一个已安装的USB设备进行通信
l 可被用作自己开发的USB设备的驱动程序
l 支持批量和中断传输
l 支持USB规范中定义的所有标准设备请求
l 支持USB设备制造商的自定义请求
LibUsb-Win32是由http://libusb-win32.sourceforge.net发布的,遵守GNU Lesser General Public License(LGPL)和GNU General Public License(GPL)许可协议。这些协议明确规定:允许LibUsb-Win32用于商业软件,而不只是开源软件。
通过使用七个函数,就可以与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的设备,还需要进行其他条件判断,比如设备名称,以保证是打开的是期望的USB设备)。
3) 与USB设备进行通信。使用usb_control_msg函数,向USB设备读取数据或写入数据。
4) 关闭USB设备。完成所有操作后,调用usb_close函数关闭已经打开的USB设备。
//----------------------------------------------------------
再来介绍一下编译工具。
MSVC(KIT里带的工程文件是VS2008的,如果你使用VS2005或VC6的话,就要自建工程了,libusb-win32的工程比较复杂,不推荐。我使用的是Visual studio 2008 RTM 90天试用版的)
BCC(如果你装了Borland C++ Builder的话,只要修改make.cfg,然后运行ddk_make文件夹下对应的批处理文件就可以了,这里我就不介绍了)
上面两个都是用来编译libusb-win32的动态链接库、相关工具和DEMO程序的。我们还需要WINDDK来编译驱动,即生成libusb0.sys文件。从官方提供的make.cfg文件上来看,使用的是WINDDK 7600.16385.0(WINDOW XP及以上版本) WINDDK 6001.18002(WINDOWS 2000及以下版本)。我只在MICROSOFT的官网上找到最新的 WINDDK 7600.16385.1,所以,我用的是这个。
有了VS2008和WINDDK,我们就可以开始下面的工作了。
下载源码
你可以去官网上直接下载源码,地址是http://sourceforge.net/projects/libusb-win32/files/
也可以通过SVN工具从 https://libusb-win32.svn.sourceforge.net/svnroot/libusb-win32 libusb-win32 检出最新的源码,我使用的是SVN工具是TortoiseSVN。
vs2008的项目文件位于projects文件夹中。我们来看一下
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561697.jpg
(原文件名:libusb0.jpg)
总共有7个项目。
inf-wizard——设备驱动安装信息文件生成向导。此向导可以扫描计算机上的USB设备,并可以获取你选择的设备的VID及PID生成inf文件。
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561699.jpg
(原文件名:inf1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561700.jpg
(原文件名:inf2.jpg)
install-filter——filter驱动安装。filter driver 是驱动的高层境界,杀毒软件,防火墙,笔记本的多功能按键等等都会用到。
libusb-dll——动态链接库,生成libusb0.dll。上面说的“7个函数”就封装在这里面。同时生成了libusb0.lib文件,供你的程序链接,这个文件实现了libusb0.dll的装载。
libusb-sys——USB驱动,生成驱动文件libusb0.sys。大家不要误以为是VC++编译的,其实是makefile项目,WINDDK玩的借腹生子的把戏,借的VS的腹。
testbulk——libusb-win32的 ”Hello,World!“。
testlibusb——顾名思义,实现了libusb-win32驱动的设备的遍历并打印一部分设备描述信息。
testlibusb-win——WINFORM版的testlibusb。
编译
既然工程都建好了,先编译再说,报错了再查错找错。按 F7 编译怎个解决方案。
没有报错,但libusb-sys生成目录下也没有libusb0.sys文件。答案在这里,libusb-sys是靠WINDDK来编译链接的。这有点像我用VS2005的IDE配合WINAVR来开发AVR单片机一样的了。
查看libusb-sys的项目属性页,在[配置属性]的栏里,查看“生成命令行”。
CD "$(ProjectDir)..\ddk_make"
CMD /C make.cmd "arch=x86" "app=driver" "noclean=true" "outdir=$(OutDir)" "DIR_INTERMEDIATE=$(IntDir)" "debugmode=true"
看来编译脚本是这个ddk_make文件夹下的make.cmd了。
在这里
SET MAKE_CFG=!DIR_LIBUSB_DDK!make.cfg
查看这个make.cfg文件。
打包的那些我就不说了,我们看看关键的两个东西。
; Default WinDDK directory(s) Adjust these values to match your environment
; (REQUIRED)
WINDDK_BASE=Z:\WinDDK
WINDDK_DIR=!WINDDK_BASE!\7600.16385.0\
;
; (optional)
WINDDK_W2K_DIR=!WINDDK_BASE!\6001.18002\
呵呵,WINDDK放在这。在这里我想八卦一下。看他们把WINDDK放在Z盘,我猜他们是不也是用虚拟机大法无限制的使用90天试用版的呢?呵呵,纯属猜测,如有雷同,实属巧合。
把这两项改成你的WINDDK安装路径即可。比如我的是
; Default WinDDK directory(s) Adjust these values to match your environment
; (REQUIRED)
WINDDK_BASE=E:\WinDDK
WINDDK_DIR=!WINDDK_BASE!\7600.16385.1\
;
;没找到WINDDK6,也暂时不打算编译WINDOWS2000及以下版本的驱动,所以就注释掉了
; (optional)
;WINDDK_W2K_DIR=!WINDDK_BASE!\6001.18002\
编译一下libusb-sys。error.h 和error.c 会报 warning C4819,有个时候,编译器会把这个warning当作error,使得不能成功编译,按编译器提示的方法,用VS2008重新保存一下这两个文件即可。OK。。
为Virtual_COM_Port安装我们的这个驱动吧。先用inf-wizard生成inf文件。分别复制libusb0.sys和libusb0.dll至x86文件夹下。
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561701.jpg
(原文件名:driverfile.jpg)
手动安装此驱动,这个就不用我多说了吧,大家都会。
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561707.jpg
(原文件名:device.jpg)
运行testlibusb-win测试下设备。报错!
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561708.jpg
(原文件名:error.jpg)
R6034错误,这个错误是因为没有将资源清单嵌入到libusb0.dll中。我们可以使用mt工具将资源清单嵌入到exe或dll中。因为libusb-win32提供的工程文件默认配置是没有生成清单文件的,所以我们还要设置一下。
libusb-dll项目属性页->链接器->清单文件;把 [生成清单] 设为 “是”,重新生成libusb-dll
开始->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 兼容工具命令提示;
cd 入libusb-dll的生成目录
mt.exe –manifest libusb0.dll.manifest -outputresource:libusb0.dll;2
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561712.jpg
(原文件名:cmd.jpg) 关注 支持lZ!写 libusb-win32 创建libusb-win32 编译环境,及快速调试方法。
用 libusb-win32 有一段时间了。 也多次推荐 大家用。
其实 对大多数人来说 ,不必编译 libusb-win32。搞懂 USB 协议 直接用 即可。 回复【2楼】bbs2009
支持lz!写 libusb-win32 创建libusb-win32 编译环境,及快速调试方法。
用 libusb-win32 有一段时间了。 也多次推荐 大家用。
其实 对大多数人来说 ,不必编译 libusb-win32。搞懂 usb 协议 直接用 即可。
-----------------------------------------------------------------------
在吃饭。
实验的确可以。如果是做产品的话呢?我有一个USBASP,这个也是用的libusb-win32吧,用的是0.1.10.1版的,我在装我自己的驱动的时候,因为要覆盖掉原来的libusb0.sys和libusb0.dll,竟死活装不上去,总是提示该文件已经注册为服务。。
所以,还是自成体系的比较好。有个时候,可能就要改动一些东西。
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561704.jpg
(原文件名:123.jpg) 顶 ancheel ,太顶你了,泪牛满面 mark 多谢楼主,最近正打算用STM32的USB,正发愁上位机如何搞呢 好东东啊 MARK mark mark一下 mark 楼主真是好人那.昨天看了,今天接着看,做好了的朋友们也要吱一声,让我们一起学习,再次感谢ancheel ,应该可以穿裤子了 关注,也想搞usb的程序 学习 学习了..多谢楼主 回复【3楼】ancheel
-----------------------------------------------------------------------
的确涉及这个问题。
保持关注! mark 不顶不行啊 ,太好了。我使用mingw,QT4 回复【19楼】bkey
不顶不行啊 ,太好了。我使用mingw,qt4
-----------------------------------------------------------------------
还烦请阁下介绍下使用QT4做WINDOWS的桌面开发,需要授权不?如果商业应用也是免费的话,很值得考虑。
配合gcc ,可以快速跨平台部署应用程序 MARK mark 楼主可否共享一个libusb-win32 MARK 楼主可否共享一个libusb-win32
-------------------------------
到 http://sourceforge.net/projects/libusb-win32/files/ 下载。 顶 mark 谢谢分享 mark! mark mark mark mark 果断mark 顶 mark 好东西啊,感谢楼主~ mark 回复【楼主位】ancheel
-----------------------------------------------------------------------
多谢分享! mark 关注一下! 支持 libusb mark mark Mark MARK 有机会学习学习 mark mark mark good,正要用上 好贴~记号 好贴!正在学习Libusb中 marks... mark mark mark! 关注 不错啊 mark, libusb stm32 mark mark mark 感谢楼主 顶起 mark!!! 顶起,顶起,顶起,顶起。。。。。 学习学习,顶 这个先收下。。。 mark mark 楼主真是高人!!!学习了!mark! mark,学习 关注,也想搞usb的程序 mark, libusb 刚接触LIBUSB,没看懂楼主写的啥,是不是脑子太笨了! 强烈关注 mark mark 不错 mark 不错,学习了。 学习 libusb mark 关注。 标记 谢谢 大师啊 头疼ing bulk传输 坚定的mark,很好的文章 请问这个make.cfg文件在哪里?需要自己创建吗? 学习了~~~~~~~~ mark,学习了 收下了看看 楼主,我下载了mingw5.1.6 和 winddk7.1(安装后显示7600.16385.1), vs2008, vs2012也都安装了,就borland c++没有安装了,其余的7zip, inno setup等都安装了。
在cmd输入 make.cmd "arch=x86"后,出现unable to configure WinDDK,请问这个怎么解决呢?谢谢。
多谢分享! 这个太好了,正踌躇哪里多的不对呢,多谢 我也在了解这个东西 thanks for share mark 以前也用过libusb,搞了好久
页:
[1]
2