1. 原文鏈接:https://blog.csdn.net/hao507/article/details/4934964
2.原文鏈接:https://blog.csdn.net/weiaipan1314/article/details/113530649
3.原文鏈接:https://blog.csdn.net/qq_40088639/article/details/109463239
4. 轉載於:https://www.cnblogs.com/newjiang/p/9511331.html
https://blog.csdn.net/weixin_30933531/article/details/97532497
5. https://www.cnblogs.com/uiojhi/p/9466597 .html
6.USB協議詳解第14講(USB傳輸-同步傳輸及事務組成)_一個早起的程序員-CSDN博客_usb同步傳輸
7.(1條消息) USB 協議分析(含基本協議和 USB 請求和設備枚舉)_StephenZhou-CSDN博客_usb協議分析
8.《圈圈教你玩USB》
8.1.第一章 :https://blog.csdn.net/sz189981/article/details/62072621
8.2.第二章:https://blog.csdn.net/sz189981/article/details/62238094
8.3.第三章:https://blog.csdn.net/sz189981/article/details/65029809
1.1 USB是什么
1. USB是什么:
USB是通用串行總線(Universan Serial Bus)的縮寫。
2. USB出現的原因:
1)支持熱插拔,並且即插即用(PnP:Plug and Play);
2)有很強的可擴展性,速度也很快。
3.USB協議版本:
1.0、1.1、2.0等
4.通信結構:
主從模式結構,設備與設備、主機與主機之間不能互連。
5.USB OTG(On The Go):
同一個設備,在不同場合下可以在主機和從機之間切換。
主從標志:USB OTG增加了一種MINI USB接頭,比普通的4線USB多一根ID標識線,用來表明它是主機還是設備。
1.2 USB的特點
1. 速度:
USB1.0和1.1版本中,只支持1.5Mb/s的低速(low-speed)模式和12Mb/s的全速(full-speed)模式。
USB2.0中,又加入了速度更快(480Mb/s)的高速(high-speed)模式。
USB3.0中,5.0Gb/s。
注:USB2.0並不一定都是高速設備,因為USB2.0協議對設備的高速模式不是強制的,而是可選的。例如PDIUSBD12,符合USB2.0協議,但不支持 高速模式,只支持12Mb/s的全速模式。
2. 優點:
即插即用、容易使用、方便攜帶、傳輸速度快、可擴展性強、標准統一、價格便宜等。
3. 缺點:
傳輸距離短、開發調試難度大等。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
USB2.0的開發與設置主要包括三部分
第一:基於keil 的USB2.0的固件開發,這里主要是借用黑金開發板516上面自帶的固件進行相關的設置預配置;
第二:是基於C# 或者C++對於USB2.0的上位機的開發;
第三:主要是基於FPGA的對於USB2.0的同步傳輸。
USB On-The-Go 擴大了USB 的應用領域,將USB 從傳統的PC 與外設通訊的模式,擴展到移動電子和嵌入式領域中,拋開主機PC,實現通常的外設與外設之間點對點(Point to Point)的數據傳輸模式。
1 什么是USB On-The-Go
我們先來回顧一下通用串行總線(Universal Serial Bus,簡稱為USB)發展的歷史:
i)1994 年11 月,以Intel 為首的7 家公司(Intel、Compaq、Microsoft、IBM、DEC、Northern Telecom 和NEC)推出了USB 協議的第一個草案,USB 作為一種新型的串行總線,揭開了新一輪的USB 總線的革命,但這時,USB 並不為計算機技術人員所熟知;
ii)1996 年2 月,USB 協議規范1.0 版本發布,版權屬於Compaq、Intel、Microsoft和NEC 等4 家公司,並同意任何人可免費使用。自此,USB 開始逐漸被廣大技術人員和用戶所認可,並逐漸開始成為PC 主板上的標准接口;
iii)1998 年10 月,USB 1.1 版本發布,集中修訂了USB 1.0 中的問題,並進一步突出了USB 的優勢。到目前,USB 1.1 仍是開發USB 低速(1.5Mbps,Low-Speed)和全速(12Mbps,Full-Speed)設備的標准版本。
USB 的低功耗、速度高、成本低、支持即插即用和維護方便等優勢更加穩定,USB 開始成為鼠標、鍵盤、游戲桿、打印機、光驅、硬盤、顯示器和數碼相機等幾乎各種PC 外設與PC 連接的標准協議之一。
各種USB 的外設產品如雨后春筍般出現,如USB Flash 讀卡器、USB 移動硬盤、USB 數碼相機、USB 鍵盤等,幾乎所有的PC 外設都有相應的USB 接口的產品。一時間,USB 成為了最為流行的PC 接口標准,嵌入式軟硬件工程師也將USB 應用到自己的設計之中;
iv)2000 年4 月,Compaq、HP、Intel、Lucent、Microsoft、NEC 和Philips 等7 家公司聯合發布USB 2.0 協議規范版本。新版本最大的變化就是將USB 的總線速度一下子提高到了480Mbps,即開始支持高速設備(High-Speed)。
由此,USB 翻開了新的一頁,徹底打破了USB 應用在視頻等高速傳輸領域中的速度瓶頸,大大擴展了USB 應用領域。從低速的鼠標、鍵盤,到全速的硬盤,再到高速的視頻傳輸,USB 幾乎無所不能,可以應用到任何一種PC 外設中。
USB 取代串口、並口等傳統PC 接口只是個時間問題了。
從問世,到協議規范2.0 版本,USB 不斷在自我完善,走向成熟。從普通計算機用戶,計算機工程師,到硬件芯片生產廠商,都已經完全認可了USB。廠商對於USB 的硬件和軟件支持的也越來越完備,
現在開發一個USB 外設產品,所需要投入的成本和時間大大降低了,幾年前是沒有辦法做到這一點的。但是,隨着USB 應用領域的逐漸擴大,人們對於USB的期望也越來越高,希望USB 能應用在各種計算機領域中,
尤其是在移動通訊領域中,希望能通過PDA 等移動設備來直接和USB 外設通信,使得USB 能應用在沒有PC 的領域中。非PC 應用領域?這正是USB 一個致命的弱點。USB 的拓撲結構中居於核心地位的是Host,
任何一次USB 的數據傳輸都必須由Host 來發起和控制,所有的USB 外設都只能和Host 建立連接,任何兩個外設之間或是兩個Host 之間無法直接通信。而目前,大量的扮演Host 角色的是個人電腦PC。
因此,“如何將USB 應用到嵌入式領域?如何實現USB 點對點的通訊?”等問題,開始進入了USB 開發者的討論議程。正是在這種新的需求之下,USB On-The-Go 應運而生。2001 年12 月,USB On-The-Go 版本協議1.0 正式發布(簡寫為OTG 1.0)。
USB On-The-Go,顧名思義,是USB 應用在便攜式移動設備領域中,因此,我們姑且將其翻譯為“便攜式USB”(或者“移動USB”),簡記成USB OTG。OTG 1.0 作為USB 2.0的補充協議,基本上符合USB 2.0 規范。
但是,有所不同的是符合USB OTG 的設備完全拋開了PC,既可以作為Host,也可以作為外設,而與另一個OTG 設備直接實現點對點(Pear to Pear)通訊。因此,這類OTG 設備也被成為是雙角色設備(Dual-Role Device,簡稱為DRD),
並能夠根據接入設備的特性和數據傳輸過程中的情況,自動切換為Host 或是外設。例如,一個OTG 數碼相機可以直接與OTG 打印機相連,打印圖片;兩個OTG MP3 播放器可以之間連在一起,實現音樂文件的共享需要注意的是,
USB OTG 設備保留了作為普通USB 2.0 外設的功能,可以作為外設直接連接到PC Host 上。
2 USB OTG 設備的功能
USB OTG 定義了兩種設備類型:雙角色設備DRD 和單外部設備(Peripheral-OnlyDevice,簡稱為POD)。DRD 具備Host 和外設的兩種功能,POD 基本與外設功能近似,因此,我們這里着重討論DRD。
要成為一個USB Host,必須具有存儲外設驅動程序、提供足夠的USB 端口電流和A型Host 插座的能力。而其所要實現的基本功能包括3 部分:
i)管理和控制總線,包括提供USB 端口電源管理;
ii)檢測外設的接入和斷開,枚舉(Enumerate)設備;
iii)初始化總線上所有的數據包傳輸等活動。
同樣,USB 外設也具有特定的功能:
i)響應USB Host 的命令,執行又Host 發起的發送設備描述符、傳送數據等活動;
ii)遠程喚醒處於掛起(Suspend)狀態的主機;
iii)提供自供電(Self-Powered)電源(如果所需電流大於總線能提供的限額,選此項)。
DRD 具有USB Host 和外設的雙重功能,但是,正因為具有了雙重的角色任務,DRD又必須有切換角色等新的任務和功能,因此,我們可以用(1)式來簡單的定義OTG DRD的功能:
DRD = Host + Peripheral + OtherLL(1)
由(1)式可知,完整的USB OTG DRD 還必須具有除了通常的Host 和外設之外的一些功能,當然DRD 的Host 功能是有限的,不要求完全實現PC Host 的功能,不過,這正符合了嵌入式領域中對USB 靈活性和便攜性的要求:
i)作為外設,支持12Mbps 的全速模式(或者是480Mbps 的高速模式);
ii)作為Host,也支持全速模式(或者是低速和高速模式);
iii)產生目標外設列表(Targeted Peripheral List,簡寫為TPL);
iv)會話請求協議(Session Request Protocol,簡寫為SRP);
v)主機交流協議(Host Negotiation Protocol,簡寫為HNP);
vi)有且僅有1 個Mini-AB 插座;
vii)至少為總線提供8mA 的電流;
viii)能及時將總線活動狀態通知給設備用戶。
3 USB OTG 體系的軟件描述
3.1 OTG 配置描述符
在OTG 系統處於枚舉過程時,A 設備就會發送GetDescriptor 命令給B 設備(開始處於外設狀態的設備),要求B 設備發送OTG 配置描述符。配置描述符包括3 個字節,分別是bLength、bDescriptorType 和bmAttributes。
3.2 會話請求協議(Session Request Protocol,簡寫為SRP)
SRP 用於B 設備向A 設備請求建立會話和使用總線。
一般,OTG 系統中的A 設備采用的是電池供電,因為這些設備是便攜式和可移動的,這就決定了,OTG 系統電源管理是非常重要的一個專題。因此,為了節省OTG 系統的電源開支,OTG 2.0 規定A 設備在沒有總線活動的時候,可以關掉VBus 上的電源。這樣,當一個B 設備連接到A 設備上之后,就要初始化SRP,並發送給A 設備,請求A 設備在VBus上提供電流支持,進而進行通信。OTG 中,DRD 可以作為A 設備,也可以作為B 設備,因此,DRD 必須支持初始化SRP 和響應SRP;POD 只能作B 設備,所以,只能初始化SRP。SRP 中,B 設備有兩種方式可以向A 設備發送請求,要求建立SRP:一種是數據線脈沖(Data-Line Pulsing),一種是VBus 脈沖(VBus Pulsing)。具體的脈沖方法在OTG 2.0 中有詳細的說明。任何一個A 設備只要求能響應一種SRP 方式,而B 設備必須能初始化兩種SRP方式。這樣,當B 設備先初始化一種SRP,而A 設備無法響應是,則B 設備就要用另一種SRP 方式。
3.3 主機交流協議(Host Negotiation Protocol,簡寫為HNP)
HNP 用於初始B 設備與初始A 設備之間切換Host 角色。
OTG DRD 具有Mini AB 型插座,因此,DRD 既可作為Host,也可以作為外設。而在某一個OTG 連接中,這個DRD 到底是作Host(即A 設備),還是作外設(即B 設備),則要根據接入的另一個OTG 設備來定。如果,接入的是OTG POD,那么,毫無疑問,這個DRD 肯定是作A 設備。但,如果接入的是另一個DRD,那么這兩個DRD 之間,就可以HNP來隨時切換Host 角色。
一次完整的HNP 流程是這樣的:B 設備希望控制總線,成為Host;在A 設備發送了SetFeature 命令后,B 設備就可以來請求控制總線;A 設備掛起總線,通知B 設備可以控制總線;B 設備發送信號,斷開與A 設備的連接;A 設備啟動D+信號線上的上拉電阻,將D+置高;這樣,A 設備就開始作為外設,放棄了總線的控制權,B 設備成為了Host;在B設備完成了對總線的控制,就需要上拉其上的D+電阻,放棄總線控制權。當然,這一系列的HNP 活動,不僅僅是通過信號線上的電平變化來實現的。電平變化只是一種標志,真正內部對總線的控制權的變化,則要通過軟件來實現。
3.4 OTG 的軟件結構
OTG 的軟件結構包括3 部分:
i)OTG 系統硬件驅動:包括SRP 和HNP;
ii)OTG 系統外設軟件:實現標准的USB 類,來實現特定的USB 外設功能;
iii)OTG 系統Host 軟件:包括Host 驅動程序、操作系統支持軟件、支持外設的類庫。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.1、概述
一條USB傳輸線分別由地線、電源線、D+和D-四條線構成,D+和D-是差分輸入線,它使用的是3.3V的電壓(與CMOS的5V電平不同),而電源線和地線可向設備提供5V電壓,最大電流為500mA(可以在編程中設置)。
USB設備可以直接和HOST通信,或者通過Hub和Host通信。一個USB系統中僅有一個USB 主機,設備包括USB功能設備和USB HUB,最多支持127個設備。物理連接指的是USB傳輸線。在USB 2.0系統中要求使用屏蔽雙絞線。
1.2、USB HUB
USB HUB提供了一種低成本、低復雜度的USB接口擴展方法。HUB的上行PORT面向HOST,下行PORT面向設備(HUB或功能設備)。在下行PORT上,HUB提供了設備連接檢測和設備移除檢測的能力,並給各下行PORT供電。HUB可以單獨使能各下行PORT。不同PORT可以工作在不同的速度等級(高速/全速/低速)。
如果USB設備通過集線器和Host通信,主機集線器監視着每個端口的信號電壓,當有新設備接入時便可覺察。集線器端口的兩根信號線的每一根都有15kΩ的下拉電阻,而每一個設備在D+都有一個1.5kΩ的上拉電阻。當用USB線將PC和設備接通后,設備的上拉電阻使信號線的電位升高,因此被主機集線器檢測到。
二、USB數據格式
USB的重要關鍵字:
端點(Endpoint):位於USB設備或主機上的一個數據緩沖區,是USB設備中可以進行數據收發的最小單元,支持單向或者雙向的數據傳輸,用來存放和發送USB的各種數據,每一個端點都有惟一的確定地址,有不同的傳輸特性(如輸入端點、輸出端點、配置端點、批量傳輸端點)。設備支持端點的數量是有限制的,除默認端點外低速設備最多支持2組端點(2 個輸入,2 個輸出),高速和全速設備最多支持15組端點。
幀:時間概念,在USB中,一幀就是1MS,它是一個獨立的單元,包含了一系列總線動作,USB將1幀分為好幾份,每一份是一個USB的傳輸動作。
上行、下行:設備到主機為上行,主機到設備為下行。
2.1、USB數據傳輸方法
數據在USB線里傳送是由低位到高位發送的。
USB采用不歸零取反來傳輸數據,當傳輸線上的差分數據輸入0時就取反,輸入1時就保持原值,為了確保信號發送的准確性,當在USB總線上發送一個包時,傳輸設備就要進行位插入操作(即在數據流中每連續6個1后就插入一個0),從而強迫NRZI碼發生變化。這些是由專門硬件處理的。
2.2、數據格式
USB數據是由二進制數字串構成的,首先數字串構成域(有七種),域再構成包,包再構成事務(IN、OUT、SETUP),事務最后構成傳輸(中斷傳輸、並行傳輸、批量傳輸和控制傳輸)。下面介紹一下域、包和事務。
2.2.1、域
域是USB數據最小的單位,由若干位組成(多少位由具體的域決定),域可分為七個類型:
1、同步域(SYNC)
所有的USB包都由SYNC開始,高速包的SYNC寬度為32bit,全速/低速包的SYNC段度為8bit。實際接收到的SYNC長度由於USB HUB的關系,可能會小於該值。八位的值固定為0000 0001,用於本地時鍾與輸入同步。
2、標識域(PID)
由四位標識符 + 四位標識符反碼構成,表明包的類型和格式,這是一個很重要的部分,這里可以計算出,USB的標識碼有16種。USB2.0使用了十六種標識碼,標識碼的作用是用來說明包的屬性的,標識碼是和包聯系在一起的,標識碼分別有以下十六種:
令牌包 :
0x01:輸出(OUT)啟動一個方向為主機到設備的傳輸,並包含了設備地址和標號。
0x09:輸入(IN) 啟動一個方向為設備到主機的傳輸,並包含了設備地址和標號。
0x05:幀起始(SOF)表示一個幀的開始,並且包含了相應的幀號。
0x0d:設置(SETUP)啟動一個控制傳輸,用於主機對設備的初始化。
數據包 :
0x03:偶數據包(DATA0)。
0x0b:奇數據包(DATA1)。
握手包:
0x02:確認接收到無誤的數據包(ACK)。
0x0a:無效,接收(發送)端正在忙而無法接收(發送)信息。
0x0e:錯誤,端點被禁止或不支持控制管道請求。
特殊包0x0C前導,用於啟動下行端口的低速設備的數據傳輸。
3、地址域(ADDR):七位地址,代表了設備在主機上的地址,地址000 0000被命名為零地址,是任何設備第一次連接到主機時,在被主機配置、枚舉前的默認地址,由此可以知道為什么一個USB主機只能接127個設備的原因。
4、端點域(ENDP),四位,由此可知一個USB設備端點數量最大為16個。
5、幀號域(FRAM),11位,每一個幀都有一個特定的幀號,幀號域最大容量0x800,對於同步傳輸有重要意義。
6、數據域(DATA):長度為0~1023字節,在不同的傳輸類型中,數據域的長度各不相同,但必須為整數個字節的長度。
7、校驗域(CRC):對令牌包和數據包中非PID域進行校驗的一種方法,CRC校驗在通訊中應用很泛,是一種很好的校驗方法,CRC碼的除法是模2運算,不同於10進制中的除法。
2.2.2、包
USB數據包的格式如下:
由域構成的包有四種類型,分別是令牌包、數據包、握手包和特殊包,前面三種是重要的包,不同包的域結構不同,介紹如下:
1、令牌包
分為輸入包、輸出包、設置包和幀起始包(注意這里的輸入包是用於設置輸入命令的,輸出包是用來設置輸出命令的,而不是放數據的)其中輸入包、輸出包和設置包的格式都是一樣的:
SYNC + PID + ADDR + ENDP + CRC5(五位的校驗碼)
幀起始包的格式:
SYNC + PID + 11位FRAM + CRC5(五位的校驗碼)
2、數據包
分為DATA0包和DATA1包,當USB發送數據的時候,如果一次發送的數據長度大於相應端點的容量時,就需要把數據包分為好幾個包,分批發送,DATA0包和DATA1包交替發送,即如果第一個數據包是DATA0,那第二個數據包就是DATA1。但也有例外情況,在同步傳輸中(四類傳輸類型中之一),所有的數據包都是為DATA0,格式如下:
SYNC + PID + 0~1023字節 + CRC16
3、握手包
結構最為簡單的包,格式如下:
SYNC + PID
握手包包括 ACK、NAK、STALL以及NYET 四種,其中 ACK 表示肯定的應答,成功的數據傳輸。NAK 表示否定的應答,失敗的數據傳輸,要求重新傳輸。STALL表示功能錯誤或端點被設置了STALL屬性。NYET表示尚未准備好,要求等待。
2.2.3、事務
分別有IN、OUT和SETUP三大事務,每一種事務都由令牌包、數據包、握手包三個階段構成,這里用階段的意思是因為這些包的發送是有一定的時間先后順序的,事務的三個階段如下:
1、令牌包階段:啟動一個輸入、輸出或設置的事務。
2、數據包階段:按輸入、輸出發送相應的數據。
3、握手包階段:返回數據接收情況,在同步傳輸的IN和OUT事務中沒有這個階段,這是比較特殊的。
事務的三種類型如下(以下按三個階段來說明一個事務):
1、 IN事務:
令牌包階段——主機發送一個PID為IN的輸入包給設備,通知設備要往主機發送數據;
數據包階段——設備根據情況會作出三種反應(要注意:數據包階段也不總是傳送數據的,根據傳輸情況還會提前進入握手包階段)。
1) 設備端點正常:設備往主機里面發出數據包(DATA0與DATA1交替);
2) 設備正在忙:無法往主機發出數據包就發送NAK無效包,IN事務提前結束,到了下一個IN事務才繼續;
3) 相應設備端點被禁止:發送錯誤包STALL包,事務也就提前結束了,總線進入空閑狀態。
握手包階段——主機正確接收到數據之后就會向設備發送ACK包。
2、 OUT事務:
令牌包階段——主機發送一個PID為OUT的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機會往設備送數據,DATA0與DATA1交替
握手包階段——設備根據情況會作出三種反應
1) 設備端點接收正確,設備給主機返回ACK,通知主機可以發送新的數據,如果數據包發生了CRC校驗錯誤,將不返回任何握手信息;
2) 設備正在忙,無法給主機返回ACK,就發送NAK無效包,通知主機再次發送數據;
3) 相應設備端點被禁止,發送錯誤包STALL包,事務提前結束,總線直接進入空閑狀態。
3、SETUT事務:
令牌包階段——主機發送一個PID為SETUP的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機往設備送數據,注意,這里只有一個固定為8個字節的DATA0包,這8個字節的內容就是標准的USB設備請求命令,詳見2.4。
握手包階段——設備接收到主機的命令信息后,返回ACK,此后總線進入空閑狀態,並准備下一個傳輸(在SETUP事務后通常是一個IN或OUT事務構成的傳輸)。
2.3、標准的USB設備請求命令
標准的USB設備請求命令是用在控制傳輸中的“初始設置步驟”里的數據包階段(即DATA0,由八個字節構成)。命令共有11個,大小都是8個字節,具有相同的結構,由5個字段構成(字段是標准請求命令的數據部分),結構如下(括號中的數字表示字節數,首字母bm,b,w分別表示位圖、字節,雙字節):
bmRequestType(1) + bRequest(1) + wvalue(2) + wIndex(2) + wLength(2)
各字段的意義如下:
1、bmRequestType:D7D6D5D4D3D2D1D0
D7=0主機到設備
=1設備到主機;
D6D5=00標准請求命令
=01 類請求命令
=10用戶定義的命令
=11保留值
D4D3D2D1D0=00000 接收者為設備
=00001 接收者為設備
=00010 接收者為端點
=00011 接收者為其他接收者
=其他 其他值保留
2、bRequest:請求命令代碼,在標准的USB命令中,每一個命令都定義了編號,編號的值就為字段的值,編號與命令名稱如下(要注意這里的命令代碼要與其他字段結合使用,可以說命令代碼是標准請求命令代碼的核心,正是因為這些命令代碼而決定了11個USB標准請求命令):
0 GET_STATUS:用來返回特定接收者的狀態;
1 CLEAR_FEATURE:用來清除或禁止接收者的某些特性;
2) 3 SET_FEATURE:用來啟用或激活命令接收者的某些特性;
5 SET_ADDRESS:用來給設備分配地址;
6 GET_DEscriptOR:用於主機獲取設備的特定描述符;
7 SET_DEscriptOR:修改設備中有關的描述符,或者增加新的描述符;
8 GET_CONFIGURATION:用於主機獲取設備當前設備的配置值(注同上面的不同);
9 SET_CONFIGURATION:用於主機指示設備采用的要求的配置;
10 GET_INTERFACE:用於獲取當前某個接口描述符編號;
11 SET_INTERFACE:用於主機要求設備用某個描述符來描述接口;
12 SYNCH_FRAME:用於設備設置和報告一個端點的同步幀;
控制傳輸是USB的重心,而這11個命令是控制傳輸的重心,所以這11個命令是重中之重。
2.4、描述符(Descriptor)
Descriptor是一個完整的數據結構,可以通過C語言等編程實現,並存儲在USB設備中,用於描述一個USB設備的所有屬性,USB主機是通過一系列命令來要求設備發送這些信息的。它的作用就是給主機傳遞信息,從而讓主機知道設備具有什么功能、屬於哪一類設備、要占用多少帶寬、使用哪類傳輸方式及數據量的大小,只有主機確定了這些信息之后,設備才能真正開始工作,所以描述符也是十分重要的部分,標准的描述符有5種,USB為這些描述符定義了編號:
1——設備描述符
2——配置描述符
3——字符描述符
4——接口描述符
5——端點描述符
上面的描述符之間有一定的關系,一個設備只有一個設備描述符,而一個設備描述符可以包含多個配置描述符,而一個配置描述符可以包含多個接口描述符,一個接口使用了幾個端點,就有幾個端點描述符。這些描述符是用一定的字段構成的,分別如下說明:
1、設備描述符
struct _DEVICE_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,為0x12
BYTE bDescriptorType; //描述符類型編號,為0x01
WORD bcdUSB; //USB版本號
BYTE bDeviceClass; //USB分配的設備類代碼,0x01~0xfe為標准設備類,0xff為廠商自定義類型
//0x00不是在設備描述符中定義的,如HID
BYTE bDeviceSubClass; //usb分配的子類代碼,同上,值由USB規定和分配的
BYTE bDeviceProtocl; //USB分配的設備協議代碼,同上
BYTE bMaxPacketSize0; //端點0的最大包的大小
WORD idVendor; //廠商編號
WORD idProduct; //產品編號
WORD bcdDevice; //設備出廠編號
BYTE iManufacturer; //描述廠商字符串的索引
BYTE iProduct; //描述產品字符串的索引
BYTE iSerialNumber; //描述設備序列號字符串的索引
BYTE bNumConfiguration; //可能的配置數量
}
2、配置描述符
struct _CONFIGURATION_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,為0x12
BYTE bDescriptorType; //描述符類型編號,為0x01
WORD wTotalLength; //配置所返回的所有數量的大小
BYTE bNumInterface; //此配置所支持的接口數量
BYTE bConfigurationVale; //Set_Configuration命令需要的參數值
BYTE iConfiguration; //描述該配置的字符串的索引值
BYTE bmAttribute; //供電模式的選擇
BYTE MaxPower; //設備從總線提取的最大電流
}
3、字符描述符
struct _STRING_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,為0x12
BYTE bDescriptorType; //描述符類型編號,為0x01
BYTE SomeDescriptor[36]; //UNICODE編碼的字符串
}
4、接口描述符
struct _INTERFACE_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,為0x12
BYTE bDescriptorType; //描述符類型編號,為0x01
BYTE bInterfaceNunber; //接口的編號
BYTE bAlternateSetting;//備用的接口描述符編號
BYTE bNumEndpoints; //該接口使用端點數,不包括端點0
BYTE bInterfaceClass; //接口類型
BYTE bInterfaceSubClass;//接口子類型
BYTE bInterfaceProtocol;//接口所遵循的協議
BYTE iInterface; //描述該接口的字符串索引值
}
5、端點描述符
struct _ENDPOIN_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,為0x12
BYTE bDescriptorType; //描述符類型編號,為0x01
BYTE bEndpointAddress; //端點地址及輸入輸出屬性
BYTE bmAttribute; //端點的傳輸類型屬性
WORD wMaxPacketSize; //端點收、發最大包的大小
BYTE bInterval; //主機查詢端點的時間間隔
}