人生何其短,願我們都能少走彎路。
1、USB基礎知識
USB(Universal Serial Bus)全稱通用串行總線,是一種支持熱插拔的高速串行傳輸總線,使用差分信號來傳輸數據。由於USB是主從模式的結構,設備與設備之間、主機與主機之間不能互連,爲解決這個問題,擴大USB的應用範圍,出現了USB OTG(ON The Go)。
USB協議版本有USB1.0、USB1.1、USB2.0、USB3.1等
USB官網:
https://www.usb.org/documents?search=video&type%5B%5D=55&items_per_page=50
1.1、物理屬性
1.1.1、物理接口
可以,圖片幾乎都上傳失敗了,emmm.
1.1.2、引腳定義
USB1.0&USB2.0:
USB3.0:
1.2、傳輸速度
USB1.0低速模式:1 .5Mb/s
USB1.1全速模式:12Mb/s
USB2.0 高速模式:480Mb/s 500mA
USB3.0 超高速模式: 5.0Gb/s 實際3.2Gb/s 900mA
1.3、連接模型
1.4、傳輸方式
USB,有四種的傳輸方式,控制(Control),同步(isochronous),中斷(interrupt),大量(bulk)。
1.4.1、事務
在介紹USB傳輸類型之前,介紹一下USB事務。
事務一般由令牌包、數據包(可選)、握手包組成。
-
Token(令牌包):用來啓動一個事務,總是由主機發送。
-
Data(數據包):可以從主機到設備,也可以由設備到主機,方向由令牌包決定。
-
Handshake(握手包):通常情況,數據的接收者發送握手包(ACK或者NAK)。
USB2.0 中除同步傳輸方式以外都是 Token + Data + Handshake 的方式,其中Data 是可選的。
1.4.2、控制傳輸
控制傳輸是雙向傳輸,負責向USB設置一些控制信息,傳送這種事務的管道是控制管道。控制傳輸分爲三個過程:建立過程、數據過程(可選)、狀態過程。
建立過程:
1.4.3、同步(isochronous)方式傳輸
同步傳輸提供了確定的帶寬和間隔時間(latency),它被用於時間嚴格並具有較強容錯性的流數據傳輸,或者用於要求恆定的數據傳輸率的即時應用中。
1.4.4、中斷(interrupt)方式傳輸
中斷方式傳輸主要用於定時查詢設備是否有中斷數據要傳輸設備的端點模式器的結構決定了它的查詢頻率,從1到255ms之間。主要用在數據量小,但對時間要求嚴格的場合。如人機接口設備(HID)中的鼠標、鍵盤、軌跡球等。
1.4.5、大量(bulk)傳輸
主要應用在數據大量傳輸傳輸和接受數據上,同時又沒有帶寬和間隔時間要求的情況下,要求保證傳輸。主要用在數據量大、對數據實時性要求不高的場合,例如USB打印機、掃描儀、大容量存儲設備等等。
1.5、端點
USB 通訊的最基本形式是通過一個稱爲端點的東西。一個USB端點只能向一個方向傳輸數據(從主機到設備(稱爲輸出端點)或者從設備到主機(稱爲輸入端點))。端點可被看作一個單向的管道。
在USB設備組織結構中,從上到下分爲設備(device)、配置(config)、接口(interface)和端點(endpoint)四個層次。USB設備程序綁定到接口上。 對於這四個層次的簡單描述如下: 設備通常具有一個或多個的配置 配置經常具有一個或多個的接口 接口沒有或具有一個以上的端點
-
一個具體的端點只能工作在一種傳輸模式下。通常我們把工作在什麼模式下的端點,叫做什麼端點。如控制端點、批量端點、同步端點、中斷端點。
-
端點0是設備的默認控制端點,在設備上電後就存在並可以使用,在Set Config之前所有的傳輸都是通過端點0傳輸的。
-
端點描述符中規定了端點所能支持的最大包長。
-
控制傳輸:高速模式的最大包長固定爲64個字節;全速模式可在8、16、32、64字節中選擇;低速模式的最大包長固定爲8個字節。
-
批量傳輸:高速模式固定爲512個字節;全速模式最大包長可在8、16、32、64字節中選擇;低速模式不支持批量傳輸。
-
同步傳輸:高速模式的最大包長上限爲1024個字節;全速模式的最大包長上限爲1023個字節;低速模式不支持同步傳輸。
-
中斷傳輸:告訴模式的最大包長上限爲1024個字節;全速模式最大包長上限爲64個字節;低速模式最大最大包長上限爲8個字節。
-
2、USB 驅動
2.1、概述
USB分主從系統,由某引腳的電平決定。爲了方便開發,USB定義了一套標準,只要USB設備支持相應的協議就可以直接使用。
USB相關的驅動代碼位於內核代碼中的:
kernel/msm-4.14/drivers/usb
2.1.1、USB軟件架構
USB class driver : 負責USB從設備與主設備之間的通信。
USB core : 實現硬件無關,負責USB協議的處理、USB類驅動程序的交互。
HCD:Host controller driver,負責管理I / O請求和關聯的設備資源、管理低級事務,例如URB
DCD: 執行端點操作,例如啓用,禁用,入隊,出隊,刷新,暫停等 執行USB gadget 操作,例如VBUS處理,VBUS上拉,遠程喚醒等。 充電器檢測。
gadget core : USB設備模式驅動程序框架 支持多種配置,多種接口,複合設備 實現了與硬件無關的USB功能
2.2、USB core
代碼位置位於:
/drivers/usb/core
通過定義一組宏、數據結構和函數來抽象出所有硬件或是設備具有依賴關係的部分。
USB core中主要有四個數據結構,分別是:
1.usb_device保存一個USB設備的信息,包括設備地址,設備描述符,配置描述符等。
2.usb_bus保存一個USB總線系統的信息,包括總線上設備地址信息,根集線器,帶寬使用情況等。一個USB總線系統至少有一個主機控制器和一個根集線器,Linux系統支持多USB總線系統。
3.usb_driver保存客戶驅動信息,包括驅動名稱,以及驅動提供給USB內核使用的函數指針等。
4.URB(Universal Request Block)是進行USB通信的數據結構,USB core通過URB在USB設備類驅動和USB core、USB core和HCD間進行數據傳輸。
2.3、USB主機控制器驅動
主機控制器就是用來控制USB設備與CPU之間通信的。CPU要對設備做什麼操作,會先通知主機控制器,而不是直接發送指令給USB設備。主機控制器接收到CPU的命令後,會去指揮USB設備完成相應的任務。
2.3.1、USB 拓撲
每個嵌入式的CPU芯片中一般都會集成一個或多個Host 控制器,每個Host控制器其實就是一個PCI設備,掛載在PCI總線上,在Linux系統中,驅動開發人員應該給Host 控制器提供驅動程序,Host 控制器用usb_hcd結構來表示。
每個USB Host控制器都會自帶一個USB Hub,每個Hub上又可以掛載USB 設備。每個根USB Hub下可以直接或間接地連接127個設備。
2.3.2 、USB控制器類型
-
OHCI :(Open Host Controller Interface)是支持USB1.1的標準。
-
UHCI :(Universal Host Controller Interface),是Intel主導的對USB1.0、1.1的接口標準,與OHCI不兼容。
-
EHCI :(Enhanced Host Controller Interface),是Intel主導的USB2.0的接口標準。
-
xHCI :(eXtensible Host Controller Interface),是最新最火的USB3.0的接口標準。
-
musb : 位於內核代碼中/drivers/usb/musb
2.3.3 、USB主機控制器驅動(HDC)
USB主機控制器必須由USB主機控制器驅動程序驅動才能運行。USB主機控制器驅動用hc_driver表示,在計算機系統中的每一個主機控制器都有一個對應的hc_driver結構體,該結構體定義在內核碼:/include/linux/usb/hcd.h
device:
/driver/usb/dwc2 /*usb2.0*/ /driver/usb/dwc3 /*usb3.0 <host.c>*/
driver:
/drivers/usb/host/ehic.c /*usb2.0*/ /drivers/usb/host/xhic.c /*usb3.0*/
2.4、gadget
代碼位於:
/drivers/usb/gadget | `-----function /*gadget driver code*/ | `-----udc /*DCD code*/
3、查看device與driver是否綁定
cd /sys/bus/platform/devices/[device_name] ls -l #看到如下類似內容 driver -> ../../../bus/platform/drivers/[device_name] #設備與驅動成功綁定