1. 主機控制器(Host Controller)
• UHCI: Universal Host Controller Interface (通用主機控制接口, USB1.0/1.1)
• OHCI: Open Host Controller Interface (開放主機控制接口,USB1.0/1.1)
• EHCI: Enhanced Host Controller Interface (用於USB2.0高速設備的“增強主機控制接口”)
USB的拓撲結構決定了主機控制器就是最高統帥,沒有主機控制器的要求設備永遠不能主動發數據。所以主機控制器在USB的世界裏扮演着重要的角色,它是幕後操縱者。
比如說Host發送Setup包獲取設備描述符是怎麼發出去的?
這個過程包含很多信息,比如:如何在D+和D-這兩根線上傳過去的、又傳過來的。 這一切的工作都是主機控制器給我們做的。USB Host控制器的規範有很多種這裏只介紹混得不錯的EHCI和OHCI。這個EHCI主要針對高速的USB設備。如果要操作全速和低速可以考慮OHCI。
• 什麼是USB controller?
USB 設備和主機的接口就是host controller,一個主機可以支持多個host controller比如分別屬於不同廠商的。那麼USB host controller 本身是做什麼的? controller(控制器):用於控制。控制什麼?控制所有的USB設備的通信。
CPU把要做的事情分配給主機控制器,然後自己想幹什麼就幹什麼去,主機控制器替他去完成剩下的事情,事情辦完了再通知CPU。否則讓CPU去盯着每一個設備做每一件事情,那是不現實的。
控制器的主要工作是什麼? 把數扔出去,把數拿回來。絕對不應該偷偷加工數據。
主機控制器控制總線上包的傳輸, 使用1ms或125us的幀。在每幀的開始時,主機控制器產生一個幀開始包(SOF: Start of Frame)。
SOF包用於同步幀的開始和跟蹤幀的數目。包在幀中被傳輸,或由Host到Device(out事務),或由Device到Host(in事務)。傳輸總是由Host發起(輪詢傳輸)。回此每條USB總線只能有一個Host。每個包的傳輸都有一個狀態階段同(同步傳輸除外),數據接收者可以在其中返回ACK(應答接收),NAK(重試),STALL(錯誤條件)或什麼也沒有(混亂數據階段,設備不可用或已經斷開)。
• 主機控制器Driver的工作是什麼?
讓主機控制器工作起來,發揮它的潛力。 讓控制器發數據、收數據 。主機控制器主要包含以下幾步:
1) 按照主機控制器的要求組織結構體
2) 將結構體在合適的時間、放在合適的地方
3) trigger
4) 等待完成信號
主機控制器Driver開發過程就是上面這幾步。
2. 關鍵數據結構
關鍵數據結構關係如下圖所示:
3. 系統架構
EHCI負責處理高速設備,OHCI負責處理全速/低速設備。上面這張圖描述了USB控制器在route USB設備時的操作。
一個port 多個主人,OHCI的角色是companion,伴侶。地位低點。EHCI處理不了再給它處理。
關於端口邏輯這塊需要特別注意,Driver設計者要注意:當前端口正在屬於誰。當端口被OHCI所擁有時,你插入個高速設備怎麼辦?沒辦法!在沒有插入設備時,就不應該讓OHCI擁有這個端口。只有EHCI控制器才能識別出設備是全速、高速還是低速。
4. usb_submit_urb
usb_submit_urb處理流程如下圖所示: