首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

USB 描述符詳解:設備、配置、接口、端點、字串

     編輯:關於C語言

USB 描述符詳解:設備、配置、接口、端點、字串

USB 設備向主機展示功能的核心數據結構就是描述符。主機通過枚舉過程讀取這些描述符,決定加載何種驅動、分配何種頻寬。本文結合 Cypress FX2LP 官方固件 dscr.a51 源碼,逐項解析各描述符關鍵字段。

描述符層級結構

設備描述符 (1 個)
  └─ 配置描述符 (1~多個)
       └─ 接口描述符 (1~多個)
            └─ 端點描述符 (0~多個)
  └─ 字串描述符 (可選,索引引用)
  └─ 設備限定符 / 其他速度配置描述符 (高速設備)

1. 設備描述符(18 位元組,14 字段)

偏移字段說明典型值
0bLength描述符長度18 (0x12)
1bDescriptorType類型1 (DEVICE)
2bcdUSBUSB 規範版本0x0200 (USB 2.0)
4bDeviceClass設備類別0x00 (由接口定義) / 0x04 (HID)
5bDeviceSubClass子類別0x00
6bDeviceProtocol協議0x00
7bMaxPacketSize0端點 0 最大包長64 (高速) / 8/16/32/64 (全速)
8idVendor廠商 ID (VID)自定義,如 0x04B4 (Cypress)
10idProduct產品 ID (PID)自定義
12bcdDevice設備版本0x0001
14iManufacturer製造商字串索引1
15iProduct產品字串索引2
16iSerialNumber序列號字串索引3 (或 0 無)
17bNumConfigurations配置數1

修改重點:VID/PID/版本/字串索引。修改 VID/PID 需同步更新驅動 .inf,否則設備無法匹配驅動。

2. 配置描述符(9 位元組,8 字段)

  • wTotalLength:該配置下所有描述符總長度(含接口、端點)。
  • bNumInterfaces:接口數(≥1)。
  • bmAttributes:位 7=1 (保留),位 6=1 (自供電),位 5=1 (支援遠程喚醒)。FX2LP 板卡從 USB 取電 → 設為 0xA0 (10100000b)。
  • bMaxPower:最大電流(2mA 為單位)。USB 2.0 最大 500mA → 設 250 (0xFA)。

3. 字串描述符

  • 索引 0:語言 ID 表(如 0x0409 美式英語)。
  • 索引 1~n:製造商、產品、序列號等 Unicode 字串(UTF-16LE)。
  • FX2LP 固件中 dscr.a51 第 162~187 行定義,修改即可自定義顯示名稱。

4. 接口描述符

  • bInterfaceNumber:接口編號(0 基礎)。
  • bAlternateSetting:備選設置編號。
  • bNumEndpoints:端點數(不含端點 0)。FX2LP 例程常用 4 個端點(2,4,6,8)。
  • bInterfaceClass/SubClass/Protocol:如 HID (0x03/0x00/0x00)、大容量存儲 (0x08/0x06/0x50) 等。

5. 端點描述符

字段說明關鍵值
bEndpointAddress端點地址位 7: 方向 (0=OUT, 1=IN),位 3-0: 編號 (1~15)
bmAttributes傳輸類型00=控制, 01=同步, 10=批量, 11=中斷
wMaxPacketSize最大包長高速批量 512, 全速 64
bInterval輪詢間隔中斷/同步端點用,單位 125µs (高速) 或 1ms (全速)

注意:端點描述符數量必須與接口描述符 bNumEndpoints 一致。傳輸類型選擇:控制(少量、無時效)、批量(大量、無時效)、同步(大量、恆定速率)、中斷(少量、週期性)。

6. 設備限定符 & 其他速度配置

高速設備必須提供:限定符(類似設備描述符,指明高速能力)、全速/高速各自的配置描述符集合。FX2LP 固件中統一放在「速率配置描述」區塊,含全速、高速兩套完整描述符樹。

開發建議

  1. 所有描述符定義集中在 dscr.a51,修改後重新編譯生成 .hex/.iic。
  2. 修改 VID/PID/字串後,必須同步更新 Windows 驅動 .inf 文件中的 %VID_PID% 區段與 Strings 區段。
  3. 自供電設備 bmAttributes 位 6=0,總線供電位 6=1;支援遠程喚醒位 5=1。
  4. 端點配置與固件中端點緩衝區分配、DMA 通道綁定必須一一對應。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved