Linux系統USB之協議驅動框架


開局一張圖

(以下是個人理解,如有不足之處,非常歡迎討論及指正

 

 

 

 

 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 APIUDC驅動

驅動文件位於/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硬件電路實現

 

 

 


 歡迎轉載,歡迎指正,更歡迎點贊。轉載請附原文鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM