<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > USB的描述符及各種描述符之間的依賴關(guān)系

          USB的描述符及各種描述符之間的依賴關(guān)系

          作者: 時(shí)間:2016-12-15 來源:網(wǎng)絡(luò) 收藏
          USB的描述符及各種描述符之間的依賴關(guān)系.USB是個(gè)通用的總線,端口都是統(tǒng)一的。但是USB設(shè)備卻各種各樣,例如USB鼠標(biāo),USB鍵盤,U盤等等,那么USB主機(jī)是如何識別出不同的設(shè)備的呢?這就要依賴于描述符了。

          USB的描述符主要有設(shè)備描述符,配置描述符,接口描述符,端點(diǎn)描述符,字符串描述符,HID描述符,報(bào)告描述符等等。

          本文引用地址:http://www.ex-cimer.com/article/201612/330287.htm

          設(shè)備描述符記錄的信息:設(shè)備所使用的USB協(xié)議版本號,設(shè)備類型,端點(diǎn)0的最大包大小,廠商ID(VID)和產(chǎn)品(PID),設(shè)備版本號,廠商字符串索引,產(chǎn)品字符串索引,設(shè)備序列號索引,可能的配置數(shù)等.

          配置描述符記錄的信息:配置所包含的接口數(shù),配置的編號,供電方式,是否支持遠(yuǎn)程喚醒,電流需求量等.

          接口描述符記錄的信息:接口的編號,接口的端點(diǎn)數(shù),接口所使用的類,子類,協(xié)議等.

          端點(diǎn)描述符記錄的信息:端點(diǎn)號及方向,端點(diǎn)的傳輸類型,最大包長度,查詢時(shí)間間隔等.

          字符串描述符記當(dāng)?shù)男畔?提供一些方便人們閱讀的信息,它不是必需的.

          一個(gè)USB設(shè)備有一個(gè)設(shè)備描述符,設(shè)備描述符里面決定了該設(shè)備有多少種配置,每種配置描述符對應(yīng)著配置描述符;而在配置描述符中又定義了該配置里面有多少個(gè)接口,每個(gè)接口有對應(yīng)的接口描述符;在接口描述符里面又定義了該接口有多少個(gè)端點(diǎn),每個(gè)端點(diǎn)對應(yīng)一個(gè)端點(diǎn)描述符;端點(diǎn)描述符定義了端點(diǎn)的大小,類型等等。由此我們可以看出,USB的描述符之間的關(guān)系是一層一層的,最上一層是設(shè)備描述符,下面是配置描述符,再下面是接口描述符,再下面是端點(diǎn)描述符。在獲取描述符時(shí),先獲取設(shè)備描述符,然后再獲取配置描述符,根據(jù)配置描述符中的配置集合長度,一次將配置描述符、接口描述符、端點(diǎn)描述符一起一次讀回。其中可能還會(huì)有獲取設(shè)備序列號,廠商字符串,產(chǎn)品字符串等。

          舉個(gè)例子說明它們之間的關(guān)系:8號教學(xué)樓的808教室.8號樓就是設(shè)備,而808或其它教室就是端點(diǎn).而配置和接口,是為了方便管理端點(diǎn)而抽象出來的概念.一個(gè)設(shè)備可以有多個(gè)配置,但是同一時(shí)刻只能有一個(gè)配置有效.每個(gè)配置下又可有很多接口.當(dāng)我們需要不同的功能時(shí),只要選擇不同的配置即可.如我們把教學(xué)樓分為兩個(gè)配置:平時(shí)上課用和期末考試用。當(dāng)我們做為考試用時(shí),要將所有的教室都用上。即該配置下只有一個(gè)接口,接口下有很多端點(diǎn)--教室。而平時(shí)上課用時(shí),把教室分為兩類,即兩個(gè)接口。一類是教師休息室,有N個(gè)教室(即該接口有N個(gè)端點(diǎn)),一類上課的課室,有M個(gè)教室(即該接口有M個(gè)端點(diǎn))。教師休息室和課室是不能共用的(在USB中也是如此,同一個(gè)端點(diǎn)號不能出現(xiàn)在同一個(gè)配置下的兩個(gè)或多個(gè)不同的接口中).但是教師休息室和課室在考試用時(shí)都可以當(dāng)做考場(這在USB中也是如此,同一個(gè)端點(diǎn)號可用在不同的配置中)。

          每種描述符都有自己獨(dú)立的編號,如下:
          #define DEVICE_DESCRIPTOR0x01//設(shè)備描述符
          #define CONFIGURATION_DESCRIPTOR0x02//配置描述符
          #define STRING_DESCRIPTOR0x03//字符串描述符
          #define INTERFACE_DESCRIPTOR0x04//接口描述符
          #define ENDPOINT_DESCRIPTOR0x05//端點(diǎn)描述符

          下面分別詳細(xì)介紹一下各描述符。

          1.設(shè)備描述符

          //定義標(biāo)準(zhǔn)的設(shè)備描述符結(jié)構(gòu)

          typedef struct _DEVICE_DCESCRIPTOR_STRUCT
          {
          BYTE blength;//設(shè)備描述符的字節(jié)數(shù)大小
          BYTE bDescriptorType;//設(shè)備描述符類型編號
          WORD bcdUSB;//USB版本號
          BYTE bDeviceClass;//USB分配的設(shè)備類代碼
          BYTE bDeviceSubClass;//USB分配的子類代碼
          BYTE bDeviceProtocol;//USB分配的設(shè)備協(xié)議代碼
          BYTE bMaxPacketSize0;//端點(diǎn)0的最大包大小
          WORD idVendor;//廠商編號
          WORD idProduct;//產(chǎn)品編號
          WORD bcdDevice;//設(shè)備出廠編號
          BYTE iManufacturer;//設(shè)備廠商字符串的索引
          BYTE iProduct;//描述產(chǎn)品字符串的索引
          BYTE iSerialNumber;//描述設(shè)備序列號字符串的索引
          BYTE bNumConfigurations;//可能的配置數(shù)量
          }
          DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;

          //實(shí)際的設(shè)備描述符示例
          code DEVICE_DESCRIPTOR_STRUCT device_descriptor=//設(shè)備描述符
          {
          sizeof(DEVICE_DESCRIPTOR_STRUCT),//設(shè)備描述符的字節(jié)數(shù)大小,這里是18字節(jié)
          DEVICE_DESCRIPTOR,//設(shè)備描述符類型編號,設(shè)備描述符是01
          0x1001,//USB版本號,這里是USB01.10,即USB1.1。由于51是大端模式,所以高低字節(jié)交換
          0x00,//USB分配的設(shè)備類代碼,0表示類型在接口描述符中定義
          0x00,//USB分配的子類代碼,上面一項(xiàng)為0時(shí),本項(xiàng)也要設(shè)置為0
          0x00,//USB分配的設(shè)備協(xié)議代碼,上面一項(xiàng)為0時(shí),本項(xiàng)也要設(shè)置為0
          0x10,//端點(diǎn)0的最大包大小,這里為16字節(jié)
          0x7104,//廠商編號,這個(gè)是需要跟USB組織申請的ID號,表示廠商代號。
          0xf0ff,//該產(chǎn)品的編號,跟廠商編號一起配合使用,讓主機(jī)注冊該設(shè)備并加載相應(yīng)的驅(qū)動(dòng)程序
          0x0100,//設(shè)備出廠編號
          0x01,//設(shè)備廠商字符串的索引,在獲取字符串描述符時(shí),使用該索引號來識別不同的字符串
          0x02,//描述產(chǎn)品字符串的索引,同上
          0x03,//描述設(shè)備序列號字符串的索引,同上
          0x01//可能的配置數(shù)為1,即該設(shè)備只有一個(gè)配置
          };

          2.配置描述符

          //定義標(biāo)準(zhǔn)的配置描述符結(jié)構(gòu)

          typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
          {
          BYTE bLength;//配置描述符的字節(jié)數(shù)大小
          BYTE bDescriptorType;//配置描述符類型編號
          WORD wTotalLength;//此配置返回的所有數(shù)據(jù)大小
          BYTE bNumInterfaces;//此配置所支持的接口數(shù)量
          BYTE bConfigurationValue;//Set_Configuration命令所需要的參數(shù)值
          BYTE iConfiguration;//描述該配置的字符串的索引值
          BYTE bmAttributes;//供電模式的選擇
          BYTE MaxPower;//設(shè)備從總線提取的最大電流
          }
          CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;


          上一頁 1 2 下一頁

          關(guān)鍵詞: USB描述符依賴關(guān)

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();