【正文】
ID_CODE_Handler的功能是從控制端點(diǎn)0讀取數(shù)據(jù),模塊USBDIO_IOCTL_TEST_COMMAND_Handler的功能是向控制端點(diǎn)0發(fā)送一個(gè)控制命令,模塊USBDIO_IOCTL_DMA_COMMAND_Handler的功能是向控制端點(diǎn)0發(fā)送一個(gè)要求USB設(shè)備進(jìn)行DMA傳輸?shù)目刂泼?,下面是第一個(gè)模塊的編程實(shí)例?! TSTATUS USBDIODevice::USBDIO_IOCTL_ID_CODE_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS?! Entering USBDIODevice::USBDIO_IOCTL_ID_CODE_Handler, I EOL?! URB pUrb?! LONG numData。 numData=*(PUCHAR)()。//設(shè)置讀取的數(shù)據(jù)個(gè)數(shù) pUrb=( (PUCHAR)(),//驅(qū)動(dòng)程序存放讀取的數(shù)據(jù)的內(nèi)存區(qū) numData,//wLength,讀取的數(shù)據(jù)個(gè)數(shù) 0, 0x0c,//bRequest 0,//wValue TRUE,//input TRUE, NULL, 0x0472,//wIndex,傳輸?shù)焦碳绦虻淖x數(shù)命令碼 URB_FUNCTION_VENDOR_ENDPOINT, NULL )。 if(pUrb==NULL) { () =0。 status=STATUS_INSUFFICIENT_RESOURCES?! else { () =numData?! tatus=(pUrb,NULL,NULL,0)?! elete pUrb。 } return status?! 對象I包含了應(yīng)用程序下傳的IRP內(nèi)容,包括命令或數(shù)據(jù)等參數(shù),函數(shù)BuildVendorRequest用來分配并初始化一個(gè)用于廠商請求的URB(USB Request Block),該URB將作為下傳IRP的一個(gè)參數(shù),通過函數(shù)SubmitUrb發(fā)送給總線驅(qū)動(dòng)程序,以便完成與硬件的通信?! ≡诔跏蓟疷RB時(shí)需要了解USB的傳輸方式及傳輸協(xié)議,該功能使用了USB的控制傳輸方式,該方式包括三個(gè)階段:設(shè)置階段、數(shù)據(jù)階段和狀態(tài)階段,其中數(shù)據(jù)階段可選,開發(fā)者主要關(guān)注設(shè)置階段中的8個(gè)關(guān)鍵字節(jié)的定義,8字節(jié)分成了5個(gè)字段,定義了傳輸請求及相關(guān)信息,這8個(gè)字節(jié)的格式如圖3所示?! mRequestType bRequest wValue wIndex wLength 圖53 USB設(shè)置數(shù)據(jù)格式 BmRequestType:1字節(jié),用來指定數(shù)據(jù)流動(dòng)的方向,請求的類型,以及接收者?! Request:1字節(jié),用來指定請求?! Value:2字節(jié),主機(jī)用來傳輸信息給設(shè)備,開發(fā)者可以根據(jù)情況自己定義。 wIndex:2字節(jié),主機(jī)用來傳輸信息給設(shè)備,開發(fā)者可以根據(jù)情況自己定義?! Length:2字節(jié),包含數(shù)據(jù)階段中接下來要傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)目?! ∫陨献侄蔚膽?yīng)用已經(jīng)在程序注釋中標(biāo)出,在此不再贅述。,即USB設(shè)備驅(qū)動(dòng)程序,對此程序只需稍做修改就能正常使用,具體是將類改為USB,即Class=USB,由于本驅(qū)動(dòng)程序使用符號鏈接名打開設(shè)備,所以刪除ClassGUID選項(xiàng),注意設(shè)備標(biāo)識符必需為:%DeviceDesc%=USBDIO_DDI, USB\VID_0471amp。PID_0821,其中0471是USB控制芯片的廠商識別碼,0821是USB設(shè)備標(biāo)識碼。驅(qū)動(dòng)程序安裝過程是:將USB設(shè)備加電,連入計(jì)算機(jī)的USB接口,這時(shí)候會(huì)看到Windows操作系統(tǒng)提示發(fā)現(xiàn)新硬件,提問是否安裝驅(qū)動(dòng)程序,選擇是,然后選擇驅(qū)動(dòng)程序所在文件夾。USB設(shè)備驅(qū)動(dòng)程序的調(diào)用為了完成對驅(qū)動(dòng)程序的調(diào)用,筆者使用VC++,程序包共由五個(gè)功能模塊組成,用戶通過調(diào)用這些模塊即可方便的完成對USB外設(shè)的控制及讀寫,這些模塊如下:1)int CTRLReadData(unsigned char usbSelect,unsigned char *rbuffer,unsigned char numData),主要功能是讀取ISP1581控制端點(diǎn)0發(fā)來的數(shù)據(jù),數(shù)據(jù)存放在緩沖區(qū)rbuffer中。2)int CTRLSendTestCommand(unsigned char usbSelect,unsigned short int testCommand),主要功能是發(fā)送測試命令,變量testCommand定義了測試命令。3) int CTRLSendDMACommand(unsigned char usbSelect,unsigned char dmaDirection,unsigned char ramSelect,unsigned long dmaLength),主要功能是發(fā)送DMA傳輸命令,變量dmaDirection定義數(shù)據(jù)傳輸方向,ramSelect定義將要操作的USB外設(shè)的存儲(chǔ)器,dmaLength定義了數(shù)據(jù)傳輸總數(shù)。4)int DMARead(unsigned char usbSelect,unsigned char *rbuffer,int len,int waitTime),主要功能是計(jì)算機(jī)批量讀取ISP1581中的數(shù)據(jù),而ISP1581以DMA方式從外部RAM讀取數(shù)據(jù)。5)int DMAWrite(unsigned char usbSelect, unsigned char *rbuffer, int len, int waitTime),主要功能是計(jì)算機(jī)批量寫數(shù)據(jù)到ISP1581,而ISP1581將以DMA方式寫數(shù)據(jù)到外部RAM。 結(jié)語USB設(shè)備驅(qū)動(dòng)程序開發(fā)是Windows編程中較難的一個(gè)方面,要求開發(fā)者不但要有良好的Windows編程知識,還要掌握USB控制芯片工作原理、USB傳輸協(xié)議、USB固件等相關(guān)知識,本文所設(shè)計(jì)的USB設(shè)備驅(qū)動(dòng)程序,已經(jīng)應(yīng)用到某雷達(dá)的自動(dòng)測試設(shè)備中,驅(qū)動(dòng)程序在計(jì)算機(jī)應(yīng)用程序控制下可以順利的發(fā)送各種測試命令,批量輸入或者輸出大量數(shù)據(jù),達(dá)到設(shè)計(jì)要求。 USB設(shè)備應(yīng)用程序設(shè)計(jì)USB設(shè)備應(yīng)用程序是實(shí)現(xiàn)PC機(jī)對USB接口芯片PDIUSBD12的接口控制和讀寫操作,提供友好的人機(jī)界面。由于應(yīng)用程序中涉及到與硬件打交道的底層函數(shù),會(huì)大量的引用Win32 API函數(shù),在Visual C++環(huán)境下開發(fā)是比較直觀和順乎邏輯的。要編寫USB設(shè)備的驅(qū)動(dòng)程序,必須要有能夠編譯WDM驅(qū)動(dòng)程序的軟件環(huán)境,建議使用Visual C++來編制該驅(qū)動(dòng)程序。應(yīng)用程序主要通過對驅(qū)動(dòng)程序中函數(shù)的利用來實(shí)現(xiàn)對USB設(shè)備的操作控制。因此在編寫設(shè)備應(yīng)用程序時(shí),可以使用可讀性和移植性很好的Visual C++,Visual Basic,Delphi等開發(fā)環(huán)境來生成控制所需的交互界面,大大方便用戶使用。設(shè)計(jì)USB設(shè)備應(yīng)用程序時(shí):一個(gè)是使用MFC(Microsoft Foundation Class),這樣工作量相對來說要少得多,用戶也比較方便;另一個(gè)是使用底層的API函數(shù)編寫程序,這樣雖然比較繁瑣,但是可以使編程人員看到許多使用MFC編程時(shí)看不到的東西,也能夠深入了解Windows系統(tǒng)更底層的知識。應(yīng)用程序的實(shí)現(xiàn)用戶應(yīng)用程序是系統(tǒng)與用戶的接口,它通過通用驅(qū)動(dòng)程序完成對外設(shè)的控制和通信。在編程時(shí),首先要建立與外設(shè)的連接,然后才能實(shí)施數(shù)據(jù)的傳輸。用戶程序首先必須查找設(shè)備,打開設(shè)備的句柄,然后進(jìn)行讀寫和控制操作,最后是關(guān)閉設(shè)備句柄。用戶應(yīng)用程序的流程如圖54所示。NNYY成功失敗檢測USB設(shè)備設(shè)置設(shè)備參數(shù)啟動(dòng)A/D模塊請求上傳數(shù)據(jù)包報(bào)告數(shù)據(jù)丟失獲得有效數(shù)據(jù)包下組數(shù)據(jù)準(zhǔn)備就緒顯示錯(cuò)誤信息返回存儲(chǔ)、顯示數(shù)據(jù)延遲至下組數(shù)據(jù)包準(zhǔn)備就緒啟動(dòng)USB設(shè)備 圖54 應(yīng)用程序流程圖 用戶應(yīng)用程序的主要功能為:開啟或關(guān)閉USB設(shè)備、檢測USB設(shè)備、設(shè)置USB數(shù)據(jù)傳輸管道、設(shè)置A/D狀態(tài)和數(shù)據(jù)采集端口、實(shí)時(shí)從USB接口采集數(shù)據(jù)、顯示并分析數(shù)據(jù)。當(dāng)PDIUSBD12的FIFO緩沖區(qū)存滿后,PDIUSBD12自動(dòng)將數(shù)據(jù)打包即時(shí)請求讀入數(shù)據(jù),由SIE自動(dòng)發(fā)送數(shù)據(jù)包。另外,當(dāng)系統(tǒng)啟動(dòng)A/D模塊后,便會(huì)創(chuàng)建兩個(gè)線程:采樣線程和顯示存盤線程。采樣線程負(fù)責(zé)將采集數(shù)據(jù)寫到應(yīng)用程序提交的內(nèi)存;而顯示存盤線程負(fù)責(zé)給應(yīng)用程序發(fā)送顯示和存盤消息。當(dāng)應(yīng)用程序接收到此消息后,便從它提交的內(nèi)存中讀取數(shù)據(jù)并顯示和存盤。此處需要注意的是采樣線程和顯示存盤線程在讀寫應(yīng)用程序提交的內(nèi)存時(shí)要保持同步。第六章 結(jié) 論USB是英文Universal Serial Bus的縮寫,中文含義是“通用串行總線”。它是一種應(yīng)用在PC領(lǐng)域的新型接口技術(shù)。早在1995年,就已經(jīng)有PC機(jī)帶有USB接口了,但由于缺乏軟件及硬件設(shè)備的支持,這些PC機(jī)的USB接口都閑置未用。1998年后,隨著微軟在Windows 98中內(nèi)置了對USB接口的支持模塊,加上USB設(shè)備的日漸增多,USB接口才逐步走進(jìn)了實(shí)用階段。這幾年,隨著大量支持USB的個(gè)人電腦的普及,USB逐步成為PC機(jī)的標(biāo)準(zhǔn)接口已經(jīng)是大勢所趨。在主機(jī)(host)端,最新推出的PC機(jī)幾乎100%支持USB;而在外設(shè)(device)端,使用USB接口的設(shè)備也與日俱增,例如數(shù)碼相機(jī)、掃描儀、游戲桿、磁帶和軟驅(qū)、圖像設(shè)備、打印機(jī)、鍵盤、鼠標(biāo)等等。本論文所完成的工作和分析可概括為以下幾點(diǎn):。分析了USB主機(jī)、USB設(shè)備、USB物理層以及USB連接,詳細(xì)說明了USB的數(shù)據(jù)流。 c51開發(fā)固件。探索了PDIUSBD12固件編程的思想,將PDIUSBD12的固件設(shè)計(jì)成完全的中斷驅(qū)動(dòng),MCU有更多的時(shí)間處理其它工作。3. 。最大傳輸率可以達(dá)到12Mbps,是指主機(jī)控制器最大的處理能力,而一個(gè)USB設(shè)備不可能擁有這么高的帶寬,它的帶寬由主機(jī)的總線驅(qū)動(dòng)程序管理。當(dāng)添加或者刪除一個(gè)USB設(shè)備時(shí),連接的其它USB設(shè)備的資源要重新分配,以提高總線的利用率。單個(gè)USB設(shè)備所能擁有的帶寬一般小于8Mbps。為了實(shí)現(xiàn)高速數(shù)據(jù)傳輸。,這就從根本上限制了數(shù)據(jù)傳輸速度的提高。它的工作主頻比較低,晶振太小,處理數(shù)據(jù)不夠迅速??梢允褂盟俣雀斓奶幚砥?。,雖然程序的可讀性相對較好,但它的執(zhí)行效率卻不如匯編語言的執(zhí)行效率高。選擇編程語言也是提高設(shè)備傳輸率的方法之一。雖然本設(shè)計(jì)還有許多缺陷,不足以完成大批量數(shù)據(jù)的高速傳送,但是它己經(jīng)是USB數(shù)據(jù)采集系統(tǒng)的雛形。只要在后續(xù)的研究中通過改善硬件環(huán)境和軟件算法解決好一系列存在的問題,一定會(huì)得到充分體現(xiàn)USB總線簡單易用、傳輸速度快等特點(diǎn)的數(shù)據(jù)采集系統(tǒng)。參考文獻(xiàn)[1] [M].北京:人民郵電出版社,[2] 許永和,[M].北京:北京航空航天大學(xué)出版社,[3]李全利,[M].北京:高等教育出版社,[4] USB固件編程與驅(qū)動(dòng)開發(fā)[M].北京:北京航空航天大學(xué)出版社,[5]邊海龍,[M].北京:人民郵電出版社,[6][M].西安:西安電子科技大學(xué)出版社,[7] WDM設(shè)備驅(qū)動(dòng)程序開發(fā)指南[M].孫義,:機(jī)械工業(yè)出版社,[8]劉炳文,李鳳華編著Visual Basic Win32 API程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,[9][M].西安:西安電子科技大學(xué)出版社,[10]Jan Axelson編著;[M].北京:中國電力出版社,附錄英文原文HAVE39。2007 IEEE International Workshop onHaptic Audio Visual Environments and their ApplicationsOttawa, Canada 1214 October 2007Extending Blender: Development of a Haptic Authoring ToolSheldon Andrews39。, Mohamad Eid2, Atif Alamri2, and Abdulmotaleb El Saddik2Multimedia Communications Research Laboratory MCRLabSchool ofInformation Technology and Engineering University ofOttawaOttawa, Ontario, KIN 6N5, Canada39。sandrO71]@site. uottawa. ca, 2 teid, atifW abed] @ mcrlab. uottawa. CaAbstract In this paper, we present our work to extend a well known 3D graphic modeler Blender to support haptic modeling and rendering. The extension tool is named HAMLAT (Haptic Application Markup Language Authoring Tool). We describe the modifications and additions to the Blender source code which have been used to create HAMLAT Furthermore, we present and discuss the design decisions used when developing HAMLAT, and also an implementation road map which describes the changes to the Blender so