USB 設備向主機展示功能的核心數據結構就是描述符。主機通過枚舉過程讀取這些描述符,決定加載何種驅動、分配何種頻寬。本文結合 Cypress FX2LP 官方固件 dscr.a51 源碼,逐項解析各描述符關鍵字段。
設備描述符 (1 個)
└─ 配置描述符 (1~多個)
└─ 接口描述符 (1~多個)
└─ 端點描述符 (0~多個)
└─ 字串描述符 (可選,索引引用)
└─ 設備限定符 / 其他速度配置描述符 (高速設備)
| 偏移 | 字段 | 說明 | 典型值 |
|---|---|---|---|
| 0 | bLength | 描述符長度 | 18 (0x12) |
| 1 | bDescriptorType | 類型 | 1 (DEVICE) |
| 2 | bcdUSB | USB 規範版本 | 0x0200 (USB 2.0) |
| 4 | bDeviceClass | 設備類別 | 0x00 (由接口定義) / 0x04 (HID) |
| 5 | bDeviceSubClass | 子類別 | 0x00 |
| 6 | bDeviceProtocol | 協議 | 0x00 |
| 7 | bMaxPacketSize0 | 端點 0 最大包長 | 64 (高速) / 8/16/32/64 (全速) |
| 8 | idVendor | 廠商 ID (VID) | 自定義,如 0x04B4 (Cypress) |
| 10 | idProduct | 產品 ID (PID) | 自定義 |
| 12 | bcdDevice | 設備版本 | 0x0001 |
| 14 | iManufacturer | 製造商字串索引 | 1 |
| 15 | iProduct | 產品字串索引 | 2 |
| 16 | iSerialNumber | 序列號字串索引 | 3 (或 0 無) |
| 17 | bNumConfigurations | 配置數 | 1 |
修改重點:VID/PID/版本/字串索引。修改 VID/PID 需同步更新驅動 .inf,否則設備無法匹配驅動。
wTotalLength:該配置下所有描述符總長度(含接口、端點)。bNumInterfaces:接口數(≥1)。bmAttributes:位 7=1 (保留),位 6=1 (自供電),位 5=1 (支援遠程喚醒)。FX2LP 板卡從 USB 取電 → 設為 0xA0 (10100000b)。bMaxPower:最大電流(2mA 為單位)。USB 2.0 最大 500mA → 設 250 (0xFA)。dscr.a51 第 162~187 行定義,修改即可自定義顯示名稱。bInterfaceNumber:接口編號(0 基礎)。bAlternateSetting:備選設置編號。bNumEndpoints:端點數(不含端點 0)。FX2LP 例程常用 4 個端點(2,4,6,8)。bInterfaceClass/SubClass/Protocol:如 HID (0x03/0x00/0x00)、大容量存儲 (0x08/0x06/0x50) 等。| 字段 | 說明 | 關鍵值 |
|---|---|---|
| bEndpointAddress | 端點地址 | 位 7: 方向 (0=OUT, 1=IN),位 3-0: 編號 (1~15) |
| bmAttributes | 傳輸類型 | 00=控制, 01=同步, 10=批量, 11=中斷 |
| wMaxPacketSize | 最大包長 | 高速批量 512, 全速 64 |
| bInterval | 輪詢間隔 | 中斷/同步端點用,單位 125µs (高速) 或 1ms (全速) |
注意:端點描述符數量必須與接口描述符 bNumEndpoints 一致。傳輸類型選擇:控制(少量、無時效)、批量(大量、無時效)、同步(大量、恆定速率)、中斷(少量、週期性)。
高速設備必須提供:限定符(類似設備描述符,指明高速能力)、全速/高速各自的配置描述符集合。FX2LP 固件中統一放在「速率配置描述」區塊,含全速、高速兩套完整描述符樹。
dscr.a51,修改後重新編譯生成 .hex/.iic。.inf 文件中的 %VID_PID% 區段與 Strings 區段。bmAttributes 位 6=0,總線供電位 6=1;支援遠程喚醒位 5=1。