1-USB 基本知識
2-USB 總線
3-USB 設備
4-USB 傳輸
1-USB 基本知識
USB的重要關鍵概念:
1、 端點:位于USB設備或主機上的一個數據緩沖區,用來存放和發送USB的各種數據,每一個端點都有惟一的確定地址,有不同的傳輸特性(如輸入端點、輸出端點、配置端點、批量傳輸端點)
2、 幀:時間概念,在USB中,一幀就是1MS,它是一個獨立的單元,包含了一系列總線動作,USB將1幀分為好幾份,每一份中是一個USB的傳輸動作。
3、upstream、downstream(上行、下行):設備到主機為上行,主機到設備為下行
問題一:USB的傳輸線結構是如何的呢?
一條USB的傳輸線分別由地線、電源線、D+、D-四條線構成,D+和D-是差分輸入線,它使用的是3.3V的電壓(注意哦,與CMOS的 5V電平不同),而電源線和地線可向設備提供5V電壓,最大電流為500MA
問題二:數據是如何在USB傳輸線里面傳送的
數據在USB線里傳送是由低位到高位發送的。
問題三:USB的編碼方案?
答案三:USB采用不歸零取反來傳輸數據,當傳輸線上的差分數據輸入0時就取反,輸入1時就保持原值,為了確保信號發送的準確性,當在USB總線上發送一個包時,傳輸設備就要進行位插入***作(即在數據流中每連續6個1后就插入一個0),從而強迫NRZI碼發生變化。這個了解就行了,這些是由專門硬件處理的。
問題四:USB的數據格式是怎么樣的呢?
和其他的一樣,USB數據是由二進制數字串構成的,首先數字串構成域(有七種),域再構成包,包再構成事務(IN、OUT、SETUP),事務最后構成傳輸(中斷傳輸、并行傳輸、批量傳輸和控制傳輸)。下面簡單介紹一下域、包、事務、傳輸,請注意他們之間的關系。
2-USB 總線
usb2.0 支持1.5Mb/s的低速(low-speed,鼠標..)模式和12Mb/s的全速(full-speed語音)模式,在USB2.0中,又加入了480Mb/s的高速模式(視頻)。
2.1 USB總線信號
USB使用差分傳輸模式,兩根數據線D+和D-
差分信號1:D+>2.8V,D-<0.3V
差分信號0:D->2.8V,D+<0.3V
J狀態和K狀態
低速下:D+為“0”,D-為“1”是為“J”狀態,“K”狀態相反;
全速下:D+為“1”,D-為“0”是為“J”狀態,“K”狀態相反;
高速同全速。
SE0狀態
D+為“0”,D-為“0”
IDLE狀態
低速下空閑狀態為“K”狀態;
全速下空閑狀態為“J”狀態;
高速下空閑狀態為“SE0”狀態.
全速模式,有以下幾個重要信號:
Reset信號
主機在要和設備通信之前會發送Reset信號來把設備配置到默認的未配置狀態。即SE0狀態保持10ms。
Resume信號
20ms的K狀態+低速EOP
Suspend信號
3ms以上的J狀態
SOP信號
從IDLE狀態切換到K狀態
EOP信號
持續2位時間的SE0信號,后跟隨1位時間的J狀態
SYNC信號
3個重復的K、J狀態切換,后跟隨2位時間的K狀態
2.2 USB信號數據編碼
USB采用NRZI(非歸零編碼)對發送的數據包進行編碼。即:
輸入數據0,編碼成“電平翻轉”;輸入數據1,編碼成“電平不變”
位填充是為了保證發送的數據序列中有足夠多的電平變化。填充的對象時輸入數據,即先填充后編碼。數據流中每6個連續的“1”,就要插入1個“0”。
接收方解碼NRZI碼流,然后識別出填充位,并丟棄它們。
2.3 USB拓撲結構
USB是一種主從結構的系統,主機叫做Host,從機叫做Device。Device包括USB function和USB HUB。
USB總線基于分層的星狀拓撲結構,以HUB為中心,連接周圍設備。總線上最多可連接127個設備。Hub串聯數量最多5個。
2.4 USB邏輯部件
設備
---》 接口 (一個或多個):用于描述特定功能,包含多個端點
----》端點(一個或多個): 傳輸的最終對象
端點號,傳輸類型
傳輸方向,最大的數據長度....
3-USB 設備
3.1-USB 設備供電方式
USB設備有兩種供電方式:
- 自供電設備:設備從外部電源獲取工作電壓
- 總線供電設備: 設備從VBUS(5v)取點
對總線供電設備,區分低功耗和高功耗USB設備。
低功耗設備是最大功耗不超過100mA。
高功耗設備是枚舉時最大功耗不超過100mA,枚舉完成配置結束后功耗不超過500mA。
設備在枚舉工程中,通過配置描述符來向主機報告它的供電方式和功耗要求的。
沒有設備連上主機時,主機的D+和D-都在低電平(SE0狀態),當SE0狀態 持續一段時間了,就被主機認為是斷開狀態。
當設備連上主機時,主機檢測到某一數據線電平拉高并持續一段時間,就認為有設備連上來了。主機必須在復位設備前,立即采樣總線狀態來判斷設備的速度。
3.2-USB 設備狀態
USB設備有插入、供電、初始化、分配地址、配置和掛起六中狀態,其狀態轉移圖如下。
3.3-USB 枚舉過程
USB 設備連接到主機或從主機上拔出時,主機通過枚舉(Enumeration)過程來識別和管理設備。當一個設備連接到一個供電的端口時,將會有下列過程:
1.------ 檢測電壓變化,報告主機:USB 設備上電后,HUB 檢測到有電壓變化,將利用自己的中斷端點將信息反饋給主控制器有設備連接。
主機了解連接設備:主機在知道有設備接入后會發送一個 Get_Port_Status 請求(request)給 hub 以了解此次狀態改變的確切含義。
Hub 檢測所插入的設備是高速還是低速:hub 通過檢測 USB 總線空閑(Idle)時差分線的高低電壓來判斷所連接設備的速度類型,當 host 發來 Get_Port_Status 請求時,hub 就可以將此設備的速度類型信息回復給 host。USB 2.0 規范要求速度檢測要先于復位(Reset)操作。
2.------hub 復位設備:主機一旦得知新設備已連上以后,它至少等待 100ms 以使得插入操作的完成以及設備電源穩定工作。然后主機控制器就向 hub 發出一個Set_Port_Feature 請求讓hub 復位其管理的端口(剛才設備插上的端口)。hub 通過驅動數據線到復位狀態(D+和 D-全為低電平),并持續至少 10ms。當然,hub 不會把這樣的復位信號發送給其他已有設備連接的端口,所以其他連在該 hub 上的設備自然看不到復位信號,不受影響。
Host 檢測所連接的全速設備是否是支持高速模式:根據 USB 2.0 協議,高速(High Speed)設備在初始時是默認全速(Full Speed )狀態運行,所以對于一個支持 USB 2.0 的高速 hub,當它發現它的端口連接的是一個全速設備時,會進行高速檢測,看看目前這個設備是否還支持高速傳輸,如果是,那就切到高速信號模式,否則就一直在全速狀態下工作。
Hub 建立設備和主機之間的信息通道:主機不停地向 hub 發送 Get_Port_Status 請求,以查詢設備是否復位成功。Hub 返回的報告信息中有專門的一位用來標志設備的復位狀態。當 hub 撤銷了復位信號,設備就處于默認/空閑狀態(Default state),準備接收主機發來的請求。設備和主機之間的通信通過址 控制傳輸,默認地址 0 ,端點號 0 進行。此時,設備能從總線上得到的最大電流是 100mA。
3&4.------ 主機發送 Get_Descriptor 請求 , 獲取 設備描述符: :默認管道(Default Pipe)在設備一端來看就是端點 0。主機此時發送的請求是默認地址 0,端點 0。設備描述符的第 8 字節代表設備端點 0 的最大包大小。當完成第一次的控制傳輸后,系統會要求 hub 對設備進行再一次的復位操作。再次復位的目的是使設備進入一個確定的狀態。
**5.------ **主機給設備分配地址:主機控制器通過 Set_Address 請求向設備分配一個唯一的地址。此后,設備進入地址狀態(Address state),之后就啟用新地址繼續與主機通信。
6&7&8.
主機獲取 設備的信息:主機再次發送 Get_Descriptor 請求到新地址讀取設備描述符。設備描述符內信息包括端點 0 的最大包長度,設備所支持的配置(Configuration)個數,設備類型,VID、PID 等信息。之后主機發送Get_Descriptor 請求,讀取配置描述符(Configuration Descriptor),字符串描述符等,逐一了解設備更詳細的信息。配置描述符總共為 9 字節。主機在獲取到配置描述符后,根據里面的配置集合總長度,再獲取配置集合。配置集合包括配置描述符,接口描述符,端點描述符等。如果有字符串描述符,還要獲取字符串描述符。另外 HID 設備還有HID 描述符等。
主機給設備掛載驅動(復合設備除外):主機通過解析描述符后對設備有足夠的了解,會選擇一個最合適的驅動給設備。 然后調用設備模型提供的接口 device_add 將設備添加到usb 總線的設備列表里,然后 usb 總線會遍歷驅動列表里的每個驅動,調用自己的match(usb_device_match)函數查詢驅動和連入的設備或接口是否匹配,匹配的話調用device_bind_driver 函數,將控制權交到設備驅動。對于復合設備,通常應該是不同的接口(Interface)配置給不同的驅動,因此,需要等到當設備被配置并把接口使能后才可以把驅動掛載上去。
9.------設備驅動選擇一個配置:驅動根據前面設備回復的信息,發送 Set_Configuration 請求來正式確定選擇設備的哪個配置(Configuration)作為工作配置。至此,設備處于配置狀態(Configured),當然,設備也應該使能它的各個接口(Interface)
上面的過程可以理解:(核心功能就是協商)
Device:12 01 0100....Device Descriptor
Host:你有幾種功能?
Device:09 02 09....Configuration Descriptor
Host:每個功能有幾個接口?
Device:09 04 00....Interface Descriptor
Host:每個接口使用哪幾個端點?
Device:06 05 82....Endpoint Descriptor
Host:好了,我知道你是誰了,開始傳輸設備吧!
Device:OK,Read Go!
3.4-USB 描述符
每種描述符的第一個字節描述該描述符包含的字節數目,第二個節描述該描述的類型。
3.4.1 Device Descriptor
3.4.2 Configuration Descriptor
3.4.3 Interface Descriptor
3.4.4 Endpoint Descriptor
3.4.5 String Descriptor
4-USB 傳輸
USB總線上傳輸數據是以包(packet)為基本單位的,必須把不同的包組織成事務(transaction)才能傳輸數據。
USB協議規定了四種傳輸(transfer)類型:批量傳輸、同步傳輸、中斷傳輸和控制傳輸。其中,批量傳輸、同步傳輸和中斷傳輸每傳輸一次數據都是一個事務,控制傳輸包括三個過程,建立過程和狀態過程分別是一個事務,數據過程則可能包含多個事務。
4.1 包packet
一個包被分為不同域,根據不同類型的包,所包含的域是不一樣的。但都要以同步域SYNC開始,緊跟一個包標識符PID,最終以包結束符EOP來結束這個包。
-
PID域
PID是用來標識一個包的類型的。它共有8位,只使用4位(PID0PID3),另外4位是PID0PID3的取反,用來校驗PID
PID
PID規定了四類包:令牌包、數據包、握手包和特殊包。同類的包又各分為具體的四種包
僅在幀首傳輸一次SOF包。 (下面有介紹,令牌包) -
地址域
地址共占11位,其中低7位是設備地址,高4位是端點地址。
地址 幀號域
幀號占11位,主機每發出一個幀,幀號都會自加1,當幀號達到0x7FF時,將歸零重新開始計數。-
數據域
根據傳輸類型的不同,數據域的數據長度從0到1024字節不等。
CRC域
校驗和
4.1.1 令牌包
令牌包有四種:
1-OUT: 通知設備將要輸出一個數據包
2-IN: 通知設備返回一個數據包
3-SETUP: 只用在控制傳輸中,也是通知設備將要輸出一個數據包,與OUT令牌的區別是:只使用DATA0數據包,且只能發到device的控制端點
4-SOF: 在每幀開始時以廣播的形式發送,針對USB全速設備,主機每1ms產生一個幀,USB主機會對當前幀號進行統計,每次幀開始時通過SOF包發送幀號。
OUT/IN/SETUP令牌包沒有幀號域和數據域。
SOF令牌包沒有地址域和數據域。
4.1.2 數據包
數據包沒有地址域和幀號域。根據transfer的類型不同,數據包最大長度有所不同。
4.1.3 握手包
握手包有四種可選:
ACK: 傳輸正確完成
NAK: 設備暫時沒有準備好接收數據,或沒有準備好發送數據
STALL: 設備不能用于傳輸
NYET/ERR: 僅用于高速傳輸,設備沒有準備好或出錯
握手包僅有PID域。
4.2--事務:
分別有IN、OUT和SETUP三大事務,每一種事務都由令牌包、數據包、握手包三個階段構成,這里用階段的意思是因為這些包的發送是有一定的時間先后順序的,事務的三個階段如下:
1-令牌包階段:啟動一個輸入、輸出或設置的事務。
2-數據包階段:按輸入、輸出發送相應的數據。
3-握手包階段:返回數據接收情況,在同步傳輸的IN和OUT事務中沒有這個階段,這是比較特殊的。
事務的三種類型如下(以下按三個階段來說明一個事務):
4.2.1、 IN事務:
令牌包階段——主機發送一個PID為IN的輸入包給設備,通知設備要往主機發送數據;
數據包階段——設備根據情況會作出三種反應(要注意:數據包階段也不總是傳送數據的,根據傳輸情況還會提前進入握手包階段)。
- 設備端點正常:設備往主機里面發出數據包(DATA0與DATA1交替);
- 設備正在忙:無法往主機發出數據包就發送NAK無效包,IN事務提前結束,到了下一個IN事務才繼續;
- 相應設備端點被禁止:發送錯誤包STALL包,事務也就提前結束了,總線進入空閑狀態。
握手包階段——主機正確接收到數據之后就會向設備發送ACK包。
4.2.2、 OUT事務:
令牌包階段——主機發送一個PID為OUT的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機會往設備送數據,DATA0與DATA1交替
握手包階段——設備根據情況會作出三種反應
- 設備端點接收正確,設備給主機返回ACK,通知主機可以發送新的數據,如果數據包發生了CRC校驗錯誤,將不返回任何握手信息;
- 設備正在忙,無法給主機返回ACK,就發送NAK無效包,通知主機再次發送數據;
- 相應設備端點被禁止,發送錯誤包STALL包,事務提前結束,總線直接進入空閑狀態。
4.2.3、SETUT事務:
令牌包階段——主機發送一個PID為SETUP的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機往設備送數據,注意,這里只有一個固定為8個字節的DATA0包,這8個字節的內容就是標準的USB設備請求命令
//下面字節中含有的bit 位不同,命令也不同
{標準的USB設備請求命令是用在控制傳輸中的“初始設置步驟”里的數據包階段(即DATA0,由八個字節構成)。命令共有11個,大小都是8個字節,具有相同的結構,由5個字段構成(字段是標準請求命令的數據部分),結構如下(括號中的數字表示字節數,首字母bm,b,w分別表示位圖、字節,雙字節):
bmRequestType(1) + bRequest(1) + wvalue(2) + wIndex(2) + wLength(2)
}
握手包階段——設備接收到主機的命令信息后,返回ACK,此后總線進入空閑狀態,并準備下一個傳輸(在SETUP事務后通常是一個IN或OUT事務構成的傳輸)。
4.3 USB的四種傳輸類型:
4.3.1. 控制傳輸:
控制傳輸是一種可靠的雙向傳輸,一次控制傳輸可分為三個階段。
第一階段
為從HOST到Device的SETUP
事務傳輸,這個階段指定了此次控制傳輸的請求類型;
第二階段為數據階段
,數據過程是可選的。一個數據過程包含一筆或者多筆數據事務。數據過程的第一個數據包必須是DATA1包,然后每次正確傳輸一個數據包就在DATA0和DATA1之間交替。
第三階段為狀態階段
,狀態過程也是一筆批量事務。狀態過程只使用DATA1包。
設備枚舉過程中各種描述符的獲取以及設置地址和設置配置等,都是通過控制傳輸來實現的。
控制傳輸通過控制管道在應用軟件和 Device 的控制端點之間進行,控制傳輸過程中傳輸的數據是有格式定義的,USB 設備或主機可根據格式定義解析獲得的數據含義。
其他三種傳輸類型都沒有格式定義。
控制傳輸對于最大包長度有固定的要求。對于高速設備該值為 64Byte;對于低速設備該值為 8;全速設備可以是 8或 16或 32或 64。
最大包長度 表征了一個端點單次接收/發送數據的能力,實際上反應的是該端點對應的Buffer 的大小。Buffer 越大,單次可接收/發送的數據包越大,反之亦反。
當通過一個端點進行數據傳輸時, 若數據的大小超過該端點的最大包長度時,需要將數據分成若干個數據包傳輸,并且要求除最后一個包外,所有的包長度均等于該最大包長度。
這也就是說如果一個端點收到/發送了一個長度小于最大包長度的包,即意味著數據傳輸結束。
控制傳輸在訪問總線時也受到一些限制
如: a. 高速端點的控制傳輸不能占用超過 20%的微幀,全速和低速的則不能超過 10%。
b. 在一幀內如果有多余的未用時間,并且沒有同步和中斷傳輸,可以用來進行控制傳輸。
4.3.2. 中斷傳輸:
中斷傳輸是一種輪詢的傳輸方式,是一種單向的傳輸,HOST通過固定的間隔對中斷端點進行查詢,若有數據傳輸或可以接收數據則返回數據或發送數據,否則返回NAK,表示尚未準備好。
中斷傳輸的延遲有保證,但并非實時傳輸,它是一種延遲有限的可靠傳輸,支持錯誤重傳
對于高速/全速/低速端點,最大包長度分別可以達到1024/64/8 Bytes。
高速中斷傳輸不得占用超過 80%的微幀時間,全速和低速不得超過 90%。
中斷端點的輪詢間隔由在端點描述符中定義,全速端點的輪詢間隔可以是1255mS,低速端點為10255mS,高速端點為(2interval-1)*125uS,其中 interval取 1到 16之間的值。
除高速高帶寬中斷端點外,一個微幀內僅允許一次中斷事務傳輸,高速高帶寬端點最多可以在一個微幀內進行三次中斷事務傳輸,傳輸高達 3072 字節的數據。
所謂單向傳輸,并不是說該傳輸只支持一個方向的傳輸,而是指在某個端點上該傳輸僅支持一個方向,或輸出,或輸入。如果需要在兩個方向上進行某種單向傳輸,需要占用兩個端點,
分別配置成不同的方向,可以擁有相同的端點編號。
4.3.3. 批量傳輸:
批量傳輸是一種可靠的單向傳輸,但延遲沒有保證,它盡量利用可以利用的帶寬來完成傳輸,適合數據量比較大的傳輸。
低速 USB 設備不支持批量傳輸,高速批量端點的最大包長度為 512,全速批量端點的最大包長度可以為 8、16、32、64。
批量傳輸在訪問 USB 總線時,相對其他傳輸類型具有最低的優先級,USB HOST 總是優先安排其他類型的傳輸,當總線帶寬有富余時才安排批量傳輸。
高速的批量端點必須支持PING 操作,向主機報告端點的狀態,NYET 表示否定應答,沒有準備好接收下一個數據包,ACK 表示肯定應答,已經準備好接收下一個數據包。
4.3.4. 同步傳輸:
同步傳輸是一種實時的、不可靠的傳輸,不支持錯誤重發機制。只有高速和全速端點支持同步傳輸,高速同步端點的最大包長度為 1024,低速的為 1023。
除高速高帶寬同步端點外,一個微幀內僅允許一次同步事務傳輸,高速高帶寬端點最多可以在一個微幀內進行三次同步事務傳輸,傳輸高達 3072 字節的數據。
全速同步傳輸不得占用超過 80%的幀時間,高速同步傳輸不得占用超過 90%的微幀時間。 同步端點的訪問也和中斷端點一樣,有固定的時間間隔限制。
4.3.5 分離傳輸:
在主機控制器和 USB HUB 之間還有另外一種傳輸——分離傳輸(Split Transaction),它僅在主機控制器和 HUB之間執行,通過分離傳輸,可以允許全速/低速設備連接到高速主機。
分離傳輸對于USB 設備來說是透明的、不可見的。顧名思義就是把一次完整的事務傳輸分成兩個事務傳輸來完成。其出發點是高速傳輸和全速/低速傳輸的速度不相等,如果使用一次完整的事務來傳輸,勢必會造成比較長的等待時間,
從而降低了高速 USB 總線的利用率。通過將一次傳輸分成兩此,將令牌(和數據)的傳輸與響應數據(和握手)的傳輸分開,這樣就可以在中間插入其他高速傳輸,從而提高總線的利用率。
總結:USB的最小單元是“域”,由“域”構成了“包”,在由“包”構成了“事務”,最后由“事務”構成了“傳輸”,在應用層面,我們看到的只是傳輸,所以USB協議棧就需要完成傳輸以下的所有事情。這對標準的USB協議棧提出了最基本的要求, 優先級:同步傳輸 > 中斷傳輸>控制傳輸>批量傳輸
開發必備:
枚舉的過程實際上用到而且只用到了總線的“控制傳輸(Control Transfer)”。這種傳輸方式通常用于配置/命令/狀態等情形,其中的設置操作setup和狀態操作status過程的數據包具有USB協議定義的數據結構,因此,控制傳輸只能通過消息管道進行。
一個完整的控制傳輸包括三個過程:
1、建立連接。
2、數據過程(可選) 。
3、狀態過程。
建立連接的過程都是由Host發起,它開始于一個Setup令牌包,后面緊跟一個DATA0包。如果是控制輸入傳輸,數據過程則為輸入數據,若是控制輸出傳輸,則數據過程是輸出數據。
數據過程的可選型是指設置過程需要指定數據長度,如果指定為0,則沒有數據過程。狀態過程跟在數據過程之后,狀態過程恰好和數據過程的數據傳輸方向相反,因為此階段主要是用來確認之前兩階段的所有數據都已經正確傳輸了。
使用USB View 采集到的數據:
Device Descriptor:
bcdUSB: 0x0100
bDeviceClass: 0xDC
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x10 (16)
idVendor: 0x0471
idProduct: 0x0666
bcdDevice: 0x0100
iManufacturer: 0x00
iProduct: 0x00
iSerialNumber: 0x00
bNumConfigurations: 0x01
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Full
Device Address: 0x02
Open Pipes: 4
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Interrupt
wMaxPacketSize: 0x0010 (16)
bInterval: 0x0A
Endpoint Descriptor:
bEndpointAddress: 0x01
Transfer Type: Interrupt
wMaxPacketSize: 0x0010 (16)
bInterval: 0x0A
Endpoint Descriptor:
bEndpointAddress: 0x82
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x0A
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x0A
REF:
https://blog.csdn.net/u010142953/article/details/82627591
https://blog.csdn.net/songze_lee/article/details/77658094
https://www.cnblogs.com/qiyuexin/p/9043987.html#_label2_1