USB協(xié)議學習筆記
1、USB總線通信的基本單位是包,包由8位的前導符SYNC域、8位的PID域、數(shù)據(jù)域、CRC域以及EOP(電平信號)組成。
??? 1)SYNC域是為了同步時鐘,當總線上由IDLE狀態(tài)跳變到差分的01010..的SYNC域時,表明一個包的開始。
??? 2)PID域是為了區(qū)分不同的包類型,比如SETUP包、OUT包、IN包等等。
??? 3)數(shù)據(jù)域則根據(jù)不同的包類型來解釋。
??? 4)CRC域是校驗碼。
??? 5)EOP是一種總線信號狀態(tài),用來表明一個包的結束。
?
2、USB的包根據(jù)PID域可以分為3個大類:
??? 1)token(令牌)包,由USB主機發(fā)起。token包又分為IN、OUT、SETUP等。當USB主機發(fā)送一個SETUP包時,表明接下來是一個SETUP事務傳輸。若USB主機發(fā)起的是IN包,表明接下來是一個IN事務傳輸。
??? 2)DATA0包和DATA1包。DATA0和DATA1包可以由USB主機發(fā)起或者是由USB設備發(fā)起,表明這是一個數(shù)據(jù)包。為了同步數(shù)據(jù)包,使用DATA0、DATA1、DATA0...這樣的翻轉包來達到同步。
??? 3)ACK包、NAK包以及STALL包,這些包用來表明之前的數(shù)據(jù)傳輸、控制應答是否正確。這3個包比較特殊,只有SYNC和PID域。
注意,區(qū)分這些包是在包的PID域中區(qū)分的。
?
3、USB總線上的設備具有地址的屬性,一個包或者一次事務傳輸,必須支持是USB主機和哪個設備的通信。換句話說,當主機發(fā)起一個SETUP包、DATA0包等,這些包時,哪個設備應該接收數(shù)據(jù)并作出相應呢?
為此,USB定義了事務傳輸,事務傳輸由幾個包組成,而且第一個包必定是USB主機發(fā)起的token包、接著是DATA包、最后是ACK包。其中的token包,就領銜了一次事務傳輸,指出此次事務傳輸是對應哪個設備地址、哪個端點,還指出了此時事務傳輸中的數(shù)據(jù)包應該如何解釋。比如,如果是SETUP的token包領銜的事務,則事務中的DATA包必定是由USB主機發(fā)送的REQUEST數(shù)據(jù);如果是IN的token包,則表明本次事務中的DATA包必須由USB設備發(fā)送。事務中的ACK/NAK包,則是用于表明本次事務傳輸是否正確。
由此可見,在USB總線上的進行通信時,都是先由USB主機發(fā)起token包,表明參與此次事務的設備和端點;然后不同的token包也指出了是否有DATA包,以及DATA包是由USB主機發(fā)送給USB設備還是由USB設備發(fā)送給USB主機;最后的ACK/NAK包則是應答包,由接收數(shù)據(jù)端發(fā)送。
?
4、不同的token包PID指出了不同的事務,不同的事務表明了事務中的DATA包的方向和意義。其中SETUP事務用于USB傳輸控制信息,而OUT、IN事務用于傳輸普通數(shù)據(jù)。
?
5、假設本次事務是SETUP事務:
??? 1)USB主機首先在總線上發(fā)送SETUP包,對應的USB設備、端點接收到此SETUP包后,立刻知道,USB主機將會發(fā)送DATA包,并且DATA包中的數(shù)據(jù)應按照USB2.0規(guī)范中規(guī)定的或者其他CDC規(guī)范等規(guī)定的格式解釋。
??? 2)選中的USB設備等待USB主機發(fā)送DATA包。
??? 3)USB主機發(fā)送DATA包(DATA0),注意DATA包中并沒有指出哪個USB設備應該接收此DATA包。但是,之前的SETUP包已經說明了哪個設備、端點應該接收此DATA包。所以,其他的設備、端點忽略此DATA包。
??? 4)選中的USB設備接收到DATA包,返回ACK包(若出錯或者其他非正常情況,返回NAK包)。并按照不同的協(xié)議規(guī)范(USB2.0、USB CDC等規(guī)范)解釋收到的DATA包。通常來說,SETUP事務中的DATA包都是USB Device Request,USB設備根據(jù)不同的Request,或返回描述符,或執(zhí)行狀態(tài)變化,或者...
?
6、假設本次事務是OUT事務:
??? 1)USB主機首先發(fā)送OUT的token包,指出了本次事務參與的設備地址和端點號,并說明,接著USB主機要發(fā)一個數(shù)據(jù)包給USB設備。
??? 2)USB主機發(fā)送DATA包(DATA0或者DATA1)。
??? 3)選中的USB設備接收到相應的數(shù)據(jù)包,并依據(jù)情況返回ACK包或者NAK包。
?
7、假設本次事務是IN事務:
??? 1)USB主機首先發(fā)送IN的token包,指出了本次事務參與的設備地址和端點號,并說明,選中的USB設備應該發(fā)送數(shù)據(jù)包給主機。
??? 2)選中的USB設備發(fā)送DATA包(DATA0包或者DATA1包)。
??? 3)USB主機根據(jù)情況返回ACK包或者NAK包。
?
8、控制傳輸:
控制傳輸由幾個事務組成,分別是SETUP事務、IN/OUT事務、狀態(tài)階段的IN/OUT事務,對應USB2.0規(guī)范中的設置階段、數(shù)據(jù)階段、狀態(tài)階段。
??? 1)設置階段:SETUP事務給出了本次控制傳輸中的USB REQUEST,是GET_DESCRIPOR還是SET_ADDRESS,或者是SET_CODE_LINE等等的REQUEST,這些REQUEST可以是USB2.0規(guī)定的標準REQUEST,也可以是設備類型的(class-specific)的REQUEST,還可以是廠商指定的REQUEST(vendor-specific)。
??? 2)數(shù)據(jù)階段:根據(jù)不同的REQUEST,①或是USB主機發(fā)送DATA包,給出上一步對應的REQUEST的補充信息;②或是USB設備根據(jù)不同的REQUEST,通過發(fā)送DATA包返回數(shù)據(jù)給USB主機(也可以沒有數(shù)據(jù))
??? 3)狀態(tài)階段:USB主機根據(jù)數(shù)據(jù)階段的方向,發(fā)起OUT或者IN事務。OUT或者IN事務中的DATA包必須是DATA1,而且長度必須是0。
?
9、由上面的描述,USB主機和USB設備具備了基本的通信能力,比如USB主機發(fā)送REUQEST、USB設備響應REQUEST、USB發(fā)送數(shù)據(jù)給USB設備、USB設備發(fā)送數(shù)據(jù)給USB主機等等。而且,可以看到,所有的最初事務都是先由USB主機發(fā)起的。如果一個USB設備想要發(fā)送數(shù)據(jù)給USB主機,必須等待USB主機對本設備發(fā)起IN事務時,USB設備才能通過發(fā)送DATA包(即需要發(fā)送的數(shù)據(jù))來達到發(fā)送數(shù)據(jù)給USB主機的目的。因此,USB主機控制了USB總線的帶寬分配權。
?
10、USB總線系統(tǒng)最本質的功能就是提供一種基本的通信方式來連接USB主機和USB設備,使多個USB設備可以同時(宏觀上的同時)和USB主機通信。USB總線系統(tǒng)通過不同的(管道、端點)傳輸類型,來合理安排總線的帶寬,以達到不同的USB設備都可以和USB主機通信。在這種基本的通信能力基礎之上,USB主機向上提供client(主機上運行的、針對特定USB設備的驅動)和USB設備通信的接口。于是,不同的USB主機端client就可以驅動不同的USB設備,使USB設備發(fā)揮特定的功能。
?
11、當一個USB設備連接到USB總線上時,USB的hub負責通知USB主機這一變化。在USB主機端,有一個hub driver的程序負責處理這一變化。通常來說,這就是USB的枚舉過程:
??? 1)USB主機給USB設備發(fā)送復位信號。
??? 2)USB設備接收到復位信號之后,其設備地址默認為0。
??? 3)USB主機通過設備地址0、端點0,給USB設備發(fā)送獲取設備描述、配置描述符、接口描述符等等之類的USB REQUEST。
??? 4)USB設備根據(jù)不同的REQUEST,返回特定的描述,以表明自己的身份。
??? 5)USB主機根據(jù)USB設備返回的各種描述符,依據(jù)vendor-ID、product-ID等信息,加載特定的USB驅動,讓特定的USB驅動去和USB設備交互,完成USB設備的初始、配置。
??? 6)特定的USB驅動和USB設備之間的數(shù)據(jù)交換,完成了USB功能。
?
12、在加載特定的USB驅動之前,USB主機必須能獲取USB設備的各種描述符,如此才能識別此USB設備,才能決定加載哪個驅動去和這個設備進行交換。所以,USB2.0規(guī)定了幾個標準的REQUEST,要求所有USB2.0設備必須支持。這樣,在USB設備掛接總線時,USB系統(tǒng)可以通過這些標準的REQUEST來認識這個USB設備,再加載特定的驅動去和USB設備進行交換。
?
13、在標準的USB2.0?? REQUEST之上,特定類型的USB設備(calss-specific),或者廠商開發(fā)的特殊設備(vender-specific),都可以定義不同的REQUEST,這些REQUEST的格式和標準的USB2.0? REQUEST格式一致,只不過是具體的字段決定了不同的REUQEST。所以REQUEST是一個開放的標準。通過這個開放的REQUEST,就可以開發(fā)出不同的USB設備以及對應的驅動程序,共同組建USB系統(tǒng)。
?
14、為了簡化USB開發(fā),USB協(xié)議還制定了幾種設備類型,比如CDC(Communicatin Device Class)設備,MSD(Mass Storage Device)設備,HID(Human Interface)設備等等,常見的USB轉COM就是CDC設備,USB鼠標和USB鍵盤就是HID設備,還有U盤就是MSD設備。通常某一類型的USB設備具有共同的操作、功能接口,將這些共同的操作、接口抽象出來,就形成了某一類USB設備(比如CDC或者MSD)。在此基礎上,USB為某類USB設備制定了一些規(guī)范,比如CDC設備規(guī)范、MSD設備的規(guī)范,通過這些規(guī)范,在USB2.0 標準REQUEST的基礎上,添加設備類型指定(class-specific)的REQUEST,就可以形成特定功能的USB設備。某一類USB設備,除了支持標準的USB2.0? REQUEST之外,還支持本類型規(guī)定的REQUEST。