ancheel 发表于 2010-6-13 16:37:54

创建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)

xiejun 发表于 2010-6-13 16:48:42

关注

bbs2009 发表于 2010-6-13 18:26:20

支持lZ!写 libusb-win32 创建libusb-win32 编译环境,及快速调试方法。

用 libusb-win32 有一段时间了。 也多次推荐 大家用。

其实 对大多数人来说 ,不必编译 libusb-win32。搞懂 USB 协议 直接用 即可。

ancheel 发表于 2010-6-13 18:43:10

回复【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)

czg94215 发表于 2010-6-13 20:23:30

顶 ancheel ,太顶你了,泪牛满面

ninjia 发表于 2010-6-13 20:56:05

mark

armfans 发表于 2010-6-13 21:59:31

多谢楼主,最近正打算用STM32的USB,正发愁上位机如何搞呢

quzegang 发表于 2010-6-13 22:05:30

好东东啊

chairang 发表于 2010-6-13 22:33:42

MARK

vipcff 发表于 2010-6-13 22:43:33

mark

antonine 发表于 2010-6-13 23:05:42

mark一下

bigworms 发表于 2010-6-13 23:34:05

mark

czg94215 发表于 2010-6-14 12:21:00

楼主真是好人那.昨天看了,今天接着看,做好了的朋友们也要吱一声,让我们一起学习,再次感谢ancheel ,应该可以穿裤子了

dahai168 发表于 2010-6-14 13:52:39

关注,也想搞usb的程序

orange2348 发表于 2010-6-14 15:41:11

学习

bobqq 发表于 2010-6-14 19:59:04

学习了..多谢楼主

huayuliang 发表于 2010-6-14 21:11:45

回复【3楼】ancheel
-----------------------------------------------------------------------

的确涉及这个问题。

保持关注!

czhxp 发表于 2010-6-14 21:37:59

mark

bkey 发表于 2010-6-15 21:29:33

不顶不行啊 ,太好了。我使用mingw,QT4

ancheel 发表于 2010-6-15 22:30:12

回复【19楼】bkey
不顶不行啊 ,太好了。我使用mingw,qt4
-----------------------------------------------------------------------

还烦请阁下介绍下使用QT4做WINDOWS的桌面开发,需要授权不?如果商业应用也是免费的话,很值得考虑。
配合gcc ,可以快速跨平台部署应用程序

huasoft 发表于 2010-7-15 18:00:47

MARK

gavin_li 发表于 2010-8-17 14:05:28

mark

tomy 发表于 2010-8-26 17:55:53

楼主可否共享一个libusb-win32

weif40423p 发表于 2010-8-26 18:15:40

MARK

bbs2009 发表于 2010-8-26 21:54:44

楼主可否共享一个libusb-win32
-------------------------------
到 http://sourceforge.net/projects/libusb-win32/files/    下载。

zhanglongtumi 发表于 2010-12-16 15:34:58

hyl175 发表于 2010-12-16 16:18:28

mark

eworker 发表于 2010-12-16 16:28:23

谢谢分享

charlie2008 发表于 2010-12-16 16:34:56

mark!

haigerl 发表于 2010-12-17 12:10:55

mark

gongliangchun 发表于 2011-1-21 14:00:11

mark

yqhpaladin123 发表于 2011-2-5 23:13:22

mark

joni 发表于 2011-2-5 23:40:31

mark

Etual 发表于 2011-2-5 23:47:19

果断mark

wsm80828 发表于 2011-2-6 12:51:08

mushk 发表于 2011-2-15 23:23:22

mark

ppkklxw 发表于 2011-2-15 23:30:36

好东西啊,感谢楼主~

qhdz 发表于 2011-2-16 09:27:26

mark

hjf2002 发表于 2011-2-16 10:13:56

回复【楼主位】ancheel
-----------------------------------------------------------------------

多谢分享!

davidd 发表于 2011-5-6 20:57:42

mark

pophelix 发表于 2011-5-15 01:22:01

关注一下!

rafd 发表于 2011-5-15 05:47:46

支持

ccyhyxt 发表于 2011-5-15 10:28:39

libusb

xiaowei061 发表于 2011-6-1 02:32:10

mark

lqsoft 发表于 2011-6-1 04:49:08

mark

wsforever 发表于 2011-6-8 13:20:19

Mark

cargle 发表于 2011-6-8 15:42:03

MARK

gavin_li 发表于 2011-6-8 16:33:04

有机会学习学习

lugang_2920213 发表于 2011-7-27 15:58:05

mark

powerg7 发表于 2011-7-27 16:03:45

mark

qhdz 发表于 2011-8-7 10:32:53

mark

durgy 发表于 2011-8-7 11:46:15

good,正要用上

huangdog 发表于 2011-8-7 13:33:11

好贴~记号

coolljt 发表于 2011-9-15 20:28:05

好贴!正在学习Libusb中

gwdong 发表于 2011-9-16 08:32:00

marks...

phidiawang 发表于 2011-9-16 08:43:17

mark

nicksean 发表于 2011-9-16 09:17:03

mark

fwt11 发表于 2011-9-16 21:06:24

mark!

luweixuan 发表于 2011-9-16 23:20:02

关注

powercxz 发表于 2011-9-17 01:41:11

不错啊

yzhu 发表于 2011-9-17 06:47:53

mark, libusb stm32

ifezix 发表于 2011-9-18 01:00:10

mark

imjacob 发表于 2011-9-18 10:07:35

mark

373518122 发表于 2011-9-18 18:34:07

mark

pinocchio 发表于 2011-9-18 18:41:54

感谢楼主

442502587 发表于 2011-9-18 20:11:08

顶起

pophelix 发表于 2011-9-20 15:54:33

mark!!!

ff6588877 发表于 2011-9-30 14:29:52

顶起,顶起,顶起,顶起。。。。。

shiguiyuan 发表于 2011-10-3 22:38:25

学习学习,顶

pcwhy 发表于 2011-10-3 23:44:45

这个先收下。。。

Nuist_Gwgj 发表于 2011-10-16 21:54:46

mark

forhappy 发表于 2011-10-31 15:13:15

mark

dgtg 发表于 2011-11-1 00:51:22

楼主真是高人!!!学习了!mark!

jordonwu 发表于 2011-11-15 09:12:17

mark,学习

wuguoyan 发表于 2011-11-15 10:19:57

关注,也想搞usb的程序

get500wan 发表于 2011-11-15 10:59:22

mark, libusb

joystring 发表于 2011-11-25 09:10:02

刚接触LIBUSB,没看懂楼主写的啥,是不是脑子太笨了!

mushk 发表于 2011-12-18 00:33:51

强烈关注

baifang20 发表于 2011-12-18 01:03:18

mark

ken_ly 发表于 2011-12-18 22:22:10

mark

AVR_ARM 发表于 2011-12-18 22:34:42

不错

dingliming 发表于 2011-12-19 20:22:25

mark

xm3love 发表于 2011-12-19 21:25:07

不错,学习了。

PaulDE 发表于 2012-2-4 13:33:35

学习 libusb

Spunky 发表于 2012-2-4 14:13:44

mark

dahaicaoyuan 发表于 2012-2-4 14:30:29

关注。

awsoft 发表于 2012-2-5 14:04:12

标记

richards 发表于 2012-9-2 17:42:11

谢谢 大师啊 头疼ing bulk传输

luweixuan 发表于 2012-9-2 19:06:48

坚定的mark,很好的文章

wangchin1988 发表于 2012-9-20 16:13:42

请问这个make.cfg文件在哪里?需要自己创建吗?

aitchow 发表于 2012-9-20 16:17:30

学习了~~~~~~~~

pjdu 发表于 2012-10-15 11:26:37

mark,学习了

huangqi412 发表于 2012-10-15 12:34:04

收下了看看

gallop020142 发表于 2013-9-30 16:13:54

楼主,我下载了mingw5.1.6 和 winddk7.1(安装后显示7600.16385.1), vs2008, vs2012也都安装了,就borland c++没有安装了,其余的7zip, inno setup等都安装了。
在cmd输入 make.cmd "arch=x86"后,出现unable to configure WinDDK,请问这个怎么解决呢?谢谢。

JESTER9 发表于 2013-9-30 16:33:39

多谢分享!

bygreencn 发表于 2014-4-2 17:26:08

这个太好了,正踌躇哪里多的不对呢,多谢

zl_123 发表于 2014-4-2 20:55:34

我也在了解这个东西

xjtyOnly51 发表于 2014-4-11 13:10:33

thanks for share

vikeer606 发表于 2014-5-25 19:45:37

mark                     

Xplain 发表于 2014-5-26 11:22:04

以前也用过libusb,搞了好久
页: [1] 2
查看完整版本: 创建libusb-win32编译环境,及快速调试方法(已结帖)