系列簡介
本系列系統記錄基於 OHCI (Open Host Controller Interface) 規范實現 USB 主機驅動的全過程,從寄存器操作到文件系統應用,共六大部分 50+ 篇文章。適合嵌入式 USB 驅動開發者、學習 OHCI 協議的工程師參考。
完整目錄結構
第一部分:概述與架構 (3 篇)
- 前言:項目背景、目標設備 (AT91RM9200)、開發環境
- 背景介紹:USB 2.0/1.1 協議基礎、OHCI/EHCI/UHCI 差異、主機控制器角色
- 總體架構:驅動分層設計 (寄存器層 → OHCI 軟件層 → USB 設備管理 → 類驅動 → 文件系統)
第二部分:寄存器讀寫接口 (6 篇) —— 純硬件操作,與業務無關
- 寄存器層說明:OHCI 運算/控制/狀態寄存器映射
- 寄存器初始化:HcControl, HcCommandStatus, HcInterruptEnable 等關鍵寄存器配置
- 寄存器傳輸:控制/批量/中斷/等時傳輸的寄存器級觸發流程
- 寄存器復位:軟復位、硬復位、運行狀態切換 (Reset/Resume/Operational)
- 設備連接檢測:RhPortStatus 根集線器端口狀態讀取、連接/斷開中斷處理
- 其他寄存器操作:HCCA 地址設置、幀號讀取、SOF 生成控制等
第三部分:OHCI 軟件接口 (17 篇) —— 核心調度與傳輸引擎
- OHCI 端點描述符 (ED) 結構與鏈表管理
- 傳輸描述符 (TD) 結構、數據緩衝區映射、狀態碼解析
- HCCA (Host Controller Communication Area) 佈局與中斷表管理
- 基本調度流程:幀列表遍歷、ED 服務、TD 退休、Done Queue 處理
- ED 結構詳細說明:Skip bit、Format、Direction、MaxPacket、Endpoint 字段
- TD 結構詳細說明:PID、DI、I、EC、CC、BP0/CBP、BE/CBE 字段
- 設計思路:雙緩衡、內存池、中斷延遲處理、錯誤重試策略
- 自定義數據結構:驅動內部設備/端點/傳輸上下文封裝
- 控制端點讀/寫數據:Setup/Data/Status 三階段自動化封裝
- 批量端點讀/寫數據:多 TD 鏈、短包處理、NAK 重試邏輯
- 中斷寄存器初始化:HcInterruptEnable 逐位配置 (SOF, WDH, RHSC, UE, FNO, RD, SF)
- 中斷向量處理:IRQ 入口、上下文保存、分發到 OHCI 處理程序
- 中斷處理程序核心:Done Queue 遍歷、TD 狀態判斷、回調觸發、ED 重掛載
第四部分:USB 設備管理 (15 篇) —— 枚舉與標準請求
- USB 標準命令介紹:Get Descriptor, Set Address, Set Configuration 等
- 標準請求詳解:bmRequestType, bRequest, wValue, wIndex, wLength 字段編碼
- 描述符層級解析:Device, Configuration, Interface, Endpoint, String 描述符結構
- 枚舉流程全景:復位 → 獲取設備描述符(前8字節) → 分配地址 → 獲取完整描述符集 → 選擇配置 → 設置配置 → 設置接口
- 設備描述符數據結構:C 語言位域映射、多配置支持
- 其他數據結構:接口/端點描述符鏈表、字符串索引緩存
- 常量定義:請求碼、描述符類型、類/子類/協議碼、標準特性選擇器
- 通用獲取描述符函數:同步控制傳輸封裝、短包處理、緩衝區管理
- 獲取設備描述符:兩階段 (前8字節→完整)、MaxPacketSize0 提取
- 獲取配置描述符:兩階段 (前9字節→含接口/端點完整樹)、總長度解析
- 設置設備地址:SetAddress 請求、狀態階段後更新內部地址映射
- 設置配置值:SetConfiguration、激活接口、分配端點資源
- 設置接口值:SetInterface、備選設置切換、端點重新初始化
- 設備枚舉主流程:統籌上述步驟、錯誤回滾、設備對象創建
- 端口特性清除:ClearFeature (Port Enable/Reset/Suspend/Overcurrent)
第五部分:UFI 命令實現 (16 篇) —— U盤讀寫核心協議
- UFI 概述:SCSI 透明命令集、CBW/CSW 封裝、Bulk-Only Transport 協議
- Bulk-Only 協議詳解:CBW 簽名/Tag/數據長度/標誌/LUN/CDB、CSW 簽名/Tag/數據殘留/狀態
- Inquiry 查詢命令:獲取廠商/產品/版本信息、判斷可移動介質
- Read Capacity 讀容量:返回最大 LBA、塊大小 (通常 512)
- Read10 讀扇區:LBA+扇區數、數據階段 IN、CSW 狀態檢查
- Write10 寫扇區:LBA+扇區數、數據階段 OUT、驗證模式支持
- UFI 數據結構 1/2/3:CBW/CSW、CDB 聯合體 (RBC/SCSI)、Sense Data 結構
- 各命令代碼實現:Inquiry/ReadCapacity/Read10/Write10/Request Sense/Reset/Monitor 完整函數
- 批量端點復位:Clear Feature (Endpoint Halt)、設備/端點級復位流程
- 命令監視代碼:超時重試、錯誤統計、Sense Data 解析自動恢復
第六部分:附錄與總結 (3 篇)
- 隨便說幾句:開發心得、踩坑記錄、性能優化經驗
- 結束語:項目總結、代碼規模、已知局限、後續擴展方向
- AT91RM9200 官方例程對比:厭氧分析廠商參考代碼優缺點
建議閱讀路徑
- 初學者:第一部分 → 第四部分 (枚舉流程) → 第三部分核心調度 → 第五部分 UFI
- 驅動移植者:第二部分 (寄存器映射) → 第三部分 (ED/TD/HCCA 初始化) → 中斷處理
- 應用層開發:第五部分 UFI 命令 → 文件系統整合 (FATFS 等)
獲取完整源碼
系列文章對應的完整驅動源碼可在作者博客下載區獲取,包含:
- OHCI 寄存器層 (
ohci_reg.*)
- OHCI 調度層 (
ohci_ed.*, ohci_td.*, ohci_sched.*)
- USB 設備層 (
usb_dev.*, usb_enum.*)
- UFI/Mass Storage 層 (
ufi_cmd.*, msc_bot.*)
- 測試應用 (
usb_test.c)