USB枚舉過程
(1)設(shè)備連接。USB設(shè)備經(jīng)USB總線連接主機(jī)。
(2)設(shè)備上電。USB設(shè)備可以自供電,也可以使用USB總線供電。
(3)主機(jī)檢測到設(shè)備,發(fā)出復(fù)位。主機(jī)通過檢測設(shè)備在總線的上拉電阻檢測到有新的設(shè)備連接,并獲釋設(shè)備是全速設(shè)備還是低速設(shè)備,然后向該端口發(fā)送一個(gè)復(fù)位信號。
(4)設(shè)備默認(rèn)狀態(tài)。設(shè)備從總線上接收到一個(gè)復(fù)位信號后,才可以對總線的處理操作做出響應(yīng)。設(shè)備接收到復(fù)位信號后,就暫時(shí)使用默認(rèn)地址(00H)來響應(yīng)主機(jī)的命令。
(5)地址分配。當(dāng)主機(jī)接收到有設(shè)備對默認(rèn)地址(00H)響應(yīng)的時(shí)候,就分配給設(shè)備一個(gè)空閑的地址,以后設(shè)備就只對該地址進(jìn)行響應(yīng)。
(6)讀取USB設(shè)備描述符。主機(jī)讀取USB設(shè)備描述符,確認(rèn)USB設(shè)備的屬性。
(7)設(shè)備配置。主機(jī)依照讀取的USB設(shè)備描述符來進(jìn)行配置,如果設(shè)備所需的USB資源得以滿足,就發(fā)送配置命令給USB設(shè)備,表示配置完畢。
(s)掛起。如果使用總線供電,為了節(jié)省電源,當(dāng)總線保持空閑狀態(tài)超過3ms以后,設(shè)備驅(qū)動程序就會進(jìn)入掛起狀態(tài),在掛起狀態(tài)時(shí),USB設(shè)備保留了包括其地址和配置信息在內(nèi)的所有內(nèi)部狀態(tài),設(shè)備的消耗電流不超過500uA。
USB設(shè)備的枚舉過程的具體說明如下:
USB總線驅(qū)動程序自動檢測新插入的USB設(shè)備。然后它讀取設(shè)備內(nèi)的設(shè)備描述符以查明插入的是何種設(shè)備,描述符中的廠商和產(chǎn)品標(biāo)識以及其它描述符一同決定具體安裝哪一個(gè)驅(qū)動程序。配置管理器調(diào)用驅(qū)動程序的AddDvecie函數(shù)。AddDvecie做以下工作:創(chuàng)建設(shè)備對象,把設(shè)備對象連接到驅(qū)動程序堆棧上,等等。最后,配置管理器向驅(qū)動程序發(fā)送一個(gè)即插即用請求IRP_MN_START_DEVICE。它通過調(diào)用一個(gè)名為StartDevice的輔助函數(shù)并傳遞一些參數(shù),這些參數(shù)描述了賦予設(shè)備的經(jīng)過轉(zhuǎn)換的和未經(jīng)轉(zhuǎn)換的I/O資源。實(shí)際上它們不用任何I/O資源。 USB使用了許多方法來幫助操作系統(tǒng)定位驅(qū)動程序,包括設(shè)備上的設(shè)備描述符、配置描述符,以及接口描述符。對于有廠商和產(chǎn)品標(biāo)識的設(shè)備,配置管理器首先在注冊表中查找設(shè)備名稱,例如名為USBVID一0471&PID-0666的設(shè)備。如果注冊表中沒有這個(gè)表項(xiàng),配置管理器將觸發(fā)“新硬件向?qū)?rdquo; 來尋找該設(shè)備的INF文件。新硬件向?qū)蛴脩粼儐朓NF文件的位置,然后安裝驅(qū)動程序并填寫注冊表。一旦配置管理器找到了注冊表表項(xiàng),它就可以動態(tài)地裝載驅(qū)動程序。StartDveiee的執(zhí)行過程大致如下,首先為設(shè)備選擇一個(gè)配置。如果你的設(shè)備像大多數(shù)設(shè)備一樣,應(yīng)該僅有一種配置。選定了某個(gè)配置后,接著應(yīng)該選擇配置中的一個(gè)或多個(gè)接口。選定了一個(gè)配置和一組接口后,你應(yīng)該向總線驅(qū)動程序發(fā)送配置選擇URB。最后,總線驅(qū)動程序向設(shè)備發(fā)出命令確定能選定的配置和接口。總線驅(qū)動程序負(fù)責(zé)創(chuàng)建管道和用于訪問管道的句柄,管道提供功能驅(qū)動程序與選定接口端點(diǎn)之間的通信,它同時(shí)還創(chuàng)建配置句柄和接口句柄。你可以從完成的URB中提取這些句柄,并保存為以后使用。至此,設(shè)備的枚舉過程全部結(jié)束。
評論