usb驅動開發1之學習準備

無痕幽雨發表於2018-01-08

出處:http://www.cnblogs.com/myblesh/p/3634702.html

此係列是http://blog.csdn.net/fudan_abc/博文的整理,同時加入了自己的理解。很敬佩fudan_abc的文章,仔細學習和分析受益很多。注:fundan_abc所分析linux核心程式碼所用的版本是2.6.22.6。

Q:學習linux下的usb通訊要怎樣進行?

熟悉linux驅動開發,同時需要了解usb協議規範,對照linux下的usb驅動程式碼慢慢分析和學習

Q:為什麼要開發usb?

在usb出現以前,裝置介面多樣化(有串列埠、並口等),而usb可以實現這些介面的統一和標準化,USB是為了解決速度、擴充套件能力、易用性應景而生的

Q:usb規範的發展經歷了哪些?

Usb的發展經歷了1.0、1.1、2.0(在2009年之前)三個階段。控制器OHCI和UHCI雖然支援的都是1.1的控制器,但是支援的硬體範圍不一樣。每個USB2.0 控制器帶有3個晶片,根據裝置的識別方式將訊號傳送到正確的控制晶片。我們可以將1.1裝置連線到2.0的控制器上使用,不過它只能達到1.1的速度。同時也可以將2.0的裝置連線到1.1的控制器上,不過不能指望它能以2.0的速度執行。ehci-hcd模組支援的是USB2.0控制器的高速模式.(參考Linux對USB1.1和2.0都是支援的,通過看drivers/usb/host目錄下的Kconfig檔案,我們可以知道核心裡支援的控制器。)

Q:usb匯流排拓撲什麼結構?

樹形結構

clip_image002

Q:usb資料怎樣傳輸?

USB大樹要想茁長成長也離不開USB協議。USB匯流排是一個單主方式的實現,是一種輪詢方式的匯流排。協議規定所有的資料傳輸都必須由主機發起,host controller初始化所有的資料傳輸,各種裝置緊緊圍繞在主機周圍。

USB通訊最基本的形式是通過USB裝置裡一個叫endpoint的端點(可以理解為硬體暫存器或者buff),而主機和endpoint之間的資料傳輸是通過pipe,pipe通訊有兩種,一種是stream,另一種是message,協議中規定:message管道要求從它那兒過的資料必須具有一定的格式,message管道必須對應兩個相同號碼的端點,一個用來in,一個用來out,我們們的預設管道就是message管道,當然,與預設管道對應的端點0就必須是兩個具有同樣端點號0的端點。

Q:usb資料傳輸有哪些型別?

USB endpoint有四種型別,分別對應了四種不同的資料傳輸方式。它們是控制傳輸(Control Transfers),中斷傳輸(Interrupt Data Transfers),批量傳輸(Bulk Data Transfers),等時傳輸(Isochronous Data Transfers)。從usb裝置端來看,也可以把端點分為四種型別為控制端點、中斷端點、批量端點、等時端點。

控制傳輸用來控制對USB裝置不同部分的訪問,通常用於配置裝置,獲取裝置資訊,傳送命令到裝置,或者獲取裝置的狀態報告。總之就是用來傳送控制資訊的,每個USB裝置都會有一個endpoint 0的控制端點,核心裡的USB core使用它在裝置插入時進行裝置的配置,它會一種等待著USB core傳送控制命令。

中斷傳輸用來以一個固定的速率傳送少量的資料,USB鍵盤和USB滑鼠使用的就是這種方式,USB的觸控式螢幕也是,傳輸的資料包含了座標資訊。

批量傳輸用來傳輸大量的資料,確保沒有資料丟失,並不保證在特定的時間內完成。U盤使用的就是批量傳輸,我們們用它備份資料時需要確保資料不能丟,而且也不能指望它能在一個固定的比較快的時間內拷貝完。

等時傳輸同樣用來傳輸大量的資料,但並不保證資料是否到達,以穩定的速率傳送和接收實時的資訊,對傳送延遲非常敏感。顯然是用於音訊和視訊一類的裝置,這類裝置期望能夠有個比較穩定的資料流,比如你在網上QQ視訊聊天,肯定希望每分鐘傳輸的影象/聲音速率是比較穩定的,不能說這一分鐘對方看到你在向她向你深情表白,可是下一分鐘卻看見畫面停滯在那裡,只能看到你那傻樣一動不動,你說這不浪費感情嘛。

Q:usb系統是怎樣的一個層次?

clip_image004 
一個完整usb系統應該實現上圖各個部分。圖裡主要顯示了四個層次,USB物理裝置(USB Physical Device)、客戶軟體(Client SW)、USB系統軟體(USB System SW)以及USB Host Controller。Host Controller看似在最低層,卻掌控著整個USB的通訊,你的USB裝置要想發揮作用,首先得獲得它的批准;系統軟體,只表示了系統裡支援USB的部分,也就是系統相關裝置無關的部分,相對於我們們的linux來說,就是usb core,並不包括所謂的各種裝置驅動;客戶軟體則指裝置相關,也就是對應於特定裝置的部分,你的USB鍵盤驅動、觸控式螢幕驅動什麼的都在這兒(專業來看,不能將客戶軟體簡單理解為上層應用,這裡和我們平時使用的客戶端應用軟體不同)。

有人會問?為什麼要分為這樣的三層?真的有三層嗎?

其實,從linux核心程式碼看,Host部分確實機分這三層,至於裝置分這三個層次完全是為了配合host(前面說過USB匯流排是一個單主方式的實現,所以裝置層次不得不配合host)。因此,站在不同的高度看到不同的風景,Host Controller看到的是一個個hub還有hub上的USB device,而在系統軟體的眼裡,看到的是邏輯裝置(站在不同的高度理解),客戶軟體看到的是裝置提供的功能。

Q:主機和裝置連線是什麼樣子?

clip_image006

在USB的世界裡,不僅僅有compound device,還有composite device,compound device是那些將hub和連在hub上的裝置封裝在一起所組成的裝置,而composite device是包含彼此獨立的多個介面的裝置。從主機的角度看,一個compound device和單獨的一個hub然後連線了多個USB裝置是一樣的,它裡面包含的hub和各個裝置都會有自己獨立的地址,而一個composite device裡不管具有多少介面,它都只有一個地址。上述是站在host controller的層次。

而對於系統軟體來說,沒有這麼複雜,所有的hub和裝置都是一個個的邏輯裝置。站的越高,看的越遠,往往如此簡單。

clip_image008

一個USB邏輯裝置就是一系列端點(endpoint)的集合,它與主機之間的通訊發生在主機上的一個緩衝區和裝置上的一個端點之間,通過管道來傳輸資料。意思就是管道的一端是主機上的一個緩衝區,一端是裝置上的端點。

clip_image010

最後,從協議規範中貼上一個更加詳細的圖

clip_image012



出處:http://blog.chinaunix.net/uid-28769229-id-4069430.html

Pipe
USB的pipe的兩端分別指的是USB host端的記憶體區域,和裝置端的endpoint。
pipe分為兩類,一類是stream pipe, 另一類是message pipe。
兩類的主要區別是,message pipe傳送的資料,都是usb協議裡規定好的結構,而steam pipe傳送的資料則沒有什麼要求。
還有一個重要的概念就是,message pipe要求IN和OUT,而且必須是一個endpoint支援IN,OUT,也就是要求全雙工。所以endpoint 0的control transfer就總是message pipe。但是隻能是endpoint 0可以使用control transfer麼?其實不是,除了endpoint 0之外,其實還可以有其他endpoint支援全雙工,這就根據裝置的支援了,一般這麼用的比較少。下面介紹control transfer的時候會介紹到。

Transfer
USB協議規定了4種transfer,分別為control transfer, isochronous transfer, bulk transfer, interrupt transfer.
一個transfer由多個transaction組成,一個transaction由多個packet組成。

control transfer
一個control transfer由SETUP, DATA, STATUS三種transaction組成,其中SETUP是由host -> device, STATUS是由device -> host。DATA是可有可無的,DA他的傳輸方向也是由SETUP裡去指定的。
control trnasfer屬於message pipe, 裡面傳輸的資料都是定義好了的結構體,比如set configuration之類。
一個device必須有一個control transfer,也就是使用的endpoint0,但是device不見得只有一個control transfer,也可以有其他的全雙工的endpoint去運作附加的control transfer。

SETUP transaction的資料都是USB協議定義好的結構體,這個結構體允許vendor指定自己的專門裝置的一些command。DATA transaction如果有的話,就跟在SETUP後面,其也有一個USB定義好的結構體,除非傳輸的是vedor指定的資訊。最後是STATUS transaction,這個也是有USB協議規定好的。

基於control transfer的endpoint決定了最大的packet大小,full-speed的裝置為8, 16, 32, 64個bytes, high-speed裝置支援64 bytes, low-speed為8bytes.這個包的最大size決定於wMaxPacketSize。這個wMaxPacketSize是在device descriptor裡,所以正確的讀取順序為,先讀8個bytes,解析後得到wMaxPacketSize後,再去用真實的size繼續操作。

還有一點,這個wMaxPacketSize,也就是max packet大小,指的是DATA transaction裡的真實data filed的size。像SETUP,STATUS這些transaction,都是USB定義好的,所以size也是固定的,所以就跟這個最大size沒有關係了。如果傳輸的資料大於packet的max size裡,那就分多個packet。

相關文章