【STM32F407】第5章 ThreadX USBX各種USB描述符簡介
教程更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=108546
第5章 ThreadX USBX各種USB描述符簡介
本章節為大家講解USB的各種描述符。
5.1初學者重要提示
5.2 USB描述符概述
5.3 USB裝置描述符
5.4 USB配置描述符
5.5 USB介面描述符
5.6 USB端點描述符
5.7 USB字串描述符
5.8 USB裝置限定符描述符
5.9 總結
5.1 初學者重要提示
1、 USB1.1和USB2.0規格書以及Cypress做的中文版USB文件,非常推薦大家學習:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100698
2、 USB初學 -- 入門篇 (USB基礎知識速覽)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100687 。
3、 文獻參考:
https://en.wikipedia.org/wiki/USB
https://zh.wikipedia.org/wiki/USB
https://en.wikipedia.org/wiki/USB_hardware
5.2 USB描述符概述(USB Descriptors)
USB裝置使用描述符報告其屬性,描述符是具有定義格式的資料結構。每個描述符都以一個位元組寬的欄位開始,該欄位包含描述符中位元組的總數,然後是一個標識描述符型別的欄位。
將USB裝置連線到USB匯流排時,主機通過匯流排列舉來識別和配置裝置。裝置加入USB網路後,USB主機立即傳送設定請求。將指示該裝置選擇配置和介面,以匹配USB主機上執行的應用程式需求。選擇配置和介面後,裝置必須為活動的端點提供服務,以此與USB主機交換資料。
常用的描述符主要有:
- 裝置描述符(Device Descriptor)
- 配置描述符(Configuration Descriptor)
- 介面描述符(Interface Descriptor)
- 一個或多個端點描述符(Endpoint Descriptor)
- 字串描述符(String Descriptor)
字串描述符是另一種可選的描述符,它為使用者提供了有關裝置的可讀資訊。
- 裝置限定符描述符(Device Qualifier Descriptor)
它提供了支援高速效能的裝置資訊,該資訊會根據裝置的不同執行速度而不同。
- 複雜裝置具有多個介面。每個介面可以有多個端點。例如,IP語音電話可能具有:
A. 一個音訊類介面,帶有2個同步端點,用於在每個方向上傳輸音訊資料。
B. 一個HID介面,帶有一個用於內建鍵盤的IN中斷端點。
RL-USB支援使用者在必要時可以選擇覆蓋USB描述符。當需要在執行時更改裝置類或需要建立其他報告時,可能就是這種情況。
5.3 USB裝置描述符(Device Descriptor)
裝置描述符為主機提供了許多資訊,如裝置需要滿足的USB規範、裝置配置編號、裝置支援的協議、供應商標識(idVendor又稱為VID,每個公司只能從USB-IF獲得唯一的VID)、產品標識(idProduct又稱為PID,與資料包ID不同)和一個序列號(如果裝置有)。 裝置描述符包含了 USB 裝置的重要資訊。
5.4 USB配置描述符(Configuration Descriptor)
該配置描述符包含有關裝置的功率需求,它可以支援的介面數量。一個裝置可以具有多種配置,主機可以選擇最符合應用軟體要求的配置。
5.5 USB介面描述符(Interface Descriptor)
介面描述符(USB_INTERFACE_DESCRIPTOR)定義的端點的集合。該介面支援適用於特定任務的一組管道。每個配置可以具有多個介面。USB主機可以動態選擇介面。
介面描述符永遠不會在端點編號中包含端點0。如果介面僅使用端點0,則必須將欄位bNumEndpoints設定為零。如果沒有為裝置選擇任何類別,則不會載入任何標準USB驅動程式,並且開發人員必須提供自己的裝置驅動程式。
例如,需要兩個具有不同介面的裝置。
第一個介面Interface0的bInterfaceNumber欄位設定為0。
下一個介面Interface1的bInterfaceNumber欄位設定為1,
bAlternativeSetting欄位也設定為0(預設)。通過將欄位bInterfaceNumber設定為1並將欄位bAlternativeSetting設定為1而不是0 ,可以為此裝置定義替代設定。使用bAlternativeSettings等於0的前兩個介面描述符。但是,主機可以傳送SetInterface()請求以啟用替代設定。
5.6 USB端點描述符(Endpoint Descriptor)
端點描述符(USB_ENDPOINT_DESCRIPTOR)為每個端點指定傳輸型別,方向,輪詢間隔,以及最大分組大小。端點0(預設端點)始終被假定為控制端點,並且從不包含描述符。
5.7 USB字串描述符(String Descriptor)
字串描述符(USB_STRING_DESCRIPTOR)是可選的,並將可讀資訊新增到其他描述符中。如果裝置不支援字串描述符,則必須將裝置,配置和介面描述符中對字串描述符的所有引用都設定為零。
字串描述符以Unicode編碼,因此單個產品可以支援多種語言。請求字串描述符時,請求者使用USB-IF定義的16位語言ID(LANGID)指定所需的語言(詳情請參閱語言識別符號(LANGID))。字串索引零用於所有語言,並返回一個字串描述符,該描述符包含裝置支援的兩位元組LANGID程式碼的陣列。
LANGID程式碼的陣列不是以NULL結尾的。陣列的大小(以位元組為單位)是通過描述符的第一個位元組的值減去2而得出的。
UNICODE字串描述符不是以NULL結尾的。字串長度是通過從描述符的第一個位元組的值中減去2來計算的。
5.8 USB裝置限定符描述符(Qualifier Descriptor)
具有全速和高速裝置資訊不同的高速裝置必須具有裝置限定符描述符(USB_DEVICE_QUALIFIER_DESCRIPTOR)。例如,如果裝置當前以全速執行,則裝置限定符將返回有關如何以高速執行的資訊,反之亦然。不包括供應商,產品,裝置,製造商和序列號的欄位。無論支援的速度如何,此資訊對於裝置而言都是恆定的。
如果全速裝置接收GetDescriptor()請求device_qualifier,它必須迴應錯誤請求。然後,主機不得請求other_speed_configuration描述符。
5.9 總結
本章就為大家介紹這麼多,後面的應用設計中,描述符用到的地方很多,需要大家熟練掌握。