彭 偉
PENG Wei
(武漢城市職業(yè)學(xué)院 電子信息工程學(xué)院,武漢 430064)
每年有超過(guò)20億的新安裝器件,可連接多種類(lèi)型的設(shè)備,能夠自動(dòng)進(jìn)行配置,連接簡(jiǎn)單且支持熱插撥,多數(shù)時(shí)候不需要提供獨(dú)立的電源,具有高傳輸速率,高可靠性等,上述諸多優(yōu)點(diǎn)使USB成為了最成功的PC機(jī)接口。微軟為大量USB類(lèi)設(shè)備提供類(lèi)驅(qū)動(dòng)程序,且一直在改進(jìn)和增加類(lèi)驅(qū)動(dòng)程序的數(shù)量,對(duì)于USB設(shè)備獨(dú)立硬件供應(yīng)商(IHV),Windows驅(qū)動(dòng)程序基礎(chǔ)(Windows Driver Foundation,WDF)已成為USB驅(qū)動(dòng)程序開(kāi)發(fā)的首選模型,它提供3個(gè)選項(xiàng)來(lái)訪問(wèn)USB設(shè)備:1)使用UMDF實(shí)現(xiàn)用戶模式驅(qū)動(dòng)程序;2)使用KMDF實(shí)現(xiàn)內(nèi)核模式驅(qū)動(dòng)程序;3)將Winusb.sys作為設(shè)備功能驅(qū)動(dòng)程序安裝,并提供WinUSB API供應(yīng)用程序訪問(wèn)設(shè)備。本文將基于WinUSB通用驅(qū)動(dòng)程序及Microchip公司USB接口系統(tǒng)固件框架,以PIC微控制器與SHT75傳感器為核心,上位機(jī)選用C#開(kāi)發(fā)平臺(tái),開(kāi)發(fā)實(shí)現(xiàn)基于WinUSB的溫濕度數(shù)據(jù)采集與控制系統(tǒng)并進(jìn)行仿真。
Windows驅(qū)動(dòng)程序包括總線驅(qū)動(dòng)程序(bus driver)、功能驅(qū)動(dòng)程序(function driver)、過(guò)濾驅(qū)動(dòng)程序(filter driver),圖1給出了Windows USB驅(qū)動(dòng)程序堆棧體系結(jié)構(gòu)框圖,圖中出現(xiàn)了微軟推出的USB設(shè)備通用驅(qū)動(dòng)程序WinUSB,它基于Windows Driver Frameworks (WDF)開(kāi)發(fā),由內(nèi)核模式驅(qū)動(dòng)程序(Winusb.sys)與用戶模式DLL(winusb.dll)共兩個(gè)基本組件構(gòu)成。WinUSB(Winusb.sys)可作為單一USB設(shè)備或復(fù)合設(shè)備功能驅(qū)動(dòng)程序安裝在設(shè)備內(nèi)核模式堆棧中。用戶程序通過(guò)調(diào)用WinUSB用戶模式動(dòng)態(tài)鏈接庫(kù)winusb.dll公開(kāi)的函數(shù)與USB設(shè)備通信。圖1展示了包含3個(gè)Winusb.sys實(shí)例的USB驅(qū)動(dòng)程序堆棧,實(shí)例1注冊(cè)設(shè)備接口A,支持用戶模式驅(qū)動(dòng)程序(Usboem.dll),實(shí)例2注冊(cè)設(shè)備接口B,支持通過(guò)系統(tǒng)服務(wù)(SVCHOST)與winusb.dll進(jìn)行通信的掃描儀用戶模式程序(Usbscan.exe),實(shí)例3注冊(cè)設(shè)備接口C,支持固件升級(jí)程序(Usbfw.exe)。實(shí)例2、3基于USB通用父驅(qū)動(dòng)程序usbccgp.sys,為復(fù)合設(shè)備提供服務(wù)。所有用戶程序均通過(guò)加載winusb.dll,調(diào)用DLL所提供的函數(shù)與USB驅(qū)動(dòng)程序棧通訊。
通過(guò)WinUSB驅(qū)動(dòng)程序與設(shè)備通訊,用戶程序不需要構(gòu)造設(shè)備I/O控制請(qǐng)求來(lái)執(zhí)行標(biāo)準(zhǔn)的USB操作(如配置設(shè)備、發(fā)送控制請(qǐng)求以及與設(shè)備互傳數(shù)據(jù))等,用戶程序調(diào)用winusb.dll提供的函數(shù)時(shí),winusb.dll將使用應(yīng)用程序提供的數(shù)據(jù)構(gòu)建適當(dāng)?shù)腎OCTL調(diào)用DeviceIoControl,將請(qǐng)求發(fā)送至Winusb.sys處理,請(qǐng)求完成時(shí)WinUSB將Winusb.sys返回的信息回傳到調(diào)用進(jìn)程,調(diào)用失敗或掛起時(shí)將返回零值,調(diào)用GetLastError可獲取詳細(xì)的錯(cuò)誤消息。
圖1 Windows USB驅(qū)動(dòng)程序堆棧體系結(jié)構(gòu)及含多個(gè)Winusb.sys實(shí)例的USB驅(qū)動(dòng)程序堆棧
Winusb.sys還是UMDF功能驅(qū)動(dòng)程序與關(guān)聯(lián)的設(shè)備之間鏈接的關(guān)鍵部分,Winusb.sys作為上層過(guò)濾驅(qū)動(dòng)程序安裝在設(shè)備的內(nèi)核模式堆棧中,應(yīng)用程序通過(guò)與設(shè)備的UMDF用戶模式驅(qū)動(dòng)程序通信來(lái)發(fā)送讀、寫(xiě)或設(shè)備I/O控制請(qǐng)求,驅(qū)動(dòng)程序則與框架交互,后者將請(qǐng)求傳遞到Winusb.sys,Winusb.sys處理該請(qǐng)求并將其傳遞到協(xié)議驅(qū)動(dòng)程序,最后傳遞到設(shè)備,任何響應(yīng)均通過(guò)反向路徑返回。
WinUSB作為設(shè)備功能驅(qū)動(dòng)程序安裝時(shí),其驅(qū)動(dòng)程序包共有4項(xiàng)內(nèi)容:1)WinUSB輔助安裝程序(Co-installer)Winusbcoinstaller.dll;2)KMDF輔助安裝程序WdfcoinstallerXXX.dll;3)將Winusb.sys安裝為設(shè)備功能驅(qū)動(dòng)程序的INF文件;4)簽名的數(shù)據(jù)包目錄文件(Signed Catalog File)。KMDF和WinUSB輔助安裝程序須從同一版本的WDK獲取,WDF輔助安裝程序文件須從最新版本的WDK安裝目錄獲取,以便該驅(qū)動(dòng)程序支持所有最新的Windows版本。
WinUSB驅(qū)動(dòng)包中的INF文件將Winusb.sys安裝為設(shè)備的功能驅(qū)動(dòng)程序,為操作系統(tǒng)匹配驅(qū)動(dòng)程序與設(shè)備提供重要信息。INF文件中與上、下位機(jī)USB接口軟件開(kāi)發(fā)關(guān)系最為密切的信息包括:1)USB固件內(nèi)設(shè)備描述符定義的VID/PID。例如本文INF文件中[Manufacturer]區(qū)有:%USBMyDevice.DeviceDesc% = USB_Install,USBVID_00AA&PID_00BB,它將設(shè)備VID/PID設(shè)為0x00AA/00BB。2)設(shè)備接口類(lèi)(Device Interface Class)GUID。上位機(jī)用戶程序使用該GUID枚舉WinUSB設(shè)備接口,新項(xiàng)目中的GUID可由guidgen.exe生成,INF文件[USB_Install.HW]區(qū)通過(guò)AddReg指示符在注冊(cè)表中的DeviceInterfaceGUIDs鍵下存儲(chǔ)一個(gè)或多個(gè)設(shè)備接口類(lèi)GUID,例如本文所編寫(xiě)的INF文件中有:HKR,,DeviceInterfaceGUIDs,0x10000,"{B6B014A8-8CDE-4112-9474-F15486E401BE}"。Winusb.sys每次加載時(shí)都會(huì)根據(jù)注冊(cè)表中的DeviceInterfaceGUIDs項(xiàng)指定的設(shè)備接口類(lèi)注冊(cè)一個(gè)設(shè)備接口實(shí)例。INF文件[Version]區(qū)還有一個(gè)ClassGUID條目,例如本文中該條目定義為:ClassGUID={36FC9E60-C465-11CF-8056-444553540000},它是設(shè)備安裝類(lèi)(Device Setup Class)GUID,INF文件的ClassInstall32指示符將在注冊(cè)表中創(chuàng)建:…CurrentControlSetControlClass{36FC9E60-C465-11CF-8056-444553540000},并導(dǎo)入INF文件內(nèi)的相關(guān)子鍵值,用于標(biāo)識(shí)該設(shè)備類(lèi)安裝程序。
Winusb.sys安裝為內(nèi)核功能驅(qū)動(dòng)程序時(shí)使用[DDInstall.Services]的AddService=WinUSB,…實(shí)現(xiàn),ServiceType設(shè)為SERVICE_KERNEL_DRIVER,ServiceBinary設(shè)為Winusb.sys。安裝為設(shè)備上層過(guò)濾驅(qū)動(dòng)程時(shí),需通過(guò)[DDInstall.HW]的AddReg指示符在注冊(cè)表中創(chuàng)建上層過(guò)濾驅(qū)動(dòng)條目“UpperFilters”。
Windows 8之前的操作系統(tǒng)將Winusb.sys作為功能驅(qū)動(dòng)程序加載時(shí)需提供定制的INF文件,該文件指定了設(shè)備特定的硬件ID,同時(shí)包括內(nèi)置Winusb.inf的部分,這些部分是實(shí)例化服務(wù)、復(fù)制內(nèi)置二進(jìn)制文件以及注冊(cè)設(shè)備接口GUID所必需的。
為探測(cè)下位機(jī)USB設(shè)備是否接入主機(jī),可調(diào)用RegisterDeviceNotification注冊(cè)設(shè)備通知消息,在設(shè)備移除或接入時(shí)通知窗體WndProc進(jìn)程,該進(jìn)程檢測(cè)到有設(shè)備接入主機(jī)時(shí)進(jìn)一步獲取“設(shè)備路徑”。
Winusb.sys被加載時(shí),它根據(jù)注冊(cè)表中DeviceInterfaceGUIDs鍵下該設(shè)備接口類(lèi)注冊(cè)一個(gè)設(shè)備接口。用戶模式程序調(diào)用SetupDiGetClassDevs可枚舉該設(shè)備接口類(lèi)設(shè)備并返回該類(lèi)的“設(shè)備信息集”句柄,循環(huán)調(diào)用SetupDiEnumDeviceInterfaces可逐一枚舉設(shè)備信息集中的設(shè)備接口,提取索引指定的設(shè)備接口詳細(xì)信息時(shí)可調(diào)用SetupDiGetDeviceInterfaceDetail,所獲取的信息通過(guò)SP_DEVICE_INTERFACE_DETAIL_DATA結(jié)構(gòu)返回。由于該結(jié)構(gòu)大小無(wú)法提前獲取,故需連續(xù)兩次調(diào)用該函數(shù),第二次調(diào)用時(shí)接口詳細(xì)信息將填充到根據(jù)第一次調(diào)用返回值所確定大小的該緩沖區(qū),通過(guò)緩沖內(nèi)該結(jié)構(gòu)的DevicePath成員中可獲得“設(shè)備路徑”。本文有:DevicePath="\\?\usb#vid_00aa&pid_0 0bb#2&2260b228&0&e1#{b6b014a8-8cde-4112-9474-f15486e401be}”。當(dāng)檢測(cè)到設(shè)備路徑中含有“Vid_00AA&Pid_00BB”時(shí)即表示搜索成功,否則繼續(xù)枚舉下一接口。
Windows API提供的CreateFile函數(shù)可創(chuàng)建、打開(kāi)文件、目錄、物理盤(pán)、卷、COM端口、設(shè)備(包括USB設(shè)備)、服務(wù)、通訊資源、命名管道或控制臺(tái)等,返回用于訪問(wèn)相應(yīng)對(duì)象的句柄。CreateFile的第一個(gè)參數(shù)lpFileName是將要?jiǎng)?chuàng)建或打開(kāi)的對(duì)象名稱,Unicode允許該參數(shù)最多為32000個(gè)字符,該類(lèi)型長(zhǎng)字符串所使用的前綴標(biāo)識(shí)為“\?”,C語(yǔ)言表示的DevicePath中長(zhǎng)串標(biāo)識(shí)符“\\?\”后面分別是USB設(shè)備實(shí)例“USBVid_00AA&Pid_00BB2&2260b228&0&E1”和設(shè)備接口GUID。將設(shè)備路徑DevicePath賦給CreateFile函數(shù)的lpFileName參數(shù)即可獲取設(shè)備句柄,所獲取的設(shè)備句柄傳給WinUSB函數(shù)WinUsb_Initialize,可獲取WinUSB句柄。有了WinUSB句柄,即可進(jìn)一步調(diào)用Winusb.dll提供的其他大量WinUSB API實(shí)現(xiàn)對(duì)USB設(shè)備的訪問(wèn)。
C#中調(diào)用WinUSB函數(shù),需要通過(guò)DllImport引入DLL文件并聲明函數(shù),例如:
[DllImport("winusb.dll",SetLastError = true)]
internal static extern Boolean WinUsb_Initialize(…);
所設(shè)計(jì)的系統(tǒng)中,讀傳感器溫濕度數(shù)據(jù)及控制繼電器開(kāi)關(guān)的自定義命令字節(jié)分別為0x81、0x82,向USB設(shè)備發(fā)送命令字節(jié)的函數(shù)為WinUsb_WritePipe(寫(xiě)管道),該函數(shù)前兩個(gè)參數(shù)分別為WinUSB接口句柄InterfaceHandle和管道號(hào)PipeID,其中PipeID由1個(gè)方向位+7個(gè)地址位構(gòu)成,對(duì)應(yīng)于下位機(jī)USB固件中端點(diǎn)描述符內(nèi)的bEndpointAddress字段,寫(xiě)管道函數(shù)的其他參數(shù)分別為:數(shù)據(jù)緩沖區(qū)指針、緩沖區(qū)大小、實(shí)際傳輸字節(jié)數(shù)及可選的Overlapped參數(shù)。本文將Overlapped設(shè)為IntPtr.Zero,使寫(xiě)管道函數(shù)向PipeID(0x01)管道完成一字節(jié)控制命令輸出并返回后,才開(kāi)始讀取USB設(shè)備返回的傳感器數(shù)據(jù),調(diào)用WinUSB讀管道數(shù)據(jù)函數(shù)WinUsb_ReadPipe“同步讀取”USB設(shè)備返回的溫濕度數(shù)據(jù)時(shí),上位機(jī)用戶程序可能因USB接口斷開(kāi)、返回?cái)?shù)據(jù)量大等原因?qū)е鲁绦虮蛔枞楸苊膺@一問(wèn)題,可使用Delegate代理實(shí)現(xiàn)對(duì)USB設(shè)備所返回?cái)?shù)據(jù)的“異步讀取”,定義的代理對(duì)應(yīng)于讀管道函數(shù)WinUsb_ReadPipe,調(diào)用BeginInvoke方法時(shí)除了給出讀管道函數(shù)所需要必須的參數(shù)以外,另附加的兩個(gè)參數(shù)為:1)new AsyncCallback(GetBulkDat);2)ReadDelegate。前者指明代理調(diào)用WinUsb_ReadPipe返回時(shí)的異步回調(diào)函數(shù)為GetBulkDat,后者為當(dāng)前代理對(duì)象實(shí)例,當(dāng)GetBulkDat被回調(diào)時(shí),ReadDelegate作為IAsyncResult類(lèi)型的參數(shù)傳給該回調(diào)函數(shù),AsyncState屬性獲得代理對(duì)象,并執(zhí)行EndInvoke等待BeginInvoke調(diào)用的方法結(jié)束。如果IsCompleted屬性值為真則表示從USB設(shè)備通過(guò)批量(Bulk)傳輸讀取的數(shù)據(jù)已裝填到指定緩沖。
瑞士SENSIRION傳感器公司推出的數(shù)字式溫濕度傳感器SHT75實(shí)現(xiàn)了數(shù)字式輸出、免調(diào)試、免標(biāo)定、免外圍電路及全互換功能。為方便用戶開(kāi)發(fā)應(yīng)用溫濕度傳感器SHT75,SENSIRION提供了SHT75的8051 C程序范例,可以非常方便的移植為PIC微控制器C程序,PIC從傳感器讀取4字節(jié)數(shù)據(jù)后,根據(jù)函數(shù):Calc_STH75與Calc_Dew_point可分別計(jì)算溫濕度及露點(diǎn)值。由于這兩個(gè)函數(shù)內(nèi)浮點(diǎn)計(jì)算量大,本文將它們移至上位機(jī)C#程序中,PIC微控制器則僅負(fù)責(zé)從傳感器讀取四字節(jié)溫濕度原始數(shù)據(jù),通過(guò)USB接口直接傳輸給上位機(jī),上位機(jī)C#程序再通過(guò)這四字節(jié)原始數(shù)據(jù)調(diào)用上述兩個(gè)函數(shù)計(jì)算出相應(yīng)結(jié)果,這樣處理可提高傳輸速度并減輕下位機(jī)微控制器負(fù)荷。C#函數(shù)GetBulkDat通過(guò)緩沖中的四字節(jié)數(shù)據(jù)完成浮點(diǎn)計(jì)算后,仍然需要通過(guò)代理在主窗體中刷新顯示,因?yàn)樵摵瘮?shù)與主窗體不在同一線程運(yùn)行。
回調(diào)函數(shù)讀取數(shù)據(jù)管道結(jié)束并通過(guò)顯示代理完成窗體信息刷新顯示后,接著再次通過(guò)寫(xiě)管道函數(shù)WinUsb_WritePipe發(fā)出讀取SHT75傳感器數(shù)據(jù)的命令字節(jié)0x81,實(shí)現(xiàn)對(duì)溫濕度數(shù)據(jù)的實(shí)時(shí)連續(xù)采集。繼電器控制與之類(lèi)似,唯一差別是刷新顯示下位機(jī)返回的繼電器狀態(tài)后并不繼續(xù)調(diào)用WinUsb_WritePipe發(fā)出控制繼電器的命令字節(jié)0x82,而是等待上位機(jī)用戶的下一個(gè)操作。
為便于工程技術(shù)人員開(kāi)發(fā)應(yīng)用PIC USB微控制器,Microchip公司提供了PIC微控制器USB協(xié)議棧固件框架,可處理大量USB通訊任務(wù),所提供的面向不同客戶群的演示項(xiàng)目均采用協(xié)作式多任務(wù)環(huán)境(禁止出現(xiàn)阻塞),內(nèi)置USB模塊的PIC18F4550微控制器具有獨(dú)立的中斷邏輯結(jié)構(gòu),協(xié)議??蚣芎诵奈募sb_device.c提供主狀態(tài)機(jī)函數(shù)USBDeviceTasks,對(duì)USB中斷進(jìn)行檢測(cè)并進(jìn)入相應(yīng)的處理程序。
固件框架同時(shí)提供了處理用戶I/O操作的演示函數(shù)ProcessIO,由固件程序內(nèi)的主函數(shù)調(diào)用。本文程序設(shè)計(jì)的ProcessIO函數(shù)負(fù)責(zé)讀取上位機(jī)命令,根據(jù)所接收到的上位機(jī)命令字節(jié)0x81與0x82分別實(shí)時(shí)回傳SHT75傳感器溫濕度數(shù)據(jù)(4字節(jié))及控制繼電器開(kāi)關(guān)并同時(shí)返回繼電器狀態(tài)。
固件框架中的描述符文件usb_descriptors.c給出了VID/PID定義,描述符中設(shè)置設(shè)備類(lèi)編碼為0x0000(bDeviceClass/bDeviceSubClass),表示一個(gè)配置內(nèi)的每個(gè)接口均獨(dú)立指定了其自身的類(lèi)信息及各種接口操作,接口類(lèi)編碼0xFFFF(bInterfaceClass/bInterfaceSubClass)則表示接口類(lèi)由廠商指定。端點(diǎn)描述符中的端點(diǎn)屬性(EndpointAttributes)全部設(shè)為_(kāi)BULK(批量傳輸端點(diǎn))。PIC固件程序分別定義的數(shù)據(jù)收/發(fā)緩沖為INPacket與OutPacket,與上位機(jī)C#程序定義的緩沖OUTBuffer與INBuffer對(duì)應(yīng)。在指定端點(diǎn)非忙時(shí),固件可通過(guò)USBGenWrite、USBGenRead分別發(fā)送與接收數(shù)據(jù)包,二者最終均調(diào)用USBTransfer OnePacket(ep,dir,data,len),該函數(shù)為協(xié)議棧提供的通用單包傳輸函數(shù)。
Labcenter公司的實(shí)物電路仿真軟件Proteus具有對(duì)微控制器及其外圍電路組成的綜合應(yīng)用系統(tǒng)的交互仿真功能,仿真USB接口需要安裝虛擬USB驅(qū)動(dòng)程序(Virtual USB Drivers)并添加USBCONN組件。圖2給出了以PIC18F4550微控制器及溫濕度傳感器SHT75為核心的USB接口應(yīng)用系統(tǒng)仿真電路。
圖2 USB接口溫濕度檢測(cè)與控制系統(tǒng)仿真測(cè)試電路
PROTEUS提供的USB虛擬分析器可跟蹤設(shè)備與上位機(jī)用戶軟件及驅(qū)動(dòng)程序的所有交互信息,包括IRP請(qǐng)求(包括IOCTL與MJ_PNP)、USB事務(wù)(包括SETUP、IN、OUT)、USB寄存器(包括UCON、UIR、USTAT、BDnSTAT、BDnCNT、BDnADRL/H等)。測(cè)試運(yùn)行USB接口應(yīng)用系統(tǒng)時(shí),借助USB虛擬分析器可觀察到主機(jī)給USB設(shè)備上電、主機(jī)復(fù)位設(shè)備(RESET)、USB總線驅(qū)動(dòng)程序通過(guò)URB(USB請(qǐng)求包)請(qǐng)求USB設(shè)備描述符前8字節(jié)、主機(jī)再次復(fù)位設(shè)備(RESET)、USB總線驅(qū)動(dòng)程序通過(guò)URB執(zhí)行控制傳輸,將USB默認(rèn)地址0x00重設(shè)為操作系統(tǒng)分配的地址,及USB總線驅(qū)動(dòng)程序通過(guò)URB連續(xù)發(fā)送提取描述符請(qǐng)求,依次取得完整的設(shè)備描述符、配置描述符(包括接口描述符、端點(diǎn)描述符)、字符串描述符。PnP事件觸發(fā)即插即用管理器(PnP Manager)向WDM驅(qū)動(dòng)程序發(fā)送主功能(Major Function)碼IRP_MJ_PNP,進(jìn)入相應(yīng)的派遣函數(shù),查詢?cè)O(shè)備ID、執(zhí)行設(shè)備啟動(dòng)等。
打開(kāi)上位機(jī)C#軟件時(shí)將自動(dòng)搜索WinUSB設(shè)備,成功搜索到USB設(shè)備后,每當(dāng)C#調(diào)用WinUSB的讀、寫(xiě)管道函數(shù)與USB設(shè)備交換數(shù)據(jù)時(shí),將分別訪問(wèn)對(duì)應(yīng)的端點(diǎn)(EP1_IN或EP1_OUT)緩沖,運(yùn)行過(guò)程中均可通過(guò)USB虛擬分析器觀察到:IOCTL: BULK_OR_INTERRUPT_TRANSFER,展開(kāi)該層時(shí)可觀察到相應(yīng)的IN事務(wù)或OUT事務(wù)。
圖3 溫濕度數(shù)據(jù)采集與控制系統(tǒng)上位機(jī)C#程序
由于WinUSB的通用性與易用性,大量廠商開(kāi)始基于WinUSB開(kāi)發(fā)USB接口程序,盡管當(dāng)前版本的WinUSB驅(qū)動(dòng)尚存在若干限制,例如一次僅允許一個(gè)應(yīng)用程序與設(shè)備通信且不支持在同步端點(diǎn)之間傳輸流數(shù)據(jù)。本文通過(guò)研究微軟WinUSB通用驅(qū)動(dòng)程序框架及WinUSB驅(qū)動(dòng)包構(gòu)成及其INF文件關(guān)鍵條目、Microchip USB接口系統(tǒng)固件框架,基于C#軟件開(kāi)發(fā)平臺(tái)設(shè)計(jì)了以PIC18F455微控制器及SHT75傳感器為核心的溫濕度數(shù)據(jù)采集與控制系統(tǒng),通過(guò)了仿真運(yùn)行及實(shí)物測(cè)試,為基于WinUSB的接口系統(tǒng)開(kāi)發(fā)提供了重要參考。為更快速的開(kāi)發(fā)WinUSB的上位機(jī)用戶程序,基于微軟VS2012+WDK8.0的開(kāi)發(fā)環(huán)境除了提供USB KMDF與UMDF驅(qū)動(dòng)程序開(kāi)發(fā)模板以外,還提供了基于WinUSB的應(yīng)用程序開(kāi)發(fā)模板,通過(guò)該模板能夠自動(dòng)生成通用代碼框架,包括自動(dòng)生成INF文件。另外,微軟的Windows 8已經(jīng)不再要求為WinUSB提供定制的INF文件,這無(wú)疑將使得基于WinUSB的系統(tǒng)開(kāi)發(fā)變得更加便捷高效。
[1] 曾希強(qiáng).Linux下基于libusb的USB設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)[J].信息與電腦,2009(7):101-103.
[2] 彭定軍,陳安,高健.嵌入式Linux下基于libusb的USB驅(qū)動(dòng)開(kāi)發(fā)[J].技術(shù)與市場(chǎng),2008(11):4-5.
[3] 安愛(ài)美,徐建建.基于WDF的USB驅(qū)動(dòng)程序設(shè)計(jì)[J].自動(dòng)化與儀表,2012(1):57-60.
[4] 錢(qián)宇紅. USB 數(shù)據(jù)傳輸卡WDF 驅(qū)動(dòng)程序開(kāi)發(fā)[J].計(jì)算機(jī)應(yīng)用與軟件,2012(6):225-227.
[5] 鄒敬軒,蔡皖東.基于WDF過(guò)濾驅(qū)動(dòng)的USB存儲(chǔ)設(shè)備監(jiān)控系統(tǒng)[J].計(jì)算機(jī)工程與科學(xué),2010(3):42-44,71.
[6] 朱誠(chéng),左輝.利用KMDF 驅(qū)動(dòng)程序?qū)崿F(xiàn)USB 設(shè)備的功耗控制[J].計(jì)算機(jī)應(yīng)用與軟件,2012(12):252-254,321.
[7] 牛繼來(lái),王海霞.基于WDM 的USB驅(qū)動(dòng)程序研究與設(shè)計(jì)[J].計(jì)算機(jī)與數(shù)字工程,2007(12):127-129,139.
[8] 張智邦,鮑蘇蘇,金敏.基于WDM 模型USB 驅(qū)動(dòng)程序的設(shè)計(jì)與研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2011(11):185-188.
[9] 謝晶石.PIC單片機(jī)USB接口應(yīng)用設(shè)計(jì)[J].數(shù)字技術(shù)與應(yīng)用,2011(8):146-148.
[10] 覃冬華.基于Visual C# 的USB 接口通信程序設(shè)[J].數(shù)字技術(shù)與應(yīng)用,2010(8):90-91.
[11] 胡鍵勛.基于Visual C++編寫(xiě)USB接口溫度采集設(shè)計(jì)[J].現(xiàn)代計(jì)算機(jī),2010(4):148-150.
[12] 李偉,張東亮,楊麗麗.利用Visual C++實(shí)現(xiàn)USB設(shè)備與PC機(jī)通信[J].儀器儀表用戶,2007(6):87-89.
[13] Microchip Libraries for Applications [OL].[201211]:http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784.
[14] USB Driver Stack Architecture[OL].[201303]:http://msdn.microsoft.com/zh-cn/library/windows/hardware/hh406256#usb_2.0_driver_stack.