Linux那些事儿 之 戏说USB(3)我是一棵树
它主要包括了USB連接、USB host controller和USB device三個部分。而USB device還包括了hub和功能設備等。下面還是逐個說說吧。
什么是USB controller?在一個USB系統中只能有一個host,其實說白了就是咱們的主機,而USB和主機的接口就是host controller,你的主機總不可能只能有一個USB host controller吧,所以說一個主機可以支持多個host controller,比如分別屬于不同廠商的。那么USB host controller本身是做什么的?這個問題復旦人甲兄弟說的太精彩了,我還是直接拿來吧。controller,控制器,顧名思義,用于控制,控制什么,控制所有的usb設備的通信。通常計算機的cpu并不是直接和usb設備打交道,而是和控制器打交道,他要對設備做什么,他會告訴控制器,而不是直接把指令發給設備,然后控制器再去負責處理這件事情,他會去指揮設備執行命令,而cpu就不用管剩下的事情,他還是該干嘛干嘛去,控制器替他去完成剩下的事情,事情辦完了再通知cpu。否則讓cpu去盯著每一個設備做每一件事情,那是不現實的,那就好比讓一個學院的院長去盯著我們每一個本科生上課,去管理我們的出勤,只能說,不現實。所以我們就被分成了幾個系,通常院長有什么指示直接跟各系領導說就可以了,而系主任就會去安排下面的人去執行具體的任務,完了之后他們就會像院長匯報。
那么hub是什么?還是拿復旦人甲現成的答案吧,不能怪我不努力,只是復旦人甲說的太精彩了。在大學里,有的宿舍里網口有限,但是我們這一代人上大學基本上是每人一臺電腦,所以網口不夠,于是有人會使用hub,讓多個人共用一個網口,這是以太網上的hub,而usb的世界里同樣有hub,其實原理是一樣的,任何支持usb的電腦不會說只允許你只能一個時刻使用一個usb設備,比如你插入了u盤,你同樣還可以插入usb鍵盤,還可以再插一個usb鼠標,因為你會發現你的電腦里并不只是一個usb接口。這些口實際上就是所謂的hub口。而現實中經常是讓一個usb控制器和一個hub綁定在一起,專業一點說叫集成,而這個hub也被稱作root hub,換言之,和usb控制器綁定在一起的hub就是系統中最根本的hub,其它的hub可以連接到她這里,然后可以延伸出去,外接別的設備,當然也可以不用別的hub,讓usb設備直接接到root hub上。
而USB連接指的就是連接device和host(或hub)的四線電纜。電纜中包括的VBUS(電源線)、GND(地線)還有兩根信號線。USB系統就是通過VBUS和GND向設備提供電源的。主機對連接的USB設備提供電源供其使用,而每個USB設備也能夠有自己的電源。
咱們的USB大樹要想茁長成長也離不開USB協議。USB總線是一個單主方式的實現,是一種輪詢方式的總線。2.0協議規定所有的數據傳輸都必須由主機發起,host controller初始化所有的數據傳輸,各種設備緊緊圍繞在主機周圍。
USB通信最基本的形式是通過USB設備里一個叫 endpoint 的東東,而主機和endpoint之間的數據傳輸是通過 pipe 。有關 endpoint 和 pipe ,復旦人甲同樣也有精辟的見解:endpoint就是通信的發送或者接收點,你要發送數據,那你只要把數據發送到正確的端點那里就可以了。之所以U盤有兩個 bulk 端點,是因為端點也是有方向的,一個叫做 Bulk? in,一個叫做 Bulk? out,從usb主機到設備稱為out,從設備到主機稱為in。而管道,實際上只是為了讓我們能夠找到端點,就相當于我們日常說的郵編地址,比如一個國家,為了通信,我們必須給各個地方取名,完了給各條大大小小的路取名,比如你要揭發你們那里的官員腐敗,你要去上訪,你從某偏僻的小縣城出發,要到北京來上訪,那你的這個端點(endpoint)就是北京,而你得知道你來北京的路線,那這個從你們縣城到北京的路線就算一條管道。有人好奇的問了,管道應該有兩端吧,一個端點是北京,那另一個端點呢?答案是,這條管道有些特殊,就比如上訪,我們只需要知道一端是北京,而另一端是哪里無所謂,因為不管你在哪里你都得到北京來上訪。沒聽說過你在山西你可以上訪,你要在寧夏還不能上訪了,沒這事對吧。嚴格來說,管道的另一端應該是usb主機,即前面說的那個host,usb協議里邊也是這么說的,協議里邊說pipes代表著一種能力,怎樣一種能力呢,在主機和設備上的端點之間移動數據,聽上去挺玄的。
端點不但是有方向的,而且這個方向還是確定的,或者in,或者out,沒有又是in又是out的。你到北京就叫上訪,北京的下來就叫慰問。有沒有特殊的呢,看你怎么去理解0號端點了,協議里規定了,所有的USB設備必須具有端點0,它可以作為in端點,也可以作為out端點,USB系統軟件利用它來實現缺省的控制管道,從而控制設備。端點也是限量供應的,不是想有多少就有多少的,除了端點0,低速設備最多只能擁有2個端點,高速設備也最多只能擁有15個in端點和15個out端點。這些端點在設備內部都有唯一的端點號,這個端點號是在設備設計時就已經指定的。
為什么端點0就非要那么的個性那?這還是有內在原因的。管道的通信方式其實有兩種,一種是stream的,一種是message的,message管道要求從它那兒過的數據必須具有一定的格式,不是隨便傳的,因為它主要就是用于主機向設備請求信息的,必須得讓設備明白請求的是什么。而stream管道就沒這么苛刻,要隨和多了,它對數據沒有特殊的要求。協議里說,message管道必須對應兩個相同號碼的端點,一個用來in,一個用來out,咱們的缺省管道就是message管道,當然,與缺省管道對應的端點0就必須是兩個具有同樣端點號0的端點。
USB endpoint有四種類型,分別對應了四種不同的數據傳輸方式。它們是控制傳輸(Control Transfers),中斷傳輸(Interrupt Data Transfers),批量傳輸(Bulk Data Transfers),等時傳輸(Isochronous Data Transfers)。控制傳輸用來控制對USB設備不同部分的訪問,通常用于配置設備,獲取設備信息,發送命令到設備,或者獲取設備的狀態報告。總之就是用來傳送控制信息的,每個USB設備都會有一個endpoint 0的控制端點,內核里的USB core使用它在設備插入時進行設備的配置。
中斷傳輸用來以一個固定的速率傳送少量的數據,USB鍵盤和USB鼠標使用的就是這種方式,USB的觸摸屏也是,傳輸的數據包含了坐標信息。
批量傳輸用來傳輸大量的數據,確保沒有數據丟失,并不保證在特定的時間內完成。U盤使用的就是批量傳輸,咱們用它備份數據時需要確保數據不能丟,而且也不能指望它能在一個固定的比較快的時間內拷貝完。
等時傳輸同樣用來傳輸大量的數據,但并不保證數據是否到達,以穩定的速率發送和接收實時的信息,對傳送延遲非常敏感。顯然是用于音頻和視頻一類的設備,這類設備期望能夠有個比較穩定的數據流,比如你在網上QQ視頻聊天,肯定希望每分鐘傳輸的圖像/聲音速率是比較穩定的,不能說這一分鐘對方看到你在向她向你深情表白,可是下一分鐘卻看見畫面停滯在那里,只能看到你那傻樣一動不動,你說這不浪費感情嘛。
總結
以上是生活随笔為你收集整理的Linux那些事儿 之 戏说USB(3)我是一棵树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 炸到中国边境口岸了,缅军或全面溃败!当年
- 下一篇: Linux那些事儿 之 戏说USB(4)