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

正文內(nèi)容

usb技術(shù)及其驅(qū)動(dòng)程序開發(fā)(doc畢業(yè)設(shè)計(jì)論文)(編輯修改稿)

2024-07-25 09:17 本頁面
 

【文章內(nèi)容簡介】 USB標(biāo)準(zhǔn)設(shè)備請求這一部分描述的是所有USB設(shè)備都定義的標(biāo)準(zhǔn)設(shè)備請求。表2-1列出了所有的標(biāo)準(zhǔn)請求。請求號請求數(shù)據(jù)源接收方值指針長度(B)數(shù)據(jù)01HCLEAR_FEATURE無設(shè)備,接口終端特性設(shè)備,接口終端0無08HGET_CONFIGURATION無設(shè)備零設(shè)備1配置值06HGET_DESCRIPTOR設(shè)備設(shè)備描述符類型和指針設(shè)備或語言ID描述符長度描述符0AHGET_INTERFACE無接口0接口1可選設(shè)置00HGET_STATUS設(shè)備設(shè)備,接口,終端0設(shè)備,接口,終端2端點(diǎn)狀態(tài)05HSET_ADDRESS無設(shè)備設(shè)備地址00無09HSET_CONFIGURATION無設(shè)備配置值設(shè)備0無07HSET_DESCRIPTOR主機(jī)設(shè)備描述符類型和指針設(shè)備或語言ID描述符長度描述符03HSET_FEATURE無設(shè)備,接口,終端特性選擇符設(shè)備,接口,終端0無0BHSET_INTERFACE無接口可選設(shè)置接口號1無0CHSYNCH_FRAME設(shè)備終端0終端2幀號 表21 標(biāo)準(zhǔn)設(shè)備請求a、清除特性(ClearFeature())這個(gè)請求是被用來清除一個(gè)指定的特性。一個(gè)ClearFeature( )請求所指的特性如果不能被清除,不存在或指的是不存在的接口或結(jié)點(diǎn)號,會產(chǎn)生請求錯(cuò)誤。 如果長度不為0,設(shè)備響應(yīng)無定義。 缺省狀態(tài):當(dāng)設(shè)備處于缺省狀態(tài)時(shí),對此請求的反應(yīng)無定義。 地址狀態(tài):在設(shè)備處于地址狀態(tài)時(shí)這個(gè)請求是合法的,但如果該請求指的是接口或是非零號端結(jié)點(diǎn),會引起請求錯(cuò)誤。配置狀態(tài):在此狀態(tài)下,該請求合法。b、取得配置(GetConfiguration())此請求返回當(dāng)前設(shè)備配置值。 如果返回0值表明設(shè)備未配置。 如果值,指針,長度的值與上面表中不同,設(shè)備響應(yīng)無定義。 缺省狀態(tài):該請求響應(yīng)無定義。 地址狀態(tài):返回0值。 配置狀態(tài):非0的 配置值被返回。c、取得描述符(GetDescriptor())這個(gè)請求返回存在的描述符。這個(gè)標(biāo)準(zhǔn)請求包括三種描述符:設(shè)備、配置、及字符串。一個(gè)配置描述符的設(shè)備請求會一次返回配置描述符,所有的接口描述符和所有接口的端節(jié)點(diǎn)的描述符。第一個(gè)接口描述符緊跟著配置描述符,隨后是接口的端點(diǎn)的描述符。如果有其它的接口與端點(diǎn),它們的描述符則跟在第一個(gè)接口與端點(diǎn)描述符之后。與類有關(guān)的描述符,或Usb外設(shè)生產(chǎn)廠商定義的描述符跟在標(biāo)準(zhǔn)描述符之后。 所有的設(shè)備必須提供一個(gè)設(shè)備描述符并且至少一個(gè)配置描述符,如果一個(gè)設(shè)備不支持一個(gè)請求的描述符,則返回請求錯(cuò)誤。 缺省狀態(tài):此請求合法。 地址狀態(tài):此請求合法。配置狀態(tài):此請求合法。d、取得接口設(shè)置(GetInterface()) 這個(gè)請求返回所指接口的選中的可選設(shè)置。 有些USB設(shè)備的接口配置有互斥的設(shè)置。這個(gè)請求使得主機(jī)決定當(dāng)前設(shè)置。 如果值或長度不依上表設(shè)置,設(shè)備響應(yīng)無定義。 如果所指的接口不存在,返回請求錯(cuò)誤。 缺省狀態(tài):此狀態(tài)下,設(shè)備對該請求響應(yīng)無定義。 地址狀態(tài):設(shè)備返回請求錯(cuò)誤。 配置狀態(tài):此請求合法。e、取得狀態(tài)(GetStatus ( )) 這個(gè)請求返回所指接收者的狀態(tài)。 如果值或長度不是上表中值,或指針在讀取設(shè)備狀態(tài)請求時(shí)非0,則設(shè)備響應(yīng)無定義。 缺省狀態(tài):設(shè)備響應(yīng)無定義。 地址狀態(tài):如果所指的是接口或是一個(gè)非0號端點(diǎn),設(shè)備響應(yīng)返回請求出錯(cuò)。 配置狀態(tài):如果所指接口或端點(diǎn)不存在,返回請求錯(cuò)誤。f、設(shè)置地址(SetAddress ( )) 本請求為主機(jī)指定以后與設(shè)備通信的地址。如果所指的設(shè)備地址大于127或指針或者長度非零,設(shè)備響應(yīng)無定義。設(shè)備對SetAddress(0)的響應(yīng)無定義。 缺省狀態(tài):如果地址值非0,那設(shè)備將進(jìn)入地址狀態(tài),否則地址仍留在缺省態(tài)(此非出錯(cuò)狀態(tài))。 地址狀態(tài):如果新地址值為0,進(jìn)入缺省態(tài),否則仍留在地址狀態(tài)但使用新地址。配置狀態(tài):在此狀態(tài)下設(shè)備對此請求的響應(yīng)無定義。g、設(shè)置配置值(SetConfiguration( )) 此請求設(shè)置設(shè)備配置值 值的低字節(jié)指出配置,這個(gè)配置值必須為0或與配置描述符中的一個(gè)配置相一致。如果配置值為0,設(shè)備置地址狀態(tài)。值的高字節(jié)保留。 如果指針,長度或者值的高字節(jié)非0,則設(shè)備對之的響應(yīng)無定義。 缺省狀態(tài):設(shè)備響應(yīng)無定義 地址狀態(tài):如果所指的配置為0,設(shè)備停留在地址狀態(tài)。如果所指的配置與描述符中的一個(gè)值相匹配,那個(gè)配置就被選中,設(shè)備轉(zhuǎn)到配置有。否則,返回請求錯(cuò)誤 配置狀態(tài):如果配置值為0,設(shè)備進(jìn)入地址狀態(tài)。如果配置值非0并與描述符中的一個(gè)配置相匹配則設(shè)備仍留在配置態(tài),但采用新的配置值,否則返回請求錯(cuò)誤。h、設(shè)置描述符(SetDescriptor ( )) 此請求用于更新或添加新的描述符。 值域高字節(jié)指出了描述符的類型,低字節(jié)指出了描述符索引。指針域指出了字符串描述符的語言標(biāo)識,對于其它描述符來說它為0。長度域指出從主機(jī)傳向設(shè)備的字節(jié)數(shù)。 如果設(shè)備不支持該請求則設(shè)備返回一個(gè)請求錯(cuò)誤。 缺省狀態(tài):此狀態(tài)下設(shè)備對該請求反應(yīng)無定義。 地址狀態(tài):如果設(shè)備支持請求,則為合法。 配置狀態(tài):如果設(shè)備支持請求,則為合法。i、設(shè)置特性(SetFeature ( )) 這個(gè)請求用來設(shè)置或使一個(gè)特性生效。 SetFeature ( )請求如果指出一個(gè)不存在的特性會使得設(shè)備在交換狀態(tài)階段返回STALL信號。 如果SetFeature ( )指的是一個(gè)不存在的接口或端點(diǎn),設(shè)備返回一個(gè)請求錯(cuò)誤。 缺省狀態(tài):設(shè)備響應(yīng)無定義。 地址狀態(tài):合法、除非請求錯(cuò)誤。 配置狀態(tài):合法。j、設(shè)置接口(SetInterface ( )) 此請求讓主機(jī)為指定的接口選擇一個(gè)設(shè)置。 如有USB設(shè)備接口配置中有互斥設(shè)置。此請求讓主機(jī)選擇所要的設(shè)置。如果設(shè)備的接口只支持缺省設(shè)置,在狀態(tài)交換階段設(shè)備返回STALL 如果所指接口或設(shè)置不存在,設(shè)備返回請求錯(cuò)誤。 缺省狀態(tài):設(shè)備響應(yīng)無定義。 地址狀態(tài):設(shè)備返回請求錯(cuò)誤。 配置狀態(tài):合法。k、同步幀(SynchFrame ( )) 該請求用來設(shè)置或返回一個(gè)結(jié)點(diǎn)的同步幀。 如果所指的端點(diǎn)不支持此請求,設(shè)備返回一個(gè)請求錯(cuò)誤。 缺省狀態(tài):設(shè)備響應(yīng)無定義。 地址地址:設(shè)備返回請求錯(cuò)誤。配置狀態(tài):此請求合法。除了11種標(biāo)準(zhǔn)請求外,USB允許類和供應(yīng)商也定義他們自己的請求,這里就不在贅述了。第三章 USB驅(qū)動(dòng)程序的開發(fā) 設(shè)備驅(qū)動(dòng)是保證應(yīng)用程序訪問硬件設(shè)備的軟件組件。硬件設(shè)備可能是打印機(jī),調(diào)制解調(diào)器,鍵盤,視頻顯示器或者任何連接到計(jì)算機(jī)的電子電路。設(shè)備可能在計(jì)算機(jī)內(nèi)部,或者是使用電纜連接到計(jì)算機(jī)上。設(shè)備可以是標(biāo)準(zhǔn)類型,也可以不是,也包括自定義的設(shè)備。 一個(gè)設(shè)備驅(qū)動(dòng)使得應(yīng)用程序不必知道物理連接,信號和與一個(gè)設(shè)備通信需要的協(xié)議等細(xì)節(jié)。應(yīng)用程序是用戶運(yùn)行的程序,包括支持自定義硬件的特殊用途的應(yīng)用程序。設(shè)備驅(qū)動(dòng)可以保證應(yīng)用程序代碼只通過外設(shè)名字(如Legend Keyboard)訪問外設(shè)或者端口目的地。應(yīng)用程序不需要知道外設(shè)連接端口的物理地址,不需要精確監(jiān)視和控制外設(shè)需要的交換信號。 設(shè)備驅(qū)動(dòng)通過在應(yīng)用層和硬件專用代碼之間的轉(zhuǎn)化來完成它的任務(wù)。167。 驅(qū)動(dòng)程序與USB設(shè)備的通訊USB設(shè)備的選擇很多外設(shè)符合標(biāo)準(zhǔn)類,例如硬盤,光驅(qū),打印機(jī),鍵盤和鼠標(biāo)。對于這些外設(shè),Windows包括通用驅(qū)動(dòng),這個(gè)類中的設(shè)備都可以使用。如果設(shè)備具有獨(dú)特的功能,則供應(yīng)商會提供一個(gè)稱為minidriver的附加驅(qū)動(dòng),對通用驅(qū)動(dòng)加以補(bǔ)充。 一些外設(shè)提供接口選擇,選項(xiàng)中可能包括Usb。一個(gè)鍵盤可以使用原始的接口,也可以是Usb接口。在這種情況下,minidriver可以在通用驅(qū)動(dòng)和設(shè)備使用的接口之間通信。Windows為Hid(Human Interface Device)類提供了minidriver,包括鍵盤和鼠標(biāo)。對于其他設(shè)備,Windows不支持Usb接口,因此,產(chǎn)品供應(yīng)商必須提供完整的驅(qū)動(dòng)程序。USB驅(qū)動(dòng)的Win32驅(qū)動(dòng)模式 Windows的Usb設(shè)備驅(qū)動(dòng)必須遵循微軟在Win98和更新的版本中為用戶定義的Win32驅(qū)動(dòng)模式。這些驅(qū)動(dòng)以WDM(Windows Driver Model)為主,擴(kuò)展名為sys。像其他低級驅(qū)動(dòng)一樣,WDM驅(qū)動(dòng)不能驅(qū)動(dòng)應(yīng)用程序,因?yàn)樗筒僮飨到y(tǒng)以更高的優(yōu)先級通信。WDM驅(qū)動(dòng)可以允許或拒絕應(yīng)用程序訪問設(shè)備。USB的驅(qū)動(dòng)層分層驅(qū)動(dòng) USB通信使用分層驅(qū)動(dòng)模型,每層處理一部分通信過程。把通信分成層是有效的,因?yàn)檫@樣可以使不同的設(shè)備在一些任務(wù)上使用相同的驅(qū)動(dòng)。舉個(gè)例子,所有設(shè)備都連接到USB上,因此有一套可以被所有設(shè)備訪問的,包括操作系統(tǒng)中的,用來處理USB專用通信的驅(qū)動(dòng)使明智的。也可以選擇使得每個(gè)設(shè)備驅(qū)動(dòng)直接與USB硬件通信,這樣就會出現(xiàn)很多重復(fù)的勞動(dòng)。 Windows中管理與設(shè)備通信的部分使I/O子系統(tǒng)。子系統(tǒng)有幾個(gè)層,每個(gè)層包含一個(gè)或多個(gè)處理一套相關(guān)任務(wù)的驅(qū)動(dòng)。系統(tǒng)或者設(shè)備請求按一定的順序從一個(gè)層轉(zhuǎn)到相鄰層。在I/O子系統(tǒng)中的一個(gè)重要要素使USB子系統(tǒng),包括處理所有設(shè)備的USB專門通信的驅(qū)動(dòng)。 這個(gè)驅(qū)動(dòng)使用的協(xié)議組被稱為一個(gè)堆棧,我們可以把它看成層是一個(gè)疊著一個(gè)堆起來的,通信是按順序從上到下通過這個(gè)堆棧。一般設(shè)備通信是通過IRP(IO請求包)來完成的。IRP是一個(gè)內(nèi)核“對象”,它是一個(gè)預(yù)先定義的結(jié)構(gòu),帶有一組對它進(jìn)行操作的IO管理器函數(shù)。IO管理器接受到一個(gè)IO請求,即IRP,先初始化,然后把它傳遞到合適的驅(qū)動(dòng)程序棧中的驅(qū)動(dòng)程序。 一個(gè)IRP有一個(gè)固定的首部和可變數(shù)目的IRP棧單元塊。如圖3-1所示。每個(gè)IO請求有一個(gè)主功能代碼(如IRP_MJ_CREATE對應(yīng)于文件的打開)并可能有次功能代碼。例如IRP_MJ_PNP即插即用IRP有幾個(gè)次功能(如IRP_MN_START_DEVICE)。表3-1列出了常用的主功能代碼。 表3-1 常用的IRP主功能代碼IRP_MJ_CREATE創(chuàng)建或打開設(shè)備文件IRP_MJ_CLOSE關(guān)閉文件IRP_MJ_WRITE寫文件IRP_MJ_READ讀文件IRP_MJ_CLEANUP取消文件句柄上的任何等待的IRPIRP_MJ_DEVICE_CONTROL設(shè)備IO控制IRP_MJ_POWER電源管理請求IRP_MJ_PNP即插即用消息IRP_MJ_SHUTDOWN關(guān)閉通知 IRP的固定部分含有IRP的固定屬性,每個(gè)棧單元(一個(gè)IO_STACK_LOCATION)事實(shí)上含有大多數(shù)有關(guān)的IRP參數(shù)。當(dāng)一個(gè)IRP由多個(gè)驅(qū)動(dòng)程序處理時(shí),使用多個(gè)IRP棧單元。每個(gè)驅(qū)動(dòng)程序從當(dāng)前IRP棧單元得到它的IRP參數(shù)。如果把一個(gè)IRP沿當(dāng)前設(shè)備的驅(qū)動(dòng)程序向下傳遞,必須使用正確的參數(shù)設(shè)置下一個(gè)棧單元。向下傳遞的參數(shù)必須與正在處理的參數(shù)不同。IRP首部 當(dāng)一個(gè)寫IO請求轉(zhuǎn)換成一個(gè)IRP時(shí),IO管理器填寫IO_STACK_LOCATION主要的IRP首部,并構(gòu)造第一個(gè)棧單元。對于寫,IRP首部IO_STACK_LOCATION含有用戶緩沖區(qū)信息。如果使當(dāng)前棧單元用緩沖IO,IRP的Associated指向用戶緩沖區(qū)的非分頁副本IO_STACK_LOCATION的指針:對于直接IO,IRP的MdlAddress域有一個(gè)指向用戶緩沖區(qū)MDL的指針。圖3-1 IRP概貌 IRP棧單元含有主要的寫參數(shù)。棧單元的MajorFunction域含有主功能代碼IRP_MJ_WRITE,指明請求一次寫。前面已經(jīng)說過,如果調(diào)用另一個(gè)驅(qū)動(dòng)程序,必須建立下一個(gè)棧單元。這意味在理論上可以把IRP主功能代碼改成別的功能代碼。一般我們不這么做。在處理大的傳輸上,必須把這個(gè)IRP向下發(fā)送幾次,每個(gè)驅(qū)動(dòng)程序完成不同的功能。在驅(qū)動(dòng)程序棧中處理IRP 在實(shí)際的操作中,IO棧單元通常不用于更改這些基本的IRP參數(shù),IRP棧單元通常用于允許一個(gè)IRP被設(shè)備棧中的所有驅(qū)動(dòng)程序處理。 圖3-2說明一個(gè)IRP如何被設(shè)備棧中的四個(gè)驅(qū)動(dòng)程序處理。第一個(gè)IRP到達(dá)最高層的驅(qū)動(dòng)程序1,它使用函數(shù)IoGetCurrentIrpStackLocation()獲得指向當(dāng)前棧單元的指針。這個(gè)圖說明它返回最上層的IRP棧單元。 驅(qū)動(dòng)程序1決定它需要把這個(gè)IRP沿著設(shè)備棧向下傳遞處理。這個(gè)IRP可能是最低層驅(qū)動(dòng)程序需要看到的“電源管理”IRP。驅(qū)動(dòng)程序1對這個(gè)IRP可能什么都不做,但它仍需要向下傳遞這個(gè)IRP。 所以驅(qū)動(dòng)程序1為下一個(gè)驅(qū)動(dòng)程序設(shè)置棧單元。在許多情況下,它只是使用IoCopyCurrentIrpStackLoationToNext()或者IoSkipCurrentStackLoation()函數(shù)把當(dāng)前棧單元復(fù)制到下一個(gè)棧單元。如果需要更改下一個(gè)棧單元,則使用IoGetNextIrpStackLocation()得到指向這個(gè)棧單元的指針,然后對這個(gè)指針進(jìn)行操作,既可以進(jìn)行更改。(這里所說的函數(shù)說明可以查Msdn2001年8月版) 然后驅(qū)動(dòng)程序1使用IoCallDriver()函數(shù)調(diào)用下一個(gè)驅(qū)動(dòng)程序,IO管理器更改“當(dāng)前IRP棧單元“指針,所以驅(qū)動(dòng)程序2看到向下的第二個(gè)IRP棧單元,這個(gè)過程繼續(xù),直到最低層的驅(qū)動(dòng)程序4受到這個(gè)IRP。驅(qū)動(dòng)
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1