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

正文內(nèi)容

usb技術(shù)及其驅(qū)動程序開發(fā)(doc畢業(yè)設(shè)計論文)-文庫吧資料

2025-07-04 09:17本頁面
  

【正文】 使用棧單元IO_STACK_LOCATION驅(qū)動程序1(最高)使用棧單元IO_STACK_LOCATION驅(qū)動程序2使用棧單元IO_STACK_LOCATION驅(qū)動程序3使用棧單元IO_STACK_LOCATION驅(qū)動程序4 圖3-2 設(shè)備棧中的所有驅(qū)動程序如何處理IRP Windows為驅(qū)動程序提供一個縝密定義的層次和結(jié)構(gòu),還提供了可以運行于不同處理器的通用模型,下面就我們所作的關(guān)于Usb鍵盤驅(qū)動程序作一個完整的介紹。驅(qū)動程序4處理完這個IRP棧單元,則調(diào)用IoCompleteRequest(),指示完成了這個Irp,Irp再沿著設(shè)備棧向上傳遞,直到它最終彈出棧頂,回到用戶。如果需要更改下一個棧單元,則使用IoGetNextIrpStackLocation()得到指向這個棧單元的指針,然后對這個指針進行操作,既可以進行更改。 所以驅(qū)動程序1為下一個驅(qū)動程序設(shè)置棧單元。這個IRP可能是最低層驅(qū)動程序需要看到的“電源管理”IRP。這個圖說明它返回最上層的IRP棧單元。 圖3-2說明一個IRP如何被設(shè)備棧中的四個驅(qū)動程序處理。在處理大的傳輸上,必須把這個IRP向下發(fā)送幾次,每個驅(qū)動程序完成不同的功能。這意味在理論上可以把IRP主功能代碼改成別的功能代碼。棧單元的MajorFunction域含有主功能代碼IRP_MJ_WRITE,指明請求一次寫。如果使當前棧單元用緩沖IO,IRP的Associated指向用戶緩沖區(qū)的非分頁副本IO_STACK_LOCATION的指針:對于直接IO,IRP的MdlAddress域有一個指向用戶緩沖區(qū)MDL的指針。IRP首部 當一個寫IO請求轉(zhuǎn)換成一個IRP時,IO管理器填寫IO_STACK_LOCATION主要的IRP首部,并構(gòu)造第一個棧單元。如果把一個IRP沿當前設(shè)備的驅(qū)動程序向下傳遞,必須使用正確的參數(shù)設(shè)置下一個棧單元。當一個IRP由多個驅(qū)動程序處理時,使用多個IRP棧單元。表3-1列出了常用的主功能代碼。每個IO請求有一個主功能代碼(如IRP_MJ_CREATE對應于文件的打開)并可能有次功能代碼。 一個IRP有一個固定的首部和可變數(shù)目的IRP棧單元塊。IRP是一個內(nèi)核“對象”,它是一個預先定義的結(jié)構(gòu),帶有一組對它進行操作的IO管理器函數(shù)。 這個驅(qū)動使用的協(xié)議組被稱為一個堆棧,我們可以把它看成層是一個疊著一個堆起來的,通信是按順序從上到下通過這個堆棧。系統(tǒng)或者設(shè)備請求按一定的順序從一個層轉(zhuǎn)到相鄰層。 Windows中管理與設(shè)備通信的部分使I/O子系統(tǒng)。舉個例子,所有設(shè)備都連接到USB上,因此有一套可以被所有設(shè)備訪問的,包括操作系統(tǒng)中的,用來處理USB專用通信的驅(qū)動使明智的。USB的驅(qū)動層分層驅(qū)動 USB通信使用分層驅(qū)動模型,每層處理一部分通信過程。像其他低級驅(qū)動一樣,WDM驅(qū)動不能驅(qū)動應用程序,因為它和操作系統(tǒng)以更高的優(yōu)先級通信。USB驅(qū)動的Win32驅(qū)動模式 Windows的Usb設(shè)備驅(qū)動必須遵循微軟在Win98和更新的版本中為用戶定義的Win32驅(qū)動模式。Windows為Hid(Human Interface Device)類提供了minidriver,包括鍵盤和鼠標。一個鍵盤可以使用原始的接口,也可以是Usb接口。如果設(shè)備具有獨特的功能,則供應商會提供一個稱為minidriver的附加驅(qū)動,對通用驅(qū)動加以補充。 驅(qū)動程序與USB設(shè)備的通訊USB設(shè)備的選擇很多外設(shè)符合標準類,例如硬盤,光驅(qū),打印機,鍵盤和鼠標。 設(shè)備驅(qū)動通過在應用層和硬件專用代碼之間的轉(zhuǎn)化來完成它的任務(wù)。設(shè)備驅(qū)動可以保證應用程序代碼只通過外設(shè)名字(如Legend Keyboard)訪問外設(shè)或者端口目的地。 一個設(shè)備驅(qū)動使得應用程序不必知道物理連接,信號和與一個設(shè)備通信需要的協(xié)議等細節(jié)。設(shè)備可能在計算機內(nèi)部,或者是使用電纜連接到計算機上。第三章 USB驅(qū)動程序的開發(fā) 設(shè)備驅(qū)動是保證應用程序訪問硬件設(shè)備的軟件組件。配置狀態(tài):此請求合法。 缺省狀態(tài):設(shè)備響應無定義。k、同步幀(SynchFrame ( )) 該請求用來設(shè)置或返回一個結(jié)點的同步幀。 地址狀態(tài):設(shè)備返回請求錯誤。如果設(shè)備的接口只支持缺省設(shè)置,在狀態(tài)交換階段設(shè)備返回STALL 如果所指接口或設(shè)置不存在,設(shè)備返回請求錯誤。 如有USB設(shè)備接口配置中有互斥設(shè)置。 配置狀態(tài):合法。 缺省狀態(tài):設(shè)備響應無定義。 SetFeature ( )請求如果指出一個不存在的特性會使得設(shè)備在交換狀態(tài)階段返回STALL信號。 配置狀態(tài):如果設(shè)備支持請求,則為合法。 缺省狀態(tài):此狀態(tài)下設(shè)備對該請求反應無定義。長度域指出從主機傳向設(shè)備的字節(jié)數(shù)。 值域高字節(jié)指出了描述符的類型,低字節(jié)指出了描述符索引。如果配置值非0并與描述符中的一個配置相匹配則設(shè)備仍留在配置態(tài),但采用新的配置值,否則返回請求錯誤。如果所指的配置與描述符中的一個值相匹配,那個配置就被選中,設(shè)備轉(zhuǎn)到配置有。 如果指針,長度或者值的高字節(jié)非0,則設(shè)備對之的響應無定義。如果配置值為0,設(shè)備置地址狀態(tài)。配置狀態(tài):在此狀態(tài)下設(shè)備對此請求的響應無定義。 缺省狀態(tài):如果地址值非0,那設(shè)備將進入地址狀態(tài),否則地址仍留在缺省態(tài)(此非出錯狀態(tài))。如果所指的設(shè)備地址大于127或指針或者長度非零,設(shè)備響應無定義。 配置狀態(tài):如果所指接口或端點不存在,返回請求錯誤。 缺省狀態(tài):設(shè)備響應無定義。e、取得狀態(tài)(GetStatus ( )) 這個請求返回所指接收者的狀態(tài)。 地址狀態(tài):設(shè)備返回請求錯誤。 如果所指的接口不存在,返回請求錯誤。這個請求使得主機決定當前設(shè)置。d、取得接口設(shè)置(GetInterface()) 這個請求返回所指接口的選中的可選設(shè)置。 地址狀態(tài):此請求合法。 所有的設(shè)備必須提供一個設(shè)備描述符并且至少一個配置描述符,如果一個設(shè)備不支持一個請求的描述符,則返回請求錯誤。如果有其它的接口與端點,它們的描述符則跟在第一個接口與端點描述符之后。一個配置描述符的設(shè)備請求會一次返回配置描述符,所有的接口描述符和所有接口的端節(jié)點的描述符。c、取得描述符(GetDescriptor())這個請求返回存在的描述符。 地址狀態(tài):返回0值。 如果值,指針,長度的值與上面表中不同,設(shè)備響應無定義。b、取得配置(GetConfiguration())此請求返回當前設(shè)備配置值。 地址狀態(tài):在設(shè)備處于地址狀態(tài)時這個請求是合法的,但如果該請求指的是接口或是非零號端結(jié)點,會引起請求錯誤。 如果長度不為0,設(shè)備響應無定義。請求號請求數(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端點狀態(tài)05HSET_ADDRESS無設(shè)備設(shè)備地址00無09HSET_CONFIGURATION無設(shè)備配置值設(shè)備0無07HSET_DESCRIPTOR主機設(shè)備描述符類型和指針設(shè)備或語言ID描述符長度描述符03HSET_FEATURE無設(shè)備,接口,終端特性選擇符設(shè)備,接口,終端0無0BHSET_INTERFACE無接口可選設(shè)置接口號1無0CHSYNCH_FRAME設(shè)備終端0終端2幀號 表21 標準設(shè)備請求a、清除特性(ClearFeature())這個請求是被用來清除一個指定的特性。 USB標準設(shè)備請求這一部分描述的是所有USB設(shè)備都定義的標準設(shè)備請求。中止狀態(tài) 為節(jié)省電源,USB設(shè)備在探測不到總線傳輸時自動進入中止狀態(tài)。配置一個設(shè)備或改變一個可變的設(shè)備設(shè)置會使得與這個相關(guān)接口的終端結(jié)點的所有的狀態(tài)與配置值被設(shè)成缺省值。配置狀態(tài) 在USB設(shè)備正常工作以前,設(shè)備必須被正確配置。當USB設(shè)備處于掛起狀態(tài)時,它保持這個地址不變。地址狀態(tài) 所有的USB設(shè)備在加電復位以后都使用缺省地址。在接收到復位信號之后,設(shè)備才在缺省地址處變得可尋址。盡管自給電源式的USB設(shè)備可能在連接上USB接口以前可能已經(jīng)帶電,但它們直到連線上USB接口后才能被看作是加電狀態(tài)。加電狀態(tài) USB設(shè)備的電源可來自外部電源,也可從USB接口的集線器而來。連接狀態(tài) Usb外設(shè)連接到主機上時的狀態(tài)。圖2-8說明了這些外設(shè)狀態(tài)的轉(zhuǎn)化關(guān)系。這里主要講一下中間層設(shè)備架構(gòu)和如何處理設(shè)備請求。最上層的功能由串行總線設(shè)備提供。中間層處理總線接口與不同端點之間的數(shù)據(jù)路由端節(jié)點是數(shù)據(jù)的終結(jié)提供處或使用處,它可被看作數(shù)據(jù)源或數(shù)據(jù)接收端。 USB的設(shè)備架構(gòu)USB設(shè)備可被劃分三層:所以一般用于偶爾,少量錯誤可以接受的情況下。 數(shù)據(jù)傳輸?shù)乃俣?等時和終端傳輸組合最多可以使用90%的帶寬。如果設(shè)備要同步的雙向流的話,只好用兩個同步通道,一個流進,一個流出。信息流的方向 同步通道是單方向的。每幀的數(shù)據(jù)量不必相同。如果帶寬可用,則一個事務(wù)可以傳輸最多1023個字節(jié)??捎眯?只有全速設(shè)備可以使用等時傳輸。當USB同步傳輸類型被用來支持同步的源和目的時,使用這個傳輸類型的軟件并不要求是同步的。 同步傳輸在非USB的環(huán)境下,同步傳輸意味著恒定速率、允許錯誤存在的傳輸。主機如果從設(shè)備接收到nak,它也會重試。 一個空閑總線理論上可以在每幀中傳輸最多19個64B全速中斷傳輸。 信息流的方向 中斷通道是單向的。低速設(shè)備有一個8B的最大值。USB規(guī)定的數(shù)據(jù)包的大小 USB對中斷通道上的數(shù)據(jù)流格式無要求。設(shè)備不需要支持中斷傳輸,但一個設(shè)備類可能需要它。批量傳輸也使用數(shù)據(jù)循環(huán)位來確保沒有丟失數(shù)據(jù)。如果一個設(shè)備沒有返回預期的交換包,pc中的主機控制器最多重試兩次。在列舉過程中,主機從設(shè)備處讀取每一個批量傳輸?shù)淖畲蟀拇笮?,一次傳輸過程中,數(shù)據(jù)的大小可以是小于或者等于這個最大值。USB規(guī)定的數(shù)據(jù)包的大小 USB沒有規(guī)定批量傳輸通道上數(shù)據(jù)包的格式。設(shè)備不需要支持批量傳輸,但一個特定設(shè)備類可能需要它。一個批量傳輸可以發(fā)送大量的數(shù)據(jù)而不會阻塞總線,因為這個傳輸會為其他類型的傳輸而延遲,并且會等到總線可用的時候再傳輸。 如果一個SETUPB包在上一個傳輸?shù)竭_之前到達,則外設(shè)就丟棄上一個傳輸并開始新的一個傳輸。出錯處理 如果一個設(shè)備在一個控制傳輸中沒有返回一個預期的交換包,那么一個pc主機控制器將重試兩次。這樣就限制了速度。低速傳輸可能傳輸不超過8B的數(shù)據(jù),它被限制為每幀最多三個事務(wù)。數(shù)據(jù)傳輸?shù)乃俣?控制傳輸不是用來傳輸數(shù)據(jù)的最有效的方法。所以,一旦一個控制通道被確認之后,這個通道就使用了具有某個端點號的兩個端點,一個輸入,一個輸出。這只包括了數(shù)據(jù)包中的信息,不包括檢驗位和起始位。USB規(guī)定的數(shù)據(jù)包大小 在全速設(shè)備中,數(shù)據(jù)包的最大值可以是8,16,32或者64B。即使如果一個設(shè)備需要發(fā)送許多控制請求,主機是根據(jù)請求的數(shù)量和大小來分配帶寬的,而不是根據(jù)控制流程的數(shù)量,因此擁有多個控制終端是沒有必要的??捎眯? 每個設(shè)備必須在終端0的默認流程中支持控制傳輸。當端點成功地完成了被要求的操作時,回傳的狀態(tài)信息為“SUCCESS”??刂苽鬏斢梢韵聨讉€事務(wù)組成:(1)建立聯(lián)系,把請求信息從主機傳到它的應用設(shè)備;(2)零個或多個數(shù)據(jù)傳送事務(wù),按照(1)事務(wù)中指明的方向傳送數(shù)據(jù);(3)狀態(tài)信息回傳。下面分別介紹: 控制傳輸控制傳輸允許訪問一個設(shè)備的不同部分。Usb有四種傳輸方式:控制傳輸,批量傳輸,中斷傳輸和同步傳輸。USB要求任何在通道上傳送的數(shù)據(jù)均被打包,數(shù)據(jù)的解釋工作由客戶軟件和應用層軟件負責。 USB的傳輸類型USB通過通道在主機緩沖區(qū)與設(shè)備端點間傳送數(shù)據(jù)。數(shù)據(jù)CRC僅通過對包中的數(shù)據(jù)字段計算而得到,而不包括PID,它有自己的校驗字段。2種數(shù)據(jù)包PID是為了支持數(shù)據(jù)切換同步而定義的。數(shù)據(jù)包格式如圖27所示,數(shù)據(jù)包由PID,包括至少0個字節(jié)數(shù)據(jù)的數(shù)據(jù)區(qū)和CRC構(gòu)成。在上下文中,這些字段被認為是保護字段。圖26 數(shù)據(jù)字段數(shù)據(jù)包大小隨著傳送類型而變化。圖25 端口字段數(shù)據(jù)字段數(shù)據(jù)字段可以在0到1,023字節(jié)之間變動,但必須是整數(shù)個字節(jié)。除了端口地址0之外,端口個數(shù)是由功能部件決定的。由定義可知,每個ADDR值都定義了單一的功能。如圖24所示,ADDR[0..6]指定了總共128個地址。打開到低速設(shè)備的下行總線通信。圖23 PID 格式表22 PID 類型PID 類型PID 名PID[3:0]描述標記(Token)輸出(OUT)輸入(IN)幀開始(SOF)建立(SETUP)0001B1001B0101B1101B在主機到功能部件的事務(wù)中有地址+端口號在功能部件到主機的事務(wù)中有地址+端口號幀開始標記和幀號在主機到功能部件建立一個控制管道的事務(wù)中有地址+端口號數(shù)據(jù)(DATA)數(shù)據(jù)0(DATA0)數(shù)據(jù)1(DATA1)0011B1011
點擊復制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1