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

OHCI USB 主機控制器深度解析:端點描述符 (ED) 與傳輸排程機制

     編輯:關於C語言

OHCI (Open Host Controller Interface) 定義了 USB 主機控制器的暫存器介面與資料結構,是理解 USB 底層傳輸的關鍵。本文聚焦核心資料結構——端點描述符 (Endpoint Descriptor, ED) 及其在四大傳輸類型中的排程邏輯。

OHCI 核心資料結構總覽

結構縮寫職責
端點描述符ED描述 USB 端點屬性 (地址、速度、最大封包長度),掛載 TD 鏈表
傳輸描述符TD描述單次傳輸參數 (資料緩衝區、長度、狀態),形成鏈表掛在 ED 下
主機控制器通訊區HCCA固定位址 256 位元組區域,儲存中斷/同步 ED 表頭、Done Queue 等

端點描述符 (ED) 結構詳解

typedef struct _OHCI_ED {
    uint32_t  Control;        // 端點屬性控制位
    uint32_t  TailP;          // TD 鏈表尾指標 (硬體更新)
    uint32_t  HeadP;          // TD 鏈表頭指標 (軟體設定)
    uint32_t  NextED;         // 下一個 ED 指標 (形成 ED 列表)
} OHCI_ED;

Control 欄位關鍵位定義

  • Function Address (bits 0-6):USB 裝置位址
  • Endpoint Number (bits 7-10):端點編號 (0-15)
  • Direction (bits 11-12):00=OUT, 01=IN, 10=TD 設定
  • Speed (bit 13):0=Full-speed, 1=Low-speed
  • Skip (bit 14):1=HC 跳過此 ED
  • Format (bit 15):0=一般 ED, 1=Isochronous ED
  • MaxPacketSize (bits 16-26):最大封包長度 (位元組)

四大傳輸類型與 ED 列表架構

OHCI 維護四條獨立的 ED 列表,透過 HcControl 與 HcCommandStatus 暫存器控制:

傳輸類型列表名稱啟用位元排程特性
控制傳輸Control ListHcControl.CLEED 串聯,每幀依 ControlBulkServiceRatio 處理
批量傳輸Bulk ListHcControl.BLEED 串聯,低優先級,剩餘頻寬處理
中斷傳輸Interrupt ListHcControl.PLEHCCA 中 32 個槽位,依輪詢週期 (2^n ms) 分佈
同步傳輸Isochronous ListHcControl.IEHCCA 中固定位置,每幀必處理,保證頻寬

幀內排程時間切片

每個 USB 幀 (1ms) 依 HcPeriodicStart 設定劃分:

┌───────────────────────────────────── 1 ms Frame ─────────────────────────────────────┐
│                                                                                      │
│  [Bulk/Control 處理區] ← HcPeriodicStart (預設 90% 幀時間)                           │
│       │                                                                              │
│       ▼                                                                              │
│  [Periodic/Interrupt 處理區] ← 保證頻寬,硬體強制執行                                │
│       │                                                                              │
│       ▼                                                                              │
│  [剩餘時間繼續 Bulk/Control] ← 若 Periodic 提前結束                                 │
│                                                                                      │
└──────────────────────────────────────────────────────────────────────────────────────┘

控制/批量服務比例 (ControlBulkServiceRatio)

  • 定義於 HcControl bits 16-17,可設 1:1 ~ 4:1
  • HC **強制** 依此比例服務 Control vs Bulk ED,**無視列表實際 ED 數量**
  • 例:比例 4:1、僅 1 個 Control ED → 該 ED 連續被服務 4 次才輪到 Bulk
  • 空列表會被跳過,但 HC 會按比例持續檢查,新增 ED 即納入排程

TD 處理流程與 Done Queue

  1. HC 從 ED.HeadP 取得首個 TD
  2. 依 ED 端點屬性 (速度、方向、最大封包) 執行 USB 傳輸
  3. 傳輸完成更新 TD 狀態碼、實際傳輸長度、切換 Data Toggle
  4. 若 TD 完成或出錯,從 ED 鏈表移除,掛入 **Done Queue** (HcDoneHead)
  5. 觸發 HcInterruptStatus.WDH 中斷,HCD 處理 Done Queue 回調上層

關鍵差異:Control/Bulk vs Interrupt/Isochronous

特性Control / BulkInterrupt / Isochronous
ED 組織單向鏈表HCCA 固定陣列 (32 槽位 + Iso 區)
排程保證最佳努力硬體保證頻寬/延遲
TD 重試硬體自動重試 (NAK/CRC)不重試,錯誤直接回報
資料切換DATA0/DATA1 自動切換Iso 無 Data Toggle

理解 ED 與排程機制,是編寫/除錯 OHCI 主機控制器驅動程式 (HCD) 的基石,也是分析 USB 總線效能瓶頸的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved