OHCI (Open Host Controller Interface) 定義了 USB 主機控制器的暫存器介面與資料結構,是理解 USB 底層傳輸的關鍵。本文聚焦核心資料結構——端點描述符 (Endpoint Descriptor, ED) 及其在四大傳輸類型中的排程邏輯。
| 結構 | 縮寫 | 職責 |
|---|---|---|
| 端點描述符 | ED | 描述 USB 端點屬性 (地址、速度、最大封包長度),掛載 TD 鏈表 |
| 傳輸描述符 | TD | 描述單次傳輸參數 (資料緩衝區、長度、狀態),形成鏈表掛在 ED 下 |
| 主機控制器通訊區 | HCCA | 固定位址 256 位元組區域,儲存中斷/同步 ED 表頭、Done Queue 等 |
typedef struct _OHCI_ED {
uint32_t Control; // 端點屬性控制位
uint32_t TailP; // TD 鏈表尾指標 (硬體更新)
uint32_t HeadP; // TD 鏈表頭指標 (軟體設定)
uint32_t NextED; // 下一個 ED 指標 (形成 ED 列表)
} OHCI_ED;
OHCI 維護四條獨立的 ED 列表,透過 HcControl 與 HcCommandStatus 暫存器控制:
| 傳輸類型 | 列表名稱 | 啟用位元 | 排程特性 |
|---|---|---|---|
| 控制傳輸 | Control List | HcControl.CLE | ED 串聯,每幀依 ControlBulkServiceRatio 處理 |
| 批量傳輸 | Bulk List | HcControl.BLE | ED 串聯,低優先級,剩餘頻寬處理 |
| 中斷傳輸 | Interrupt List | HcControl.PLE | HCCA 中 32 個槽位,依輪詢週期 (2^n ms) 分佈 |
| 同步傳輸 | Isochronous List | HcControl.IE | HCCA 中固定位置,每幀必處理,保證頻寬 |
每個 USB 幀 (1ms) 依 HcPeriodicStart 設定劃分:
┌───────────────────────────────────── 1 ms Frame ─────────────────────────────────────┐ │ │ │ [Bulk/Control 處理區] ← HcPeriodicStart (預設 90% 幀時間) │ │ │ │ │ ▼ │ │ [Periodic/Interrupt 處理區] ← 保證頻寬,硬體強制執行 │ │ │ │ │ ▼ │ │ [剩餘時間繼續 Bulk/Control] ← 若 Periodic 提前結束 │ │ │ └──────────────────────────────────────────────────────────────────────────────────────┘
HcControl bits 16-17,可設 1:1 ~ 4:1HeadP 取得首個 TDHcDoneHead)HcInterruptStatus.WDH 中斷,HCD 處理 Done Queue 回調上層| 特性 | Control / Bulk | Interrupt / Isochronous |
|---|---|---|
| ED 組織 | 單向鏈表 | HCCA 固定陣列 (32 槽位 + Iso 區) |
| 排程保證 | 最佳努力 | 硬體保證頻寬/延遲 |
| TD 重試 | 硬體自動重試 (NAK/CRC) | 不重試,錯誤直接回報 |
| 資料切換 | DATA0/DATA1 自動切換 | Iso 無 Data Toggle |
理解 ED 與排程機制,是編寫/除錯 OHCI 主機控制器驅動程式 (HCD) 的基石,也是分析 USB 總線效能瓶頸的關鍵。