之前一直找不到適合WIN7下的Tiny6410的USB下載軟件,正好這幾天開始學習USB,所以打算自己寫一個專門用於Tiny6410的WIN7下的USB下載軟件。
發現了libusb這個庫可以用作無驅USB開發,就是說根本不需要了解Window驅動開發的知識就可以開發USB設備驅動,只需要了解一下USB的相關協議即可。Windows下我幾乎不用VS來寫程序,或者說我不懂MFC吧,呵呵,所示我用Qt來做界面。好了,進入正題。
首先下載libusb-win32,下載地址:http://sourceforge.net/projects/libusb-win32/files/,注意選擇下載的文件是libusb-win32-bin-1.2.6.0.zip,這不是源碼,而是一些已經編譯好的庫。解壓之,里面有這么一些文件(夾):
下面簡單介紹一下里面的東西是怎么用的。
(1)bin文件夾。里面最重要的是inf-wizard.exe這個程序,當你的USB設備插到電腦上而沒有找到驅動程序時就可以通過這個程序來安裝通用的USB驅動。雙擊它,下一步,在里面找到你的USB設備,選中后下一步,最后會彈出一個對話框讓你保存它生成驅動程序。這樣就有了驅動程序,但還沒有安裝,可以通過設備管理器來安裝,安裝成功后就可以通過libusb來編寫程序來訪問你的USB設備了。
(2)examples文件夾。里面有兩個例程,一個簡單的,一個復雜的,參考里面的bulk.c例程就好了。
(3)include文件夾。編寫程序時需要用到,一般放在你的工程目錄下。
(4)lib文件夾。里面是一些已經編譯好的庫,有borland版本的,有VC++版本的,有x64位版本的,最重要的是還有gcc版本,這里用到的就是gcc版本的,該版本可以在Qt上使用。
下面開始介紹怎么在Qt下使用該庫。
1. 新建一個Qt工程
2. 把gcc版本的庫文件libusb.a復制到工程目錄下(可以放在其他目錄),在.pro文件中追加如下一行(路徑根據自己的情況修改):
LIBS+="F:/Qt/pratise/libusb-test/libusb/libusb.a"
這樣就可以在鏈接時找到所需的函數。
3. 把上面所說的include文件夾下lusb0_usb.h文件復制到工程目錄下。
4. 編寫一個測試文件,我這里寫的比較簡單,程序的功能是只列出我的USB設備,如下:
#include "testlibusb.h" #include "lusb0_usb.h" USB::USB() { //usb_set_debug(250); usb_init(); /* initialize the library */ usb_find_busses(); /* find all busses */ usb_find_devices(); /* find all connected devices */ my_usb_get_device_list(); resize(320, 240); } void USB::my_usb_get_device_list(void) { struct usb_bus *bus; struct usb_device *dev; for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { /* for specified device if (dev->descriptor.idVendor == MY_VID && dev->descriptor.idProduct == MY_PID) { return usb_open(dev); } */ qDebug("VID:VID = %x:%x\n", dev->descriptor.idVendor, dev->descriptor.idProduct); } } }
好了,運行程序,效果:
最后一行打印出來的正是Tiny6410的USB設備號。
注意:
這只能列出安裝了inf-wizard.exe生成的驅動程序的USB設備。一開始的時候我沒接上Tiny6410,程序沒輸出,插上一個U盤,還是沒輸出,以為是程序或者這個庫有問題,糾結了一會,后來靈光一閃,插上開發板試試吧,果然成功了,程序運行結果就如上面所示。
繼續學習USB,過2天USB開發板到了就開始實戰。
后記:
最開始自己用Delphi 調用libusb 一直查找不到 STM32 做的HID 設備,卻可以查找到AVR的開發工具USBASP。這讓本人是郁悶,兩者不同的是在Win 設備管理器上USBASP 是單獨出現的一個設備,而STM23 HID 是出現在“人體學輸入設備”組里,顯示名是“輸入設備”。最可疑的是參照網上例程網友的一個調試工具卻可以正常查找到並可發數據,所以一直懷疑是自己程序調用有問題,折騰死了....
最后在網上找到上面這篇文章,提到inf-wizard.exe 的作用。於是按上述操作完成后在Win設備管理里單獨顯示為一個設備,並且可以正常查找到了。非常感謝廣大網友!
所以,現在把文章轉過來(前面放了原地址,點一下直達原文),讓更多遇到同樣問題的網友能看到。