開局一張圖
(以下是個人理解,如有不足之處,非常歡迎討論及指正)
Linux系統USB驅動主要包括主、從兩大類驅動。
由上圖可看出,左邊部分是作為USB主驅動的框架,右邊部分是作為USB從設備的驅動框架,中間可由OTG驅動互相轉換。
USB主驅動的框架
先看左邊部分,USB主驅動框架包括:USB設備驅動、USB核心層驅動、USB主控制器驅動。
一、USB主控制器驅動
這里主控制器其實是廣義的,主要包括:主控制器(OHC、EHC等控制器)、根集線器(Root Hub)、PHY芯片。這是由於目前大部分廠商已經把根集線器和PHY集成在控制器中。
1.先說USB主控制器驅動:干嘛用的?顧名思義就是驅動主控制器的。主控制器干嘛用的?就是用來直接與USB設備通信的。
控制器一般是由SOC廠商研制的,各個廠家不一樣,市面上主要有以下四類:
OHCI(Open Host Controller Interface): 微軟主導的低速USB1.0(1.5Mbps)(應用於鼠標和鍵盤等)和全速USB1.1(12Mbps)(應用於音頻和麥克等),OHCI接口的軟件簡單,硬件復雜
UHCI(Universal Host Controller Interface): Intel主導的低速USB1.0(1.5Mbps)和全速USB1.1(12Mbps), 而UHCI接口的軟件復雜,硬件簡單
EHCI(Enhanced Host Controller Interface):高速USB2.0(480Mbps)(應用於存儲和視頻等),
xHCI(eXtensible Host Controller Interface):USB3.0(5.0Gbps),采用了9針腳設計,同時也支持USB2.0、1.1等
(后續還會有USB4.0 5.0 等等)
內核Menuconfig中為以下幾個選項:
--- USB support
<*> xHCI HCD (USB 3.0) support
<*> EHCI HCD (USB 2.0) support
相關驅動文件位於/drivers/usb/host目錄下。
2.再說根集線器:
根集線器是USB的第一個設備,通過它再拓撲連接各種集線器和USB設備。目前主控器普遍集成根集線器,方便接入多種設備。
如果沒有根集線器,則是一對一點對點連接。
內核Menuconfig中參考以下幾個選項:
--- USB support
相關驅動文件位於/drivers/usb/host目錄下。
3.最后PHY芯片:
引入: 相關復雜協議(eg. USB)需要分層實現,如用戶層、數據鏈路層、物理層等。
主要作用:用來實現協議物理層相關技術,如底層的信號轉換。
形式:控制器內部、控制器外部
主要工作內容:(1)數據的分包,如包頭包尾。(2)時序的定義。(3)電平的轉換。
內核Menuconfig中為以下幾個選項:
--- USB support
USB Physical Layer drivers --->
<*> Freescale MXS USB PHY support
相關驅動文件位於/drivers/usb/phy目錄下。
二、USB核心層驅動:
核心層驅動不由SOC廠商提供,而是由USB聯盟或Linux根據USB協議編制的統一通用接口。一方面向使用 USB 總線的設備驅動提供操作 USB 總線的 API ,另一方面則管理上層驅動傳下來的的數據流,按 USB 主控制器的要求放在控制器驅動規定的位置, USB 主控制器會調度這些數據。
內核Menuconfig中為以下幾個選項:
--- USB support
<*> Support for Host-side USB
參與編譯的文件位於/drivers/usb/core/目錄下,主要包括如下幾個驅動文件:
該核心層驅動也叫USB子系統模塊,是usb設備所必須的驅動層。它注冊了USB總線、USB文件系統、USB hub、及USB通用設備驅動等。
一條USB總線只有一個USB Host,對應一個RootHub。
三、USB設備驅動:
設備分為兩類,一類是Hub驅動,一類是功能驅動。Hub通過端口Port連接更多USB設備,功能設備即USB外接從設備。
從設備主要包括:U 盤(MassStorage), usb 鼠標、鍵盤(USB-HID),網卡(RNDIS),U轉串(CDC-ACM),視頻設備(V4L2),打印機,usb 藍牙模塊,usb 讀卡器,等。
USB從設備的驅動框架
再看右邊部分,USB從設備驅動框架主要包括:Gadget驅動、Gadget API、UDC驅動。
驅動文件位於/drivers/usb/gadget目錄下。
一、UDC驅動:udc驅動直接訪問硬件usb控制器ohci、ehci、uhci,作為usb設備和主機間的底層通信,同時向上層提供與硬件相關操作的回調函數。該硬件和驅動負責將本設備依附於一個USB主控制器上。
比如,當某個安卓手機作為U盤連接PC機時,手機USB控制器行使USB設備控制器的功能,調用UDC驅動。
二、Gadget API:是對UDC驅動程序回調函數簡單的包裝,硬件無關層。usb gaget 驅動框架不像 usb 主機端有 usb core 的概念,usb 主機可能支持成百類型的外設,把通用功能抽象出來很有意義。Usb device 端則通常沒有這個需求,一些通用功能抽象在一些 Helper 函數里就可以了。
三、Gadget驅動:具體控制系統作為usb設備時的相關功能的實現,使設備表現出“網絡連接”、“打印機” 或“USB Mass Storage”等特性。重要的驅動有:
Gadget Zero, 類似於 dummy hcd, 該驅動用於測試 udc 驅動。它會幫助您通過 USB-IF 測試。
Ethernet over USB, 該驅動模擬以太網網口,它支持多種運行方式。
File-backed Storage Gadget最常見的 U 盤功能實現。
OTG
再看中間部分,OTG驅動架構(該部分具體邏輯框架,與左右部分的關系還未理清,后續有待更新)。
OTG(On The Go):該協議是在USB2.0時引入的一種mode,提出了一個新的概念叫主機協商協議(Host Negotiation Protocol),允許兩個設備間商量誰去當Host。為了讓設備可以充當主從兩個角色,主設備即HCD,從設備即UDC,也就是Gadget。
主要應用場景:OTG技術就是實現在沒有Host的情況下,實現從設備間的數據傳輸。
特色: 更具節能性的電源管理 和 允許設備以主機、從設備兩種方式工作。
OTG設備類型:兩用OTG設備(Dual role device) 、 外設式OTG設備(Peripheralonly OTG device)
傳輸協議:ADP,SRP,HNP
ADP(Attach Detection Protocol): 當USB總線上沒有供電時,ADP允許OTG設備或USB設備決定連接狀態。
SRP(Session Request Protocol) :允許從設備也可以控制主設備。
HNP(Host Negotiation Protocol) :允許兩個設備互換主從角色
協議角色:OTG A-device:電源提供者,主設備。 OTG B-device:電源消費者,從設備。 兩角色可通過HNP協議互換。
OTG轉換控制器:由SOC廠商或者控制器廠商提供,源碼位於/drivers/usb/otg或者其他實例化IP方案目錄下。OTG轉換控制器通過USB ID 電平高低來決定是啟用Host控制器還是Gadget控制器。
主要思路:當OTG線纜上有otg設備插入時,XX產生中斷,中斷處理函數通過讀取OTG控制器寄存器的值來判斷設備屬於Host設備還是Gadget設備,然后通過相應函數重啟Host控制器或Gadget控制器。
OTG轉換驅動:主要包括:主驅動、設備驅動、otg轉換驅動 (有待更正)
OTG硬件電路實現:
歡迎轉載,歡迎指正,更歡迎點贊。轉載請附原文鏈接。