USB,是英文Universal Serial Bus(通用串行總線)、支持設(shè)備的即插即用和熱插拔功能。在1994年底由英特爾、IBM、Microsoft等公司聯(lián)合提出的,在此之前PC的接口雜亂,擴(kuò)展能力差,熱拔插不支持等。USB正是為了解決速度,擴(kuò)展能力,易用性等而出現(xiàn)的,本文闡述了usb 協(xié)議的特點(diǎn)及其四種傳輸模式。
1. usb的特點(diǎn)
USB 接口有4根線,兩根電源及兩根信號(hào),Standard A類型的接口定義 如下
一般的排列方式是:紅白綠黑從左到右
紅色-USB電源:標(biāo)有-VCC、Power、5V、5VSB字樣
綠色-USB數(shù)據(jù)線:(正)-DATA+、USBD+、PD+、USBDT+
白色-USB數(shù)據(jù)線:(負(fù))-DATA-、USBD-、PD-、USBDT+
黑色-地線:GND、Ground
1.1 Usb的四層描述符
USB協(xié)議采取主從模式,從設(shè)備端沒有主動(dòng)通知USB主機(jī)端的能力,從機(jī)插入后,主機(jī)控制器根據(jù)協(xié)議,獲取設(shè)備描述符及驅(qū)動(dòng)匹配。 每個(gè)usb設(shè)備可以有一個(gè)或多個(gè)配置(config),不同的配置的體現(xiàn)即不同的組合接口。 接口(interface)是一個(gè)邏輯概念,接口之間通常是隔離的,互相不干擾。 端點(diǎn)(endpoint)是usb設(shè)備的唯一可識(shí)別部分,也是host和device之間的通信流的終點(diǎn)。它是一個(gè)host或device上的一個(gè)數(shù)據(jù)緩沖區(qū),用來存放和發(fā)送usb的各種數(shù)據(jù)。每個(gè)端點(diǎn)都是一個(gè)單一連接,支持一個(gè)方向的數(shù)據(jù)流(in: device→host)(out: host→device)。 端點(diǎn)0:所有的usb設(shè)備都要擁有端點(diǎn)0,該端點(diǎn)用于對(duì)一個(gè)邏輯設(shè)備進(jìn)行配置。端點(diǎn)0支持控制傳輸,且總是在設(shè)備接入和上電時(shí)就進(jìn)行配置。
一個(gè)設(shè)備通常有一個(gè)或多個(gè)配置;
一個(gè)配置通常有一個(gè)或多個(gè)接口;
一個(gè)接口通常有一個(gè)或多個(gè)端點(diǎn)。
》設(shè)備描述符
/* USB_DT_DEVICE: Device descriptor /
struct usb_device_descriptor {
__u8 bLength; //本結(jié)構(gòu)體大小
__u8 bDescriptorType; //描述符類型
__le16 bcdUSB; //usb版本號(hào) 200->USB2.0
__u8 bDeviceClass; //設(shè)備類
__u8 bDeviceSubClass; //設(shè)備類子類
__u8 bDeviceProtocol; //設(shè)備協(xié)議,以上三點(diǎn)都是USB官方定義
__u8 bMaxPacketSize0; //端點(diǎn)0最大包大小
__le16 idVendor; //廠家id
__le16 idProduct; //產(chǎn)品id
__le16 bcdDevice; //設(shè)備出廠編號(hào)
__u8 iManufacturer; //設(shè)備廠商字符串索引
__u8 iProduct; //產(chǎn)品描述
__u8 iSerialNumber; //設(shè)備序列號(hào)字符串索引
__u8 bNumConfigurations; //配置的個(gè)數(shù)
} attribute ((packed));
》配置描述符
/ USB_DT_CONFIG: Config descriptor /
struct usb_config_descriptor {
__u8 bLength; //自身長(zhǎng)度
__u8 bDescriptorType;//描述符類型(0x02)
__le16 wTotalLength; //該配置下,信息的總長(zhǎng)度
__u8 bNumInterfaces; //接口的個(gè)數(shù)
__u8 bConfigurationValue; //Set_Configuration命令所需要的參數(shù)值
__u8 iConfiguration; //描述該配置的字符串的索引值
__u8 bmAttributes;//供電模式的選擇
__u8 bMaxPower;//設(shè)備從總線提取的最大電流
} attribute ((packed));
》接口描述符
/ USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
__u8 bLength;
__u8 bDescriptorType;//接口描述符的類型編號(hào)(0x04)
__u8 bInterfaceNumber; //該接口的編號(hào)
__u8 bAlternateSetting; //備用的接口描述符編號(hào)
__u8 bNumEndpoints; //該接口使用的端點(diǎn)數(shù),不包括端點(diǎn)0
__u8 bInterfaceClass; //接口類
__u8 bInterfaceSubClass; //子類
__u8 bInterfaceProtocol; //協(xié)議
__u8 iInterface;//描述該接口的字符串索引值
} attribute ((packed));
》端點(diǎn)描述符
/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
__u8 bLength;//端點(diǎn)描述符字節(jié)數(shù)大?。?個(gè)字節(jié))
__u8 bDescriptorType;//端點(diǎn)描述符類型編號(hào)(0x05)
__u8 bEndpointAddress; //端點(diǎn)地址及輸入輸出屬性
__u8 bmAttributes; //屬性,包含端點(diǎn)的傳輸類型,控制,中斷…
__le16 wMaxPacketSize; //端點(diǎn)收、發(fā)的最大包大小
__u8 bInterval; //主機(jī)查詢端點(diǎn)的時(shí)間間隔
__u8 bRefresh;
__u8 bSynchAddress;
} attribute ((packed));
1.2 USB 結(jié)構(gòu)及通信形式
USB總線是一個(gè)單主方式的實(shí)現(xiàn),是一種輪詢方式的總線,為樹形拓?fù)浣Y(jié)構(gòu)。協(xié)議規(guī)定所有的數(shù)據(jù)傳輸都必須由主機(jī)發(fā)起,host controller初始化所有的數(shù)據(jù)傳輸,各種設(shè)備緊緊圍繞在主機(jī)周圍。
USB通信最基本的形式是通過USB設(shè)備里一個(gè)叫endpoint的端點(diǎn)(可以理解為硬件寄存器或者buff),而主機(jī)和endpoint之間的數(shù)據(jù)傳輸是通過pipe,pipe通信有兩種,一種是stream,另一種是message,協(xié)議中規(guī)定:message管道要求從它那兒過的數(shù)據(jù)必須具有一定的格式,message管道必須對(duì)應(yīng)兩個(gè)相同號(hào)碼的端點(diǎn),一個(gè)用來in,一個(gè)用來out,咱們的缺省管道就是message管道,當(dāng)然,與缺省管道對(duì)應(yīng)的端點(diǎn)0就必須是兩個(gè)具有同樣端點(diǎn)號(hào)0的端點(diǎn)。
一個(gè)USB邏輯設(shè)備就是一系列端點(diǎn)(endpoint)的集合,它與主機(jī)之間的通信發(fā)生在主機(jī)上的一個(gè)緩沖區(qū)和設(shè)備上的一個(gè)端點(diǎn)之間,通過管道來傳輸數(shù)據(jù)。管道的一端是主機(jī)上的一個(gè)緩沖區(qū),另一端是設(shè)備上的端點(diǎn) ,構(gòu)成一個(gè)通信信道。
2. USB 四種通信方式
USB endpoint有四種類型,分別對(duì)應(yīng)了四種不同的數(shù)據(jù)傳輸方式。它們是控制傳輸(Control Transfers),中斷傳輸(Interrupt Data Transfers),批量傳輸(Bulk Data Transfers),等時(shí)傳輸(Isochronous Data Transfers)。其中批量傳輸、等時(shí)傳輸和中斷傳輸每傳輸一次數(shù)據(jù)都是一個(gè)事務(wù);控制傳輸包括三個(gè)過程,建立過程和狀態(tài)過程分別是一個(gè)事務(wù),數(shù)據(jù)過程則可能包含多個(gè)事務(wù)。從usb設(shè)備端來看,也可以把端點(diǎn)分為四種類型為控制端點(diǎn)、中斷端點(diǎn)、批量端點(diǎn)、等時(shí)端點(diǎn)。USB傳輸數(shù)據(jù)先發(fā)數(shù)據(jù)低位(LSB),再發(fā)高位數(shù)據(jù)(MSB)
2.1 控制傳輸
控制傳輸用來控制對(duì)USB設(shè)備不同部分的訪問,通常用于配置設(shè)備,獲取設(shè)備信息,發(fā)送命令到設(shè)備,或者獲取設(shè)備的狀態(tài)報(bào)告??傊褪怯脕韨魉涂刂菩畔⒌模總€(gè)USB設(shè)備都會(huì)有一個(gè)endpoint 0的控制端點(diǎn),內(nèi)核里的USB core使用它在設(shè)備插入時(shí)進(jìn)行設(shè)備的配置,它會(huì)一種等待著USB core發(fā)送控制命令。
控制傳輸分為三個(gè)過程:
建立過程使用一個(gè)建立事務(wù)。建立事務(wù)是一個(gè)輸出數(shù)據(jù)包的過程,需要注意的點(diǎn)有:
? 首先是令牌包,建立過程使用SETUP令牌包;
? 其次是數(shù)據(jù)包類型,SETUP只能使用DATA0包;
? 最后是握手,設(shè)備只能采用ACK來應(yīng)答(錯(cuò)了的情況不應(yīng)答),不能使用NAK或者STALL來應(yīng)答,即設(shè)備必須要接受建立事務(wù)的數(shù)據(jù)。
數(shù)據(jù)過程是可選的,即一個(gè)控制傳輸可能沒有數(shù)據(jù)過程。如果有,一個(gè)數(shù)據(jù)過程可以包含一個(gè)或多個(gè)數(shù)據(jù)事務(wù),需要注意的是:
? 首先所有的數(shù)據(jù)事務(wù)必須是同一個(gè)方向的(在控制讀傳輸中,數(shù)據(jù)過程中的所有數(shù)據(jù)事務(wù)都必須是輸入的;在控制寫傳輸中,數(shù)據(jù)過程中的所有數(shù)據(jù)都必須是輸出的);
? 其次,一旦數(shù)據(jù)傳輸方向改變,就會(huì)認(rèn)為進(jìn)入到狀態(tài)過程,狀態(tài)過程的第一個(gè)數(shù)據(jù)包必須是DATA1包;
? 最后,每次爭(zhēng)取傳輸一個(gè)數(shù)據(jù)包后就在DATA0和DATA1之間交換。
在這里插入圖片描述
控制傳輸?shù)腟tatus階段是序列中的最后一個(gè)事務(wù),狀態(tài)階段由前一階段的數(shù)據(jù)流方向改變描繪,并始終使用DATA1 PID。
獲取設(shè)備描述符為控制傳輸,由5個(gè)事務(wù)組成,分別是SETUP、IN、IN、IN、OUT,具體過程如下:
2.2 批量傳輸
批事務(wù)量
{In/Out Data Packet
@令牌包(In/Out token)
@數(shù)據(jù)包 (In/Out data)
@握手包 (Out/In ack)
}
批量傳輸用來傳輸大量的數(shù)據(jù),確保沒有數(shù)據(jù)丟失,并不保證在特定的時(shí)間內(nèi)完成。U盤使用的就是批量傳輸,咱們用它備份數(shù)據(jù)時(shí)需要確保數(shù)據(jù)不能丟,而且也不能指望它能在一個(gè)固定的比較快的時(shí)間內(nèi)拷貝完。
? 批量輸出(批量寫)時(shí), Out Token→Out Data→ACK/NYET/NAK/STALL,其中ACK代表接收正常,且可以接收下次傳輸;NYET代表本次數(shù)據(jù)成功接收,但沒能力接收下一次傳輸;NAK表示沒有足夠的緩沖區(qū)來保存數(shù)據(jù);STALL表示數(shù)據(jù)接收,但是端點(diǎn)處于掛起狀態(tài)。
? 批量輸入(批量讀)時(shí),In Token→In Data→ACK /NAK/STALL,與批量寫不同,主機(jī)發(fā)送In令牌包后,若設(shè)備檢測(cè)到錯(cuò)誤,則不做任何響應(yīng),主機(jī)等待超時(shí)。若設(shè)備沒有檢測(cè)到地址端點(diǎn)等錯(cuò)誤,但是設(shè)備又沒有數(shù)據(jù)需要返回,那么設(shè)備就會(huì)返回NAK直接響應(yīng)主機(jī);若改端點(diǎn)處于掛起狀態(tài),返回STALL給主機(jī);若主機(jī)正確接收到數(shù)據(jù)后,主機(jī)返回ACK應(yīng)答設(shè)備,同樣的,主機(jī)檢測(cè)到錯(cuò)誤則不做出響應(yīng),設(shè)備檢測(cè)超時(shí)。USB協(xié)議規(guī)定,不允許主機(jī)使用NAK拒絕接收數(shù)據(jù)包。
2.3 中斷傳輸
中斷事務(wù)
{In/Out Data Packet
@令牌包(In/Out token)
@數(shù)據(jù)包(In/Out data)
@握手包(Out/In ack)
}
中斷傳輸是一種保證查詢頻率的傳輸,用來以一個(gè)固定的速率傳送少量的數(shù)據(jù)。中斷端點(diǎn)在端點(diǎn)描述符中要報(bào)告它的查詢時(shí)間,主機(jī)會(huì)保證在小于這個(gè)事件間隔的范圍內(nèi)安排一次傳輸,USB鍵盤和USB鼠標(biāo)使用的就是這種方式,USB的觸摸屏也是,傳輸?shù)臄?shù)據(jù)包含了坐標(biāo)信息。
中斷傳輸不是由設(shè)備主動(dòng)的發(fā)出一個(gè)設(shè)備請(qǐng)求,而是由主機(jī)保證不大于某個(gè)時(shí)間間隔內(nèi)安排一次傳輸。中斷傳輸通常用在數(shù)據(jù)量不大,但是對(duì)時(shí)間要求較嚴(yán)格的設(shè)備。中斷傳輸也可以用來不停的檢查某個(gè)狀態(tài),當(dāng)條件滿足后再用批量傳輸,除了對(duì)端點(diǎn)查詢的策略上不一樣之外,中斷傳輸和批量傳輸?shù)慕Y(jié)構(gòu)基本上是一樣的。
2.4 等時(shí)傳輸
等時(shí)事務(wù)
{In/Out Data Packet
@令牌包(In/Out token)
@數(shù)據(jù)包 (In/Out data)
}
等時(shí)傳輸使用等時(shí)事務(wù)(Isochronous Transactions)來傳輸數(shù)據(jù)。同樣用來傳輸大量的數(shù)據(jù),但并不保證數(shù)據(jù)是否到達(dá),以穩(wěn)定的速率發(fā)送和接收實(shí)時(shí)的信息,對(duì)傳送延遲非常敏感。用在數(shù)據(jù)量大、對(duì)實(shí)時(shí)性要求高的場(chǎng)合,例如音頻設(shè)備、視屏設(shè)備等,這些設(shè)備對(duì)數(shù)據(jù)延時(shí)敏感,期望能夠有個(gè)比較穩(wěn)定的數(shù)據(jù)流。對(duì)音頻或者視屏設(shè)備來說,對(duì)數(shù)據(jù)的100%正確要求不高,少量數(shù)據(jù)的錯(cuò)誤還是能夠容忍的,主要是要保證不能停頓;所以等時(shí)傳輸是不保證數(shù)據(jù)100%正確的。當(dāng)數(shù)據(jù)錯(cuò)誤時(shí),并不能進(jìn)行重傳操作。因此等時(shí)傳輸也就沒有應(yīng)答包,并不進(jìn)行重傳操作。數(shù)據(jù)是否正確,可以由數(shù)據(jù)包的CRC校驗(yàn)來確認(rèn)。至于出錯(cuò)的數(shù)據(jù)如何處理,是由軟件來決定的。
控制傳輸
{Setup Packet(建立階段)
@令牌包(setup token)-(out) @數(shù)據(jù)包(Setup data) -(out) @握手包(ack) - (in)
}
{In/Out Data Packet(可選數(shù)階段據(jù))
@(令牌包(In/Out token) @數(shù)據(jù)包(In/Out data) @握手包(Out/In ack)
}
{Out/In Stautus Packet(狀態(tài)階段)
@(令牌包(Out/In token) @數(shù)據(jù)包(Out/In data) @握手包( In/Out ack)
}
審核編輯黃昊宇
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
840瀏覽量
40215 -
usb
+關(guān)注
關(guān)注
60文章
7876瀏覽量
263697
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論