下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、驅(qū)動(dòng)程序中USB設(shè)備的配置過(guò)程(參考Windows XP DDK )DDK驅(qū)動(dòng)程序?qū)懙煤芤?guī)范,USB初始化、數(shù)據(jù)傳輸?shù)倪^(guò)程寫(xiě)的很清楚。通 過(guò)閱讀DDK驅(qū)動(dòng)程序,我對(duì)原來(lái)USB驅(qū)動(dòng)程序中許多不理解的地方有了更清 楚的理解.下面就參照DDK提供的iso_usb例子對(duì)USB設(shè)備的配置過(guò)程進(jìn)行總 結(jié)。驅(qū)動(dòng)程序加載后首先執(zhí)行DriverEntry入口函數(shù)。該函數(shù)設(shè)定了對(duì)各個(gè)IRP 進(jìn)行處理的派遣函數(shù)。DriverEntry函數(shù)執(zhí)行完成后,開(kāi)始執(zhí)行AddDevice函數(shù)。這個(gè)函數(shù)創(chuàng)建設(shè) 備對(duì)象把設(shè)備對(duì)象連接到設(shè)備堆棧上,清除DO_DEVICE_INITIALIZING標(biāo)志。 然后配置管理器向驅(qū)動(dòng)程序發(fā)送一
2、個(gè)即插即用請(qǐng)求IRP_MN_START_DEVICE, 而調(diào)用下面的HandleStartDevice函數(shù)。在HandleStartDevice函數(shù)中完成了 USB設(shè)備的配置過(guò)程:首先為設(shè)備選 擇一個(gè)配置(大多數(shù)設(shè)備僅有一種配置)。選定了某種配置后,接著應(yīng)該選擇配 置中的一個(gè)或多個(gè)接口。然后向總線驅(qū)動(dòng)程序發(fā)送配置選擇URB,總線驅(qū)動(dòng)程 序接收到該URB后向設(shè)備發(fā)出命令使用選定的配置和接口。(1)為設(shè)備選擇配置的過(guò)程其實(shí)就是獲取設(shè)備的配置描述符的過(guò)程Iso_usb 中使用了兩個(gè)URB來(lái)讀取配置描述符。/首先獲取固定大小的配置描述符,這時(shí),此描述符不包含接口描述符和端 點(diǎn)描述符。siz = siz
3、eof(USB_CONFIGURATION_DESCRIPTOR);configurationDescriptor = ExAllocatePool(NonPagedPool, siz);if(configurationDescriptor) /UsbBuildGetDescriptorRequest 函數(shù)構(gòu)造指定類型的 urbUsbBuildGetDescriptorRequest(urb,(USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0,0,config
4、urationDescriptor,NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL);/CallUSBD函數(shù)負(fù)責(zé)把urb轉(zhuǎn)發(fā)到底層總線驅(qū)動(dòng)程序ntStatus = CallUSBD(DeviceObject, urb);/然后獲取全部的配置描述符,包括接口描述符和端點(diǎn)描述符siz = configurationDescriptor-wTotalLength;ExFreePool(configurationDescriptor);configurationDescriptor = ExAllocatePool(NonPagedPool, siz)
5、;if(configurationDescriptor) UsbBuildGetDescriptorRequest( urb, (USHORT)sizeof(struct URB_CONTROL_DESCRIPTOR_REQUEST),USB_CONFIGURATION_DESCRIPTOR_TYPE, 0,0,configurationDescriptor, NULL,siz, NULL);ntStatus = CallUSBD(DeviceObject, urb);從配置描述符中提取感興趣的接口描述符,總線驅(qū)動(dòng)程序提供了函數(shù) USBD_ParseConfigurationDescripto
6、rEx 以簡(jiǎn)化這個(gè)過(guò)程。interfaceDescriptor =USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor,ConfigurationDescriptor, interfaceindex, 0,-1, -1, -1);該函數(shù)各個(gè)參數(shù)的含義是:第一個(gè)參數(shù)是上一步獲取的完整的配置描述符; 第二個(gè)參數(shù)是描述符內(nèi)部開(kāi)始搜索的地址,如果從頭開(kāi)始搜索,需要設(shè)置和第一 個(gè)參數(shù)相同;剩下的五個(gè)參數(shù)是和感興趣的接口相關(guān)搜索關(guān)鍵字,分別是 InterfaceNumber, AlternateSetting, InterfaceClass
7、, InterfaceSubClass, InterfaceProtoco。但相關(guān)的關(guān)鍵字不需要的時(shí)候,可以設(shè)置成-1。由于配置描述符中可能包含多個(gè)接口,所以驅(qū)動(dòng)程序需要將上述函數(shù)返回的 接口描述符保存在USBD_INTERFACE_LIST_ENTRY類型的數(shù)組中。iso_usb程 序首先使用ExAllocatePool函數(shù)為接口描述符分配足夠的內(nèi)存。interfaceList =ExAllocatePool(NonPagedPool, sizeof(USBD_INTERFACE_LIST_ENTRY) * (numberOfInterfaces + 1);然后通過(guò)循環(huán)使用USBD_Pars
8、eConfigurationDescriptorEx函數(shù)獲取的接口描 述符對(duì)數(shù)組進(jìn)行初始化。初始化時(shí),應(yīng)該把接口描述符地址賦給 USBD_INTERFACE_LIST_ENTRY 結(jié)構(gòu)的 InterfaceDescriptor成員,并把 Interface 成員置NULL。最后需要將數(shù)組的最后一個(gè)元素的兩個(gè)成員全部置為NULL。初始化接口。首先調(diào)用 USBD_CreateConfigurationRequestEx 函數(shù)創(chuàng)建 一個(gè)urb。然后需要對(duì)接口中的管道進(jìn)行相應(yīng)的初始化,最后將這個(gè)urb傳遞給 底層驅(qū)動(dòng)程序,由底層總線驅(qū)動(dòng)程序完成接口的初始化。urb = USBD_CreateConfi
9、gurationRequestEx(ConfigurationDescriptor, tmp);Interface = &urb-UrbSelectConfiguration.Interface;/需要初始化管道的MaximumTransferSize成員。它代表單一 URB能攜帶的 最大數(shù)據(jù)量for(i=0; iNumberOfPipes; i+) Interface-Pipesi.MaximumTransferSize = ntStatus = CallUSBD(DeviceObject, urb);但USB設(shè)備配置完成之后,應(yīng)該將一些句柄保存到設(shè)備擴(kuò)展中供以后 使用。0 URB 成員 UrbSelectConfiguration.ConfigurationHandle 返回配置句 柄;0USBD_INTERFACE_INFORMATION 結(jié)構(gòu)中 InterfaceHandle返回接口句柄;0每個(gè)USBD_PIPE_INFORMATION結(jié)構(gòu)中都含有與端點(diǎn)對(duì)應(yīng)的管道句柄 PipeHandle關(guān)閉設(shè)備。當(dāng)驅(qū)動(dòng)程序接到一個(gè)IRP_MN_STOP_DEVICE請(qǐng)求時(shí),應(yīng) 該把設(shè)備置成為配置狀態(tài),創(chuàng)建并傳遞一個(gè)含有NULL配置?指針的配置選擇URB 可以達(dá)到這個(gè)目的。siz = sizeof(struct _URB_SELE
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 九年級(jí)政治尊重他人是我的需要課件
- 液壓與氣動(dòng)技術(shù) 課件 模塊四 課題14
- 單位管理制度集合大合集職工管理篇
- 單位管理制度集粹匯編員工管理
- 議論文結(jié)構(gòu)的六種模式
- 單位管理制度匯編大合集人員管理
- 單位管理制度分享大全【人力資源管理】十篇
- 單位管理制度范例合集員工管理篇十篇
- 單位管理制度呈現(xiàn)合集【人力資源管理篇】十篇
- 萬(wàn)有引力定律復(fù)習(xí)課件
- 《用戶體驗(yàn)設(shè)計(jì)導(dǎo)論》
- 美團(tuán)外賣運(yùn)營(yíng)知識(shí)試題
- 航空概論學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 業(yè)務(wù)流程可視化改善
- 期末復(fù)(知識(shí)清單)2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 45001-2020職業(yè)健康安全管理體系危險(xiǎn)源識(shí)別與風(fēng)險(xiǎn)評(píng)價(jià)及應(yīng)對(duì)措施表(各部門(mén))
- 人教版六年級(jí)科學(xué)重點(diǎn)知識(shí)點(diǎn)
- 春節(jié):藝術(shù)的盛宴
- 煙草公司化肥采購(gòu)項(xiàng)目-化肥投標(biāo)文件(技術(shù)方案)
- 【良品鋪?zhàn)映杀究刂浦写嬖诘膯?wèn)題及優(yōu)化建議探析(定量論文)11000字】
- 2023八年級(jí)語(yǔ)文上冊(cè) 第三單元 13 唐詩(shī)五首說(shuō)課稿 新人教版
評(píng)論
0/150
提交評(píng)論