天天看點

Linux USB總線架構

USB 總線介紹

USB發展史:

USB(Universal Serial Bus ),通用串行總線,是一種外部總線标準,用于規範電腦與外部裝置的連接配接和通訊。USB是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯合提出的,自1996年推出後,已成功替代序列槽和并口,成為當今個人電腦和大量智能裝置的必配接口之一。

  • USB 1.0出現在1996年的,速度隻有1.5Mb/s。
  • 1998年更新為USB 1.1,速度也提升到12Mb/s,稱之為 “full speed”。
  • USB2.0規範是由USB1.1規範演變而來的。它的傳輸速率達到了 480Mbps ,稱之為“high speed”。
  • USB3.0提供了十倍于USB 2.0的傳輸速度和更高的節能效率,被稱為“super speed”。

各種型号USB接口的圖檔:(來源網際網路)

Linux USB總線架構

USB信号線:

USB接口有4根線,兩根電源線,兩根信号線。USB接口的輸出電壓和電流是:+5V 500mA

Linux USB總線架構

USB電源: 标有VCC、Power、5V、5VSB字樣

USB資料線:(正)DATA+、USBD+、PD+、USBDT+

USB資料線:(負)DATA-、USBD-、PD-、USBDT-

地線: GND、Ground

系統拓撲結構:

對于每個USB系統來說,都有一個稱為主機控制器的裝置,該控制器和一個 根 Hub 作為一個整體。這個根Hub下可以接多級的Hub,每個子Hub又可以接子Hub。每個USB裝置作為一個節點接在不同級别的Hub上。 每條USB總線上最多可以接127個裝置。

Linux USB總線架構
Linux USB總線架構

常見的USB主要制器規格:

OHCI:主要是非PC系統上的USB晶片

UHCI:大多是 Intel 和 Via 主機闆上的 USB 控制器晶片。他們都是由USB1.1規格的。

EHCI:由 Intel 等幾個廠商研發,相容 OHCI 和 UHCI ,遵循USB2.0規範。

USB 協定分析

USB裝置邏輯結構:

在USB裝置的邏輯組織中,包含 裝置、配置、接口 和 端點 4個層次。裝置通常有一個或多個配置,配置通常有一個或多個接口,接口有零或多個端點。

Linux USB總線架構

每個USB裝置都可以包含一個或多個配置,不同的配置使裝置表現出不同的功能組合,配置由多個接口組成。在USB協定中,接口代表一個基本的功能,一個功能複雜的USB裝置可以具有多個接口,而接口是端點的彙集。

舉例說明:

一個USB播放器帶有音頻,視訊功能,還有旋鈕和按鈕。

配置1:音頻(接口)+旋鈕(接口)

配置2:視訊(接口)+旋鈕(接口)

配置3:音頻(接口)+視訊(接口)+按鈕(接口)

音頻接口,視訊接口,按鈕接口,旋鈕接口均需要一個驅動程式。

USB裝置中的唯一可尋址的部分是裝置端點,端點的作用類似于寄存器。每個端點在裝置内部有唯一的端點号,這個端點号是在裝置設計時給定的。主機和裝置的通信最終都作用于裝置上的各個端點。每個端點所支援的操作都是單向的,要麼隻讀,要麼隻寫。

USB描述符:

在每一個USB裝置内部,包含了固定格式的資料,通過這些資料,USB主機就可以擷取USB裝置的類型、生産廠商等資訊。這些固定格式的資料,我們就稱之為USB描述符。

标準的USB裝置有 5種 USB描述符: 裝置描述符,配置描述符,接口描述符,端點描述符,字元串描述符。

1、裝置描述符:

一個USB裝置隻有一個裝置描述符,裝置描述符長度為18個位元組,參考《USB specification : Table-9.8》。

Linux USB總線架構

2、配置描述符:

USB配置描述符長度為8個位元組,格式參考《USB specification :Table-9.10》。

Linux USB總線架構

3、接口描述符:

USB接口描述符長度為8個位元組,參考《USB specification Table-9.12》。

Linux USB總線架構

4、端點描述符:

USB端點描述符長度為7個位元組,參考《USB specification :Table-9.13》。

Linux USB總線架構

USB資料通訊

1、USB的資料通訊首先是基于傳輸(Transfer)的,傳輸的類型有:中斷傳輸、批量傳輸、同步傳輸、控制傳輸。

Linux USB總線架構

2、一次傳輸由一個或多個事務(transaction)構成,事務可分為:In事務,Out事務,Setup事務。

Linux USB總線架構

3、一個事務由一個或多個包(packet)構成,包可分為:令牌包(setup)、資料包(data)、握手包(ACK)和 特殊包 。

Linux USB總線架構

4、一個包由多個域構成,域可分為:同步域(SYNC),辨別域(PID),位址域(ADDR),端點域(ENDP),幀号域(FRAM),資料域(DATA),校驗域(CRC)。

Linux USB總線架構

USB裝置枚舉

USB裝置在正常工作以前,第一件要做的事就是枚舉。枚舉是讓主機認得這個USB裝置,并且為該裝置準備資源,建立好主機和裝置之間的資料傳遞通道。

枚舉的過程:

Linux USB總線架構

Linux USB 系統架構

開發闆既可以作為USB主機使用,也可以作為USB裝置來使用。

開發闆作為USB主機使用:

Linux USB總線架構

在啟動了開發闆的Linux系統之後,可以将U盤插入開發闆上的USB口上,這樣開發闆就可以作為主機使用。可以使用MassStorage驅動。

MassStorage驅動

核心驅動設定:

1、主要制器驅動設定

Linux USB總線架構

2、裝置驅動

Linux USB總線架構

3、其他配置

Linux USB總線架構
Linux USB總線架構
Linux USB總線架構
Linux USB總線架構

在開發闆上挂載使用U盤

在U盤插入開發闆之後,執行指令:

mount /dev/uba /mnt/

挂載U盤,然後通過 ls /mnt/ 指令就可以檢視U盤的檔案

開發闆作為USB裝置使用:

在開發闆連接配接到電腦時,就可以作為USB裝置來使用,可以使用 Gadget驅動,該驅動可以把開發闆作為網口、序列槽等裝置來使用。

Linux USB總線架構

RNDIS驅動(Gadget驅動的一種)

1、控制器驅動

Linux USB總線架構

2、Gadget驅動

Linux USB總線架構

在上圖的例子中,将USB裝置作為一個網口來使用。将編譯之後的核心子產品 .ko 檔案拷貝到開發闆中,加載子產品。

執行 如下指令:

Linux USB總線架構

在計算機的裝置管理器中會發現多了一個裝置:

Linux USB總線架構

右擊選擇更新驅動裝置,選擇從計算機的裝置驅動程式清單中安裝,裝置類型選擇網絡擴充卡,廠商做如下選擇:

Linux USB總線架構

在安裝了驅動之後,就可以在計算機的網絡中發現開發闆的連接配接,多了一個網卡。RNDIS驅動在計算機上将USB口模拟成網口,同時RNDIS驅動在開發闆上也将USB口模拟成網口,這樣就實作了計算機與開發闆通過USB的網口連接配接。

設定計算機的IP位址,在開發闆上執行ping指令,就可以ping通計算機。

繼續閱讀