freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

usb技術(shù)及其驅(qū)動程序開發(fā)(doc畢業(yè)設(shè)計(jì)論文)(參考版)

2025-07-01 09:17本頁面
  

【正文】 // 循環(huán)直到Esc鍵盤按下 do { //如果ReadFile不成功,則返回錯誤 //如果成功,則數(shù)據(jù)放在數(shù)組KbdRepor。BytesReturned, NULL)) // 讀鍵盤的數(shù)據(jù) DWORD TxdBytes。DeviceIoControl( hUsbKbd, IOCTL_USBKBD_SET_READ_TIMEOUT, amp。 printf(\nTest %d\n,TestNo++)。 ………… //上面省略的部分是實(shí)現(xiàn)2,3,4的功能,由于不是很重要,故略去不提。 HANDLE hUsbKbd = GetDeviceViaInterface((LPGUID)amp。int main(int argc, char* argv[]){ int TestNo = 1。167。9) 讀幀長度和幀號。7) 寫一系列的位組合來改變鍵盤LED燈的顯示,變化之間有1/3秒的延時。6) 一直讀取鍵盤的輸入數(shù)據(jù),知道按下Esc鍵(代碼0X29)。4) 讀取Hid報告描述符,類型0X22。2) 讀取設(shè)備描述符。UsbKbdTest程序調(diào)用了上述的幾個Api函數(shù),實(shí)現(xiàn)與設(shè)備的通信。 表3-3 與HID通信使用的API函數(shù)API函數(shù)DLL目的HidD_GetHidGuid得到Hid類的GUIDSetupDiGetClassDevs返回包含一個特定類的所有設(shè)備的設(shè)備信息組SetupDiEnumDeviceInterfaces返回關(guān)于設(shè)備信息組中的一個設(shè)備的信息SetupDiDeviceInterfaceDetail返回一個設(shè)備路徑名CreateFile打開與一個設(shè)備的通信HidD_GetAttributes返回銷售商ID,產(chǎn)品ID等HidD_GetPreparsedData返回一個句柄到一個保存設(shè)備能力信息的緩沖器HidP_GetCaps返回描述設(shè)備能力的結(jié)構(gòu)HidP_GetValueCaps返回描述設(shè)備值能力的結(jié)構(gòu)HidP_GetButtonCaps返回描述設(shè)備能力按鈕的能力的結(jié)構(gòu)WriteFile發(fā)送一個報告給設(shè)備ReadFile從設(shè)備讀取報告CloseHandle關(guān)閉句柄SetupDiDestroyDeviceInfoList釋放SetupDiGetClassDevs使用的資源HidD_FreePreparsedData釋放HidD_GetPreparsedData使用的資源函數(shù)文檔分布在MSDN庫和Windows DDK中,不過2001-08的MSDN已經(jīng)包含上述所有函數(shù)的說明。函數(shù)是以其被應(yīng)用程序調(diào)用的頻率的一般順序列出的。 找到設(shè)備后,應(yīng)用程序就可以通過收發(fā)報告來與設(shè)備交換信息了。應(yīng)用程序首先找到連接到系統(tǒng)的HID是什么,然后檢查細(xì)節(jié),知道找到滿足要求的屬性。在應(yīng)用程序能與HID交換數(shù)據(jù)之前,它先要找到設(shè)備,獲取有關(guān)它的報告的信息。 167。 主機(jī)應(yīng)用程序與虛擬設(shè)備的通信 其實(shí)驅(qū)動程序設(shè)計(jì)完成之后,并不是就大功告成。 return status。 // 檢查返回狀態(tài)是否正確,否則返回打開USB設(shè)備錯誤 if( !NT_SUCCESS(status) || !USBD_SUCCESS( urb)) { status = STATUS_UNSUCCESSFUL。OutputData, NULL, 1, // 輸出的數(shù)據(jù) NULL)。 PURB urb = (PURB)ExAllocatePool(NonPagedPool, UrbSize)。 下面是控制傳輸函數(shù)UsbSendOutputReport(…)的偽代碼:const UCHAR SET_REPORT = 0x09?!皩憽盜RP處理程序發(fā)送寫緩沖區(qū)的第一個字節(jié)給鍵盤,作為HID“輸出報告”。 return status。 //釋放內(nèi)存并返回狀態(tài)。 break。 ULONG ticks = (ULONG)( )。 KeQueryTickCount( amp。 __int64* pData = (__int64 *)UserBuffer。 //如果得到的數(shù)據(jù)為非0,則退出循環(huán),因?yàn)槲覀兊玫降膶?shí)際的鍵盤數(shù)據(jù)。 UsbBuildInterruptOrBulkTransferRequest( urb, UrbSize, dxUsbPipeHandle, //指定管道句柄 UserBuffer, NULL, OutputBufferSize,//輸入數(shù)據(jù) USBD_TRANSFER_DIRECTION_IN, //指定為輸入方向 NULL)。 //循環(huán),得到鍵盤數(shù)據(jù),并進(jìn)行處理。StartTickCount)。 LARGE_INTEGER StartTickCount。 PURB urb = (PURB)ExAllocatePool(NonPagedPool, UrbSize)。 ULONG OutputBufferSize = 8。 UserBufferSize){ //檢查Usb管道句柄是否可用,且輸入緩沖區(qū)是否大小合適 //否則就返回錯誤狀態(tài)。當(dāng)一個鍵被按下和松開,一個真正的驅(qū)動程序會返回讀取的數(shù)據(jù)。 UsbKbd發(fā)出“中斷傳輸”URB接收任何鍵盤報告。在空閑時間段(500ms左右)的最后,鍵盤返回?cái)?shù)據(jù)。一般USB鍵盤都規(guī)定了一個每多少秒發(fā)生一次中斷傳輸,用于實(shí)驗(yàn)的鍵盤時每8ms發(fā)生一次。這就是在USB總線上發(fā)生的動作。當(dāng)按下和松開一個鍵時,就產(chǎn)生一個鍵盤數(shù)據(jù)報告。鍵盤以一個8位數(shù)據(jù)報告相應(yīng)USB中斷傳輸。}中斷傳輸U(kuò)sb管道句柄可用?輸入緩沖區(qū)合適?循環(huán)得到鍵盤數(shù)據(jù)定時器中斷檢查超時釋放內(nèi)存并返回 圖3-7 中斷傳輸?shù)某绦蛄鞒?UsbKbd的實(shí)現(xiàn)目的,就是根據(jù)原始鍵盤數(shù)據(jù)來應(yīng)答Win32請求ReadFile(),并實(shí)現(xiàn)10秒的延時。 } UnlockDevice(dx)。 dxIODisabled = false。 break。 break。 dxIODisabled = true。 return status。 break。 break。 break。 NTSTATUS status = STATUS_SUCCESS。 LockDevice(dx) // 得到當(dāng)前的棧單元以及當(dāng)前棧單元的次功能代碼 PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp)。得到當(dāng)前棧單元次功能代碼判斷此功能代碼得到當(dāng)前的設(shè)備對象和IRP棧單元解鎖設(shè)備并返回 圖36 “PNP”IRP的處理流程N(yùn)TSTATUS UsbKbdPnp( IN PDEVICE_OBJECT fdo,//參數(shù)輸入為設(shè)備對象 IN PIRP Irp)//輸入為IRP{ //得到當(dāng)前的設(shè)備對象擴(kuò)展,這個對象放在輸入的設(shè)備對象之中 PUSBKBD_DEVICE_EXTENSION dx=(PUSBKBD_DEVICE_EXTENSION)fdoDeviceExtension。圖36給出了這個IRP的處理流程。這個錯誤應(yīng)使用USBD_ERROR宏檢測,而不是使用USBD_HALTED宏。但是缺省管道決不能暫停。USBD_HALTED宏檢測到這個錯誤,連接到當(dāng)前的URB的所有URB都被取消。但是,如果另一個管道暫停,則不要復(fù)位該端口。 return status。 USBD_PORT_CONNECTED) || !(PortStatus amp。 if( !NT_SUCCESS(status)) return status。 if( !NT_SUCCESS(status)) return status。 USBD_PORT_ENABLED) return status。 USBD_PORT_CONNECTED)) return STATUS_NO_SUCH_DEVICE。//檢查端口狀態(tài)是否正確,否則返回if( !NT_SUCCESS(status)) return status。//返回狀態(tài)}NTSTATUS UsbResetDevice( IN PUSBKBD_DEVICE_EXTENSION dx){ULONG PortStatus。}//返回調(diào)用狀態(tài)NTSTATUS UsbResetPort( IN PUSBKBD_DEVICE_EXTENSION dx){NTSTATUS status = CallUSBDI( dx, NULL, IOCTL_INTERNAL_USB_RESET_PORT)。PortStatus,IOCTL_INTERNAL_USB_GET_PORT_STATUS)。 PortStatus//輸出端口狀態(tài)){ PortStatus = 0。程序的說明已經(jīng)在注釋中添加。UsbResetDevice檢查USBD_PORT_CONNECTED和USBD_PORT_ENALBLE位,如果有需要,則調(diào)用UsbResetPort。下面的程序偽代碼說明了當(dāng)一個WIN32程序打開設(shè)備的一個句柄時,UsbKbd如何得到端口的狀態(tài)并復(fù)位它的設(shè)備的。設(shè)備復(fù)位設(shè)備復(fù)位的程序流程已經(jīng)由圖35表現(xiàn)出來。 167。UsbKbd驅(qū)動程序在“創(chuàng)建”IRP處理程序中做流程中的工作。CallUSBDI()。 函數(shù)CallUSBDI(…)(下面所有自定義的函數(shù)均在此文件中),它為內(nèi)部IOCTL創(chuàng)建一個新的IRP棧單元,填寫該IRP,并沿著設(shè)備棧向下把這個IRP棧單元發(fā)送到USB系統(tǒng)驅(qū)動程序中。 Status域使用它的高2位作為狀態(tài)代碼,其他位填入更詳細(xì)的信息。 USBD_STATUS Status。//這里是定義URB,下面是分別定義聯(lián)合里的每個結(jié)構(gòu) //鑒于空間的關(guān)系,只定義了_URB_HEADER,其余的大體相同struct _URB_HEADER{ USHORT Length?!?/還有許多別的結(jié)構(gòu),這里省略了}。 struct _URB_SELECT_INTERFACE UrbSelectInterface。URB的處理結(jié)果在Status域中返回。 URB結(jié)構(gòu)是一個聯(lián)合,含有16個不同的_URB_*指針結(jié)構(gòu)(在附錄里有詳細(xì)的介紹),每個功能代碼使用其中的一個URB結(jié)構(gòu)詳細(xì)說明它的輸入輸出參數(shù)。USB客戶使用URB做它們大多數(shù)的工作。 表3-2 USBD的內(nèi)部IOCTLIOCTL_INTERNAL_USB_SUBMIT_URB發(fā)出URB并等待返回結(jié)果IOCTL_INTERNEL_USB_RESET_PORT復(fù)位并重新啟用一個端口IOCTL_INTERNAL_USB_GET_PORT_STATUS得到端口的狀態(tài):USBD_PORT_ENABLE USBD_PORT_CONNECTEDIOCTL_INTERNAL_USB_ENABLE_PORT重新啟用一個被禁止的端口 最重要的內(nèi)部IOCTL是IO_INTERNAL_SUBMIT_URB,它發(fā)出USB請求塊并由USB類驅(qū)動程序處理。 USBDI(USB驅(qū)動程序接口)的內(nèi)部IOCTL只能用于內(nèi)核的其他部分(如設(shè)備驅(qū)動程序),不能用于用戶態(tài)應(yīng)用程序,即只能用于底層的設(shè)備驅(qū)動程序,不能用于基于操作系統(tǒng)的應(yīng)用程序。完成右邊的功能創(chuàng)建并初始化IRP調(diào)用USBDI初始化Usb設(shè)備構(gòu)造內(nèi)部IOCTL發(fā)出URB存儲URB指針關(guān)閉設(shè)備調(diào)用下一個驅(qū)動程序圖3-3 UsbKbd驅(qū)動程序流程 圖3-4 調(diào)用USBDI流程調(diào)用USBDI 調(diào)用USBDI的具體流程在圖3-4中有很詳細(xì)的說明,自編的函數(shù)CallUSBDI(…)完成USBDI的調(diào)用。167。在繪制pcb板時,通過轉(zhuǎn)接口,把這四個引腳通過電纜接到通用的usb接口上去即可。 Usb 鍵盤通過專門的usb接口與主板上的usb口連接。它的封裝如下圖,CY7C63413的外形封裝管腳的定義如下表,CY7C63413的管腳功能管腳名稱I/O封裝功能D+,D-I/O1,2數(shù)據(jù)傳輸管腳P0[7…0]I/O15,26,16,25,17,24,18,23通用I/O端口P1[7…0]I/O11,30,12,2913,28,14,27通用I/O端口P2[7…0]I/O7,34,8,339,32,10,31通用I/O端口P3[7…0]I/O3,38,4,37,5,36,6,37通用I/O端口DAC[7…0]I/ON/A數(shù)模轉(zhuǎn)換I/O端口XTAL[in]IN21輸入晶振XTAL[out]OUT22輸出晶振Vpp19編程電源,一般為地Vcc40芯片電壓Vss20,39地一般把USB與PC通信的部分用C語言或者匯編指令完成,對于這種芯片的硬件編程,一般是單片機(jī)編程,完成底層的操作。 USB鍵盤驅(qū)動程序 論文所用的USB鍵盤是標(biāo)準(zhǔn)的108鍵盤,只不過接口是USB口而不是PS/2口,而且里面的USB芯片控制器是CY7C63413微控制器。IRP
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1