Saturday, July 19, 2014

USB 簡介[2]

USB就速度來分類的話,目前有四種:
  1. Low speed(LS): 最慢,只有1.5Mbps。
  2. Full speed(FS): 有點慢,12Mbps。
  3. High speed(HS): 快,480Mbps。
  4. Super speed(SS): 超快,5Gbps。這系列文章不會談到Super speed,因為我也沒做過。規格書是有唸過,但是不知道人家實際上是怎麼設計的。
HS必須下相容於FS。所以如果你的裝置是HS,很抱歉,你還得支援FS。一般而言,我們會把HS稱為USB2.0,這個基本上有點問題,因為USB2.0規格書還包含了FS跟LS。

在規格書裡,function這個名詞記一下,它對應到device端的功能部分,因為USB規定,一個裝置可以擁有超過一個的function,所以function有時候不等於device。至於compound device跟composite device的差別:compound device是一個實體裝置,但是它其實是一個hub跟多個function組成的,compound device的一個例子是一個支援hub的鍵盤。而composite device則是一個支援多個function的實體裝置,實際上的例子是現在的Android手機幾乎都同時支援MTP跟MSC功能,這種就是composite device。

compound device現實生活中比較難見,我猜原因是因為價錢因素吧。Hub功能比device難作多了,所以compound device會比一般的裝置貴,但是很難說服消費者用比較貴的價錢去買,因為hub的價錢已經被打爛了...。

接下來就是幾乎每個初學者都很頭痛的pipe。一開始看到規格書上的pipe,第一個想法一定是『它在講什麼』。要知道pipe是什麼,你得先從它整個架構上來看。而這也就是USB2.0規格第五章的核心:架構要先懂。

要了解一個架構,基本上不是bottom-up就是top-down方法。我是比較習慣用bottom-up的方式去了解,USB2.0規格則是用top-down方法。這裡我用bottom-up方法講。

USB2.0最底層的實體傳輸只有兩根線,D+跟D-,其他兩根是傳輸電力的,不用管。D+跟D-事實上是用來構成differential signal(台灣翻成差動訊號,後面都用這個名詞)。

差動訊號基本上就是用兩根訊號的準位差來表示一個準位。為什麼要用差動訊號呢?以前的訊號基本上都是用GND來當基準點,但是這會有缺點:萬一兩邊的GND準位不同,同一個電壓會對兩方有不同的意義。舉個例子,如果兩方一個GND 1.5V,一個0V,那萬一一方傳一個1.7V的訊號,一方會辨識成Low(0.2V),一方可能會變High(1.7V)。 差動訊號沒有這個困擾,而且抗干擾的能力變強,因為D+跟D-同時被干擾,但是相減就把干擾去掉了。另一個差動訊號的好處是,同樣的壓差,準位的差距可以變大,訊號的內容就可以變多,因為差距由(0V~5V)變成(5V ~ -5V)。因為差動訊號有這些優點,所以後來有很多的周邊都改為差動訊號了。

在這裡,你只要知道D+跟D-可以構成0跟1即可。實際上的0跟1準位判斷,USB2.0規格的第七章講得一清二楚。知道0跟1之後,往上層就是用這些0/1去構成一個個USB封包。這些封包的內容基本上就是說明這個封包要傳給哪個裝置,或者是由哪個裝置傳出來的。為什麼要這樣?這是因為USB是BUS架構,而實體傳輸又是只靠兩根線在傳輸,如果沒有封包的定址能力,雙方根本無法知道實體傳輸上的資料是要給誰啊。而USB並不滿足於裝置定址能力,它還規定每個裝置可以擁有特定的傳輸通道,也就是Endpoint,或者稱為Pipe(以下都用Endpoint稱呼)。Endpoint基本上是個虛擬的資料傳輸通道,它在USB Bus上其實也就是一個個封包,或者是一堆0/1的組合,但是人總是無法直接解譯0/1,所以越往上層越是抽象。所以下次人家跟你講Endpoint或者是Pipe時,不要再一臉狐疑了,這只會讓人家知道你不懂USB。

USB2.0規格對Endpoint型別有四種規範:

  1. Control
  2. Bulk
  3. Interrupt
  4. Isochronous

這四種基本上比較會用到的就是Control跟Bulk。Control Endpoint是雙向傳輸,其他三種都是單向傳輸,也就是說,如果你要雙向傳輸Bulk資料,你的裝置得支援兩個Bulk Endpoint才行。

在這邊又得提一個觀念,USB的資料傳輸方向一律是以HOST為視角,所以IN就是表示HOST要收資料、Device要寫資料。而OUT則是相反,HOST要寫資料、Device要收資料。

所以你會常常看到 Bulk-In、Bulk-Out、Interrupt-In、Interrupt-Out、Isochronous-In、Isochronous-Out這類的名詞。請搞清楚他們的方向性。要支援那些Endpoint是裝置端的責任跟權力。

一旦知道Endpoint,最上層的應用程式只要對這些Endpoint做讀寫就好,事情就變得比較簡單一點。而這也就是USB2.0的圖5-9所要表達的意思:每一層都把它自己的工作做好,事情會變得比較簡單。



No comments:

codeblock