usb設備 配置 接口 端點


在USB設備的邏輯組織中,包含設備、配置、接口和端點4個層次。
每個USB設備都提供了不同級別的配置信息,可以包含一個或多個配置,不同的配置使設備表現出不同的功能組合(在探測/連接期間需從其中選定一個),配置由多個接口組成。
在USB協議中,接口由多個端點組成,代表一個基本的功能,是USB設備驅動程序控制的對象,一個功能復雜的USB設備可以具有多個接口。每個配置中可以有多個接口,而設備接口是端點的匯集(collection)。例如USB揚聲器可以包含一個音頻接口以及對旋鈕和按鈕的接口。一個配置中的所有接口可以同時有效,並可被不同的驅動程序連接。每個接口可以有備用接口,以提供不同質量的服務參數。
端點是USB通信的最基本形式,每一個USB設備接口在主機看來就是一個端點的集合。主機只能通過端點與設備進行通信,以使用設備的功能。在USB系統中每一個端點都有惟一的地址,這是由設備地址和端點號給出的。每個端點都有一定的屬性,其中包括傳輸方式、總線訪問頻率、帶寬、端點號和數據包的最大容量等。一個USB端點只能在一個方向承載數據,或者從主機到設備(稱為輸出端點),或者從設備到主機(稱為輸入端點),因此端點可看作一個單向的管道。端點0通常為控制端點,用於設備初始化參數等。只要設備連接到USB上並且上電端點0就可以被訪問。端點1、2等一般用作數據端點,存放主機與設備間往來的數據。

總體而言,USB設備非常復雜,由許多不同的邏輯單元組成,如圖20.2所示,這些單元之間的關系如下:

設備通常有一個或多個配置;
配置通常有一個或多個接口;
接口通常有一個或多個設置;
接口有零或多個端點。

