USB主機(jī)
USB主機(jī)在USB系統(tǒng)中處于中心地位。并且,對USB及其連接的設(shè)備有著特殊的責(zé)任。主機(jī)控制著所有對USB的訪問一個(gè)外設(shè)。只有主機(jī)允許才有權(quán)力訪問總線。主機(jī)同時(shí)也監(jiān)測著USB的結(jié)構(gòu)。USB主機(jī)包括三層:設(shè)備驅(qū)動程序,USB系統(tǒng)軟件,USB主控制器(主機(jī)的總線接口)。另外,還有兩個(gè)軟件接口:USB驅(qū)動USBD接口,主機(jī)控制驅(qū)動(HCD)接口。
USB數(shù)據(jù)流
從邏輯上講,USB數(shù)據(jù)的傳輸是通過管道進(jìn)行的。USB系統(tǒng)軟件通過缺省管道(與端點(diǎn)0相對應(yīng))管理設(shè)備。設(shè)備驅(qū)動程序通過其它的管道來管理設(shè)備的。功能接口實(shí)際的數(shù)據(jù)傳輸過程是這樣的:設(shè)備驅(qū)動程序通過對USBD接口(USB driver interface)的調(diào)用,發(fā)出輸入輸出請求(IRPI/O Request Packet)。USB驅(qū)動程序接到請求后調(diào)用HCD接口(host controller driver interface),將IRP轉(zhuǎn)化為USB的傳輸(transfer),一個(gè)IRP可以包含一個(gè)或多個(gè)USB傳輸; 然后HCD將USB傳輸分解為總線操作(transaction),由主控制器以包(packet)的形式發(fā)出。需要注意的是,所有的數(shù)據(jù)傳輸都是由主機(jī)開始的,任何外設(shè)都無權(quán)開始一個(gè)傳輸。
IRP是由操作系統(tǒng)定義的,而USB傳輸與總線操作是USB規(guī)范定義的。為了進(jìn)一步說明USB傳輸,我們引出幀frame的概念。 幀:USB總線將1ms定義為一幀,每幀以一個(gè)SOF包為起始,在這1ms里USB進(jìn)行一系列的總線操作。引入幀的概念主要是為了支持與時(shí)間有關(guān)的總線操作。 為了滿足不同外設(shè)和用戶的要求,USB提供了四種傳輸方式:控制傳輸,同步傳輸,中斷傳輸,批傳輸。它們在數(shù)據(jù)格式,傳輸方向,數(shù)據(jù)包容量限制,總線訪問限制等方面有著各自不同的特征:
控制傳輸(Control Transfer)
1.通常用于配置/命令/狀態(tài)等情形
2.其中的設(shè)置操作setup和狀態(tài)操作status的數(shù)據(jù)包具有USB定義的結(jié)構(gòu)。因此控制傳輸只能通過消息管道進(jìn)行
3.支持雙向傳輸
4.對于高速設(shè)備,允許數(shù)據(jù)包最大容量為81632或64字節(jié)。對于低速設(shè)備,只有8字節(jié)一種選擇
5.端點(diǎn)不能指定總線訪問的頻率和占用總線的時(shí)間,USB系統(tǒng)軟件會做出限制
6 具有數(shù)據(jù)傳輸,保證在必要時(shí)可以重試
同步傳輸(Isochronous Transfer)
1.是一種周期的連續(xù)的傳輸方式,通常用于與時(shí)間有密切關(guān)系的信息的傳輸
2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)數(shù)據(jù)流管道
3.單向傳輸。如果一個(gè)外設(shè)需要雙向傳輸,則必須使用另一個(gè)端點(diǎn)
4.只能用于高速設(shè)備,數(shù)據(jù)包的最大容量可以從0到1023個(gè)字節(jié)
5.具有帶寬保證,并且保持?jǐn)?shù)據(jù)傳輸?shù)乃俾屎愣?。每個(gè)同步管道每幀傳輸一個(gè)數(shù)據(jù)包
6.沒有數(shù)據(jù)重發(fā)機(jī)制,要求具有一定的容錯(cuò)性
7.與中斷方式一起占用總線的時(shí)間不得超過一幀的90%
中斷傳輸(Interrupt Transfer)
1.用于非周期的自然發(fā)生的數(shù)據(jù)量很小的信息的傳輸,如鍵盤鼠標(biāo)等
2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)數(shù)據(jù)流管道
3.只有輸入這一種傳輸方式即外設(shè)到主機(jī)
4.對于高速設(shè)備允許數(shù)據(jù)包最大容量為小于或等于64字節(jié),對于低速設(shè)備,只能小于或等于8字節(jié)
5.具有最大服務(wù)周期保證,即在規(guī)定時(shí)間內(nèi)保證有一次數(shù)據(jù)傳輸
6.與同步方式一起占用總線的時(shí)間不得超過一幀的90%
7.具有數(shù)據(jù)傳輸保證在必要時(shí)可以重試
批傳輸(Bulk Transfer)
1.用于大量的對時(shí)間沒有要求的數(shù)據(jù)傳輸
2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)數(shù)據(jù)流管道
3.單向傳輸,如果一個(gè)外設(shè)需要雙向傳輸,則必須使用另一個(gè)端點(diǎn)
4.只能用于高速設(shè)備,允許數(shù)據(jù)包最大容量為81632或64字節(jié)
5.沒有帶寬的保證,只要有總線空閑就允許傳輸數(shù)據(jù),優(yōu)先級小于控制傳輸
6.具有數(shù)據(jù)傳輸,保證在必要時(shí)可以重試,以保證數(shù)據(jù)的準(zhǔn)確性
|
|
USB總線協(xié)議
所有總線操作都可以歸結(jié)為三種包的傳輸:任何操作都是從主機(jī)開始的,主機(jī)以預(yù)先排好的時(shí)序發(fā)出一個(gè)描述操作類型,方向外設(shè)地址,以及端點(diǎn)號(這將在以下部分給予解釋)的包。我們稱之為令牌包(Token Packet)。然后在令牌中指定的數(shù)據(jù)發(fā)送者發(fā)出一個(gè)數(shù)據(jù)包或者指出它沒有數(shù)據(jù)可以傳輸。而數(shù)據(jù)的目的地一般要以一個(gè)確認(rèn)包(Handshake Packet)作出響應(yīng),以表明傳輸是否成功。
域的類型
同步域(SYNC field)。所有的包都起始于SYNC域,它被用于本地時(shí)鐘與輸入信號的同步。并且在長度上定義為8位。SYNC的最后兩位作為一個(gè)記號,表明PID域(標(biāo)識域)的開始。在以后的敘述中SYNC域?qū)⒈皇∪ァ?
標(biāo)識域(Packet Identifier Field)。對于每個(gè)包PID都是緊跟著SYNC的。PID指明了包的類型及其格式。主機(jī)和所有的外設(shè)都必須對接收到的PID域進(jìn)行解碼。如果出現(xiàn)錯(cuò)誤或者解碼為未定義的值,那么這個(gè)包就會被接收者忽略。如果外設(shè)接收到一個(gè)PID,它所指明的操作類型或者方向不被支持,外設(shè)將不作出響應(yīng)。
地址域(Address Field)。外設(shè)端點(diǎn)都是由地址域指明的。它包括兩個(gè)子域外設(shè)地址和外設(shè)端點(diǎn)。外設(shè)必須解讀這兩個(gè)域。其中有任何一個(gè)不匹配,這個(gè)令牌就會被忽略。
外設(shè)地址域(ADDR)。指定了外設(shè),它根據(jù)PID所說明的令牌的類型,指明了外設(shè)是數(shù)據(jù)包的發(fā)送者或接收者。ADDR共6位,因此最多可以有127個(gè)地址。一旦外設(shè)被復(fù)位或上電,外設(shè)的地址被缺省為0,這時(shí)必須在主機(jī)枚舉過程中被賦予一個(gè)獨(dú)一的地址。而0地址只能用于缺省值而不能分配作一般的地址。
端點(diǎn)域(ENDP)。有4位,它使設(shè)備可以擁有幾個(gè)子通道,所有的設(shè)備必須支持一個(gè)控制端點(diǎn)0(endpoint 0)。低速的設(shè)備最多支持2個(gè)端點(diǎn)0和一個(gè)附加端點(diǎn)。高速設(shè)備可以支持最多16個(gè)端點(diǎn)。
幀號域(Frame Number Field)。這是一個(gè)11位的域,指明了目前幀的排號。每過一幀(1ms),這個(gè)域的值加1,到達(dá)最大值XFF后,返回0。這個(gè)域只存在于每幀開始時(shí)的SOF令牌中,SOF令牌在下面將詳細(xì)介紹。
數(shù)據(jù)域(Data Field)。范圍是01023字節(jié),而且必須是整數(shù)個(gè)字節(jié)。
CRC校驗(yàn)。包括令牌校驗(yàn)和數(shù)據(jù)校驗(yàn)。
包的類型
令牌包(Token Packed) 其中包括:IN(輸入),OUT(輸出),SETUP(設(shè)置)和SOF(Start of Frame幀起始)四種類型。
對于OUT和SETUP來說,ADDR和ENDP中所指明的端點(diǎn)將接收到主機(jī)發(fā)出的數(shù)據(jù)包,而對IN來說,所指定的端點(diǎn)將輸出一個(gè)數(shù)據(jù)包。
Token和SOF在三個(gè)字節(jié)的時(shí)間內(nèi),以一個(gè)EOP(End of Packet)結(jié)束。如果一個(gè)包被解碼為Token包,但是并沒有在3個(gè)字節(jié)時(shí)間內(nèi)以EOP結(jié)束,它就會被看作非法或被忽略。
數(shù)據(jù)包包括Data0和Data1兩種類型。這兩種包的定義是為了支持?jǐn)?shù)據(jù)觸發(fā)。同步數(shù)據(jù)包包含了PIDDATA和CRC三個(gè)域。
應(yīng)答包(Handshake Packet)僅包含一個(gè)PID域。Handshake用來報(bào)告數(shù)據(jù)傳輸?shù)臓顟B(tài),只有支持流控制的傳輸類型,控制中斷和批傳輸才能返回Handshake。
|
|
|