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