目前了解了usb通信層面的一些基礎(chǔ)知識如下。如果有空還要再了解hid報告描述符及協(xié)議的數(shù)據(jù)包波形。
一,USB的一些基本概念
1. 管道(Pipe) 是主機和設(shè)備端點之間數(shù)據(jù)傳輸?shù)哪P停灿袃煞N類型的管道:無格式的
流管道(Stream Pipe)和有格式的信息管道(Message Pipe)。任何USB 設(shè)備一旦上電就存在
一個信息管道,即默認的控制管道,USB 主機通過該管道來獲取設(shè)備的描述、配置、狀態(tài),并
對設(shè)備進行配置。
2. 端點(Endpoint)是USB 設(shè)備中的可以進行數(shù)據(jù)收發(fā)的最小單元,支持單向或者雙向的數(shù)據(jù)傳
輸。設(shè)備支持端點的數(shù)量是有限制的,除默認端點外低速設(shè)備最多支持2 組端點(2 個輸入,2
個輸出),高速和全速設(shè)備最多支持15 組端點。
3. 接口(Interface) 。應(yīng)用軟件通過和設(shè)備之間的數(shù)據(jù)交換來完成設(shè)備的控制和數(shù)據(jù)傳輸。通常
需要多個管道來完成數(shù)據(jù)交換,因為同一管道只支持一種類型的數(shù)據(jù)傳輸。用在一起來對設(shè)備進
行控制的若干管道稱為設(shè)備的接口。
4. 設(shè)備和端點之間關(guān)系: 一個USB 設(shè)備可以包括若干個端點,不同的端點以端點編號和方向區(qū)分。
不同端點可以支持不同的傳輸類型、訪問間隔以及最大數(shù)據(jù)包大小。除端點0 外,所有的端點只支
持一個方向的數(shù)據(jù)傳輸。端點0 是一個特殊的端點,它支持雙向的控制傳輸。管道和端點關(guān)聯(lián),和
關(guān)聯(lián)的端點有相同的屬性,如支持的傳輸類型、最大包長度、傳輸方向等。
5. 描述符(Descriptor) 描述設(shè)備的屬性(Attributes)。 它本身是一個數(shù)據(jù)結(jié)構(gòu), 第一個字節(jié)表示
描述符的大小(字節(jié)數(shù)), 第二個字節(jié)表示描述符的類型(Type)。 描述符的種類有:
1) 設(shè)備描述符(Device), 描述一個設(shè)備的一般信息。
2) 設(shè)備修飾描述符(Device_Qualifier), 描述一個高速設(shè)備在其它速度下該如何變化的信息。
3) 配置描述符(Configuration), 描述一個特定的設(shè)備配置, 如接口的數(shù)目等。 一個USB設(shè)備有
一個或多個配置描述符。 每個配置有一個或多個接口并且每個接口有0個或多個端點。
4) 其它速度配置描述符(Other_speed_configuration), 描述高速設(shè)備在其它可能的速度下的
一個配置。
5) 接口描述符(Interface), 描述一種配置中的一個特定的接口。
6) 端點描述符(Endpoint), 描述主機需要的去決定端點所需帶寬的信息。 這個描述符只能附加
在GetDescriptor()或GetDescriptor()請求中傳送, 不能單獨傳送。 端點0沒有此描述符。
7) 字符串描述符(String), 第0個字符串描述符指定設(shè)備支持的語言, 其它的描述符則各包含
一個UNICODE字符串。 設(shè)備描述符, 配置描述符 和 接口描述符可能會包含字符串描述符。
6. USB設(shè)備請求(USB Device Request) 請求是從主機通過控制管道發(fā)送到設(shè)備。
標準的設(shè)備請求有:
1) Clear Feature
2) Get Configuration
3) Get Descriptor
4) Get Interface
5) Get Status
6) Set Address
7) Set Configuration
8) Set Descriptor
9) Set Feature
10) Set Interface
11) Synch Frame
二,協(xié)議層
從字段(Field)和包(Packet)的定義開始,從底向上地展示USB(Univeral Serial Bus)協(xié)議。有:同步字段,包字段格式,包標識符字段,地址字段,端口字段,數(shù)據(jù)字段等等。
三,包字段格式
描述標記,數(shù)據(jù)和握手包的字段格式。包中位的定義是以未編碼的數(shù)據(jù)格式給出。為了清楚起見,在此不考慮NRZI編碼和位填充(Bit Stuffing)的影響。所有的包都分別有包開始(Start-of-Packet)和包結(jié)束(End-of-Packet)分隔符。包開始(SOP)分隔符是同步字段的一部分,而包結(jié)束(EOP)分隔符在第7章有所描述。
四,usb協(xié)議的大致過程如下:
當USB設(shè)備接上或從USB設(shè)備移開的時候,主機啟動一個被稱作總線標識(bus enumeration)的進程,來標識并管理設(shè)備狀態(tài)的改變,當USB設(shè)備接上一個加電端口時,系統(tǒng)當采取以下操作:
1.USB設(shè)備所連的集線器通過其通向主機的狀態(tài)改變通道向主機,匯報本USB設(shè)備已連接上。(參照11.13.3節(jié))。此時,USB設(shè)備處于加電狀態(tài),它所連接的端口是無效的。
2.主機通過尋問集線器決定此次狀態(tài)改變的確切含義。
3.主機一旦得知新設(shè)備已連上以后,它至少等待100ms以使得插入操作的完成以及設(shè)備電源穩(wěn)定工作。然后主機發(fā)出端口使能及復(fù)位命令給那個端口。具體這些事件發(fā)生的順序及時間判定請參看7.1.7.1節(jié)及圖7-19。
4.集線器將發(fā)向端口的復(fù)位信號持續(xù)10ms(見11.5.15節(jié))。當復(fù)位信號撤消后,端口已經(jīng)有效了。這時USB設(shè)備處于缺省狀態(tài),并且可從VBUS汲取小于100mA的電能,所有設(shè)備寄存器及狀態(tài)已經(jīng)被復(fù)位,設(shè)備可對缺省地址產(chǎn)生響應(yīng)。
5.主機給設(shè)備分配一個唯一的地址,設(shè)備轉(zhuǎn)向編址狀態(tài)。(Address state)。
6.在USB設(shè)備接受設(shè)備地址之前,它的缺省控制通道(Default Control Pipe)在缺省地址處自然是可尋址的,主機通過讀取設(shè)備描述表,判決設(shè)備缺省通道的實際凈數(shù)據(jù)負載。
7.主機從設(shè)備讀取配置信息要從配置0讀到配置n-1,其中n為配置個數(shù),此操作須花費幾個毫秒。
8.基于從設(shè)備取來的配置信息及設(shè)備如何被使用的信息,主機給設(shè)備一個配置值,此刻,設(shè)備就處于配置狀態(tài)(Configured state)并此配置有關(guān)的所有端節(jié)點,都按照配置各就各位,USB設(shè)備現(xiàn)在可以從VBUS得到描述中所要求的電量了。從設(shè)備的角度來講,它已經(jīng)準備就緒了。
當UBS設(shè)備被取走時,集線器同樣會通知主機,斷開一個設(shè)備連接會使得設(shè)備所連接的端口無效,一收到斷開通知后,主機就會更新的拓撲信息。
評論