這種層次化配置信息在設備中通過一組標准的描述符來描述,如下所示。
l 設備描述符:關於設備的通用信息,如供應商ID、產品ID和修訂ID,支持的設備類、子類和適用的協議以及默認端點的最大包大小等。在Linux內核中,USB設備用usb_device結構體來描述,USB設備描述符定義為usb_device_descriptor結構體,如代碼清單20.1所示。
代碼清單20.1 usb_device_descriptor結構體
1 struct usb_device_descriptor 
2 {
3 _ _u8 bLength; //描述符長度
4 _ _u8 bDescriptorType; //描述符類型編號

6 _ _le16 bcdUSB; //USB版本號
7 _ _u8 bDeviceClass; //USB分配的設備類code
8 _ _u8 bDeviceSubClass;// USB分配的子類code
9 _ _u8 bDeviceProtocol; //USB分配的協議code
10 _ _u8 bMaxPacketSize0; //endpoint0最大包大小
11 _ _le16 idVendor; //廠商編號
12 _ _le16 idProduct; //產品編號
13 _ _le16 bcdDevice; //設備出廠編號
14 _ _u8 iManufacturer; //描述廠商字符串的索引
15 _ _u8 iProduct; //描述產品字符串的索引
16 _ _u8 iSerialNumber; //描述設備序列號字符串的索引
17 _ _u8 bNumConfigurations; //可能的配置數量
18 } _ _attribute_ _ ((packed));
l 配置描述符:此配置中的接口數、支持的掛起和恢復能力以及功率要求。USB配置在內核中使用usb_host_config結構體描述,USB配置描述符定義為結構體usb_config_descriptor,如代碼清單20.2所示。
代碼清單20.2 usb_config_descriptor結構體
1 struct usb_config_descriptor 
2 {
3 _ _u8 bLength; //描述符長度
4 _ _u8 bDescriptorType; //描述符類型編號

6 _ _le16 wTotalLength; //配置所返回的所有數據的大小
7 _ _u8 bNumInterfaces; // 配置所支持的接口數
8 _ _u8 bConfigurationValue; //Set_Configuration命令需要的參數值
9 _ _u8 iConfiguration; //描述該配置的字符串的索引值
10 _ _u8 bmAttributes; //供電模式的選擇
11 _ _u8 bMaxPower; //設備從總線提取的最大電流
12 } _ _attribute_ _ ((packed));
l 接口描述符:接口類、子類和適用的協議,接口備用配置的數目和端點數目。USB接口在內核中使用usb_interface結構體描述,USB接口描述符定義為結構體usb_interface_descriptor,如代碼清單20.3所示。
代碼清單20.3 usb_interface_descriptor結構體
1 struct usb_interface_descriptor 
2 {
3 _ _u8 bLength;           //描述符長度
4 _ _u8 bDescriptorType; //描述符類型

6 _ _u8 bInterfaceNumber;   // 接口的編號
7 _ _u8 bAlternateSetting; //備用的接口描述符編號
8 _ _u8 bNumEndpoints;      //該接口使用的端點數,不包括端點0
9 _ _u8 bInterfaceClass;    //接口類型
10 _ _u8 bInterfaceSubClass; //接口子類型
11 _ _u8 bInterfaceProtocol; //接口所遵循的協議
12 _ _u8 iInterface; //描述該接口的字符串索引值
13 } _ _attribute_ _ ((packed));
l 端點描述符:端點地址、方向和類型,支持的最大包大小,如果是中斷類型的端點則還包括輪詢頻率。在Linux內核中,USB端點使用usb_host_endpoint結構體來描述,USB端點描述符定義為usb_endpoint_descriptor結構體,如代碼清單20.4所示。
代碼清單20.4 usb_endpoint_descriptor結構體
1 struct usb_endpoint_descriptor 
2 {
3 _ _u8 bLength; //描述符長度
4 _ _u8 bDescriptorType; //描述符類型
5 _ _u8 bEndpointAddress; //端點地址:0~3位是端點號,第7位是方向(0-OUT,1-IN)
6 _ _u8 bmAttributes; //端點屬性:bit[0:1] 的值為00表示控制,為01表示同步,為02表示批量,為03表示中斷
7 _ _le16 wMaxPacketSize; //// 本端點接收或發送的最大信息包的大小
8 _ _u8 bInterval;//輪詢數據傳送端點的時間間隔
9                       //對於批量傳送的端點以及控制傳送的端點,此域忽略
10                     //對於同步傳送的端點,此域必須為1
11                     //對於中斷傳送的端點,此域值的范圍為1~255
12 _ _u8 bRefresh;
13 _ _u8 bSynchAddress;
14 } _ _attribute_ _ ((packed));
l 字符串描述符:在其他描述符中會為某些字段提供字符串索引,它們可被用來檢索描述性字符串,可以以多種語言形式提供。字符串描述符是可選的,有的設備有,有的設備沒有,字符串描述符對應於usb_string_descriptor結構體,如代碼清單20.5所示。
代碼清單20.5 usb_string_descriptor結構體
1 struct usb_string_descriptor 
2 {
3 _ _u8 bLength; //描述符長度
4 _ _u8 bDescriptorType; //描述符類型

6 _ _le16 wData[1];/* 以UTF-16LE編碼 */
7 } _ _attribute_ _ ((packed));
例如,筆者在運行Linux 2.6.15.5的系統上插入一個SanDisk U盤后,通過lsusb命令得到這個U盤相關的描述符,從中可以顯示這個U盤包含了一個設備描述符、一個配置描述符、一個接口描述符以及批量輸入和批量輸出兩個端點描述符。呈現出來的信息內容直接對應於usb_device_descriptor、usb_config_descriptor、usb_interface_descriptor、usb_endpoint_descriptor、usb_string_descriptor結構體,如下所示: 
Bus 001 Device 004: ID 0781:5151 SanDisk Corp. 
Device Descriptor:
bLength                18
bDescriptorType         1
bcdUSB               2.00
bDeviceClass            0 Interface
bDeviceSubClass         0 
bDeviceProtocol         0 
bMaxPacketSize0        64
idVendor           0x0781 SanDisk Corp.
idProduct          0x5151 
bcdDevice            0.10
iManufacturer           1 SanDisk Corporation
iProduct                2 Cruzer Micro
iSerial                 3 20060877500A1BE1FDE1
bNumConfigurations      1
Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
    MaxPower              200mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81 EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               none
        wMaxPacketSize        512
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01 EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               none
        wMaxPacketSize        512
        bInterval               1
Language IDs: (length=4)
     0409 English(US)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM