此系列是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總線拓撲什么結構?
樹形結構
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系統是怎樣的一個層次?
一個完整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:主機和設備連接是什么樣子?
在USB的世界里,不僅僅有compound device,還有composite device,compound device是那些將hub和連在hub上的設備封裝在一起所組成的設備,而composite device是包含彼此獨立的多個接口的設備。從主機的角度看,一個compound device和單獨的一個hub然后連接了多個USB設備是一樣的,它里面包含的hub和各個設備都會有自己獨立的地址,而一個composite device里不管具有多少接口,它都只有一個地址。上述是站在host controller的層次。
而對於系統軟件來說,沒有這么復雜,所有的hub和設備都是一個個的邏輯設備。站的越高,看的越遠,往往如此簡單。
一個USB邏輯設備就是一系列端點(endpoint)的集合,它與主機之間的通信發生在主機上的一個緩沖區和設備上的一個端點之間,通過管道來傳輸數據。意思就是管道的一端是主機上的一個緩沖區,一端是設備上的端點。
最后,從協議規范中貼上一個更加詳細的圖