Tuesday, August 26, 2014

USB 簡介[8] - USB Class

USB Class是指USB上層的應用。因為USB其實只是一個Transport layer,就像是TCP/UDP一樣,所以它還必須定義上層應用的通訊協定。最有名的當然就是Mass Storage Class,也就是大家都會用的隨身碟所採用的USB Class。

下面是架構圖:



當然,你也可以實做你自己的上層應用,但是問題是HOST端的driver要誰來提供?現在主流的HOST作業系統就有Windows、MAC OS、跟Linux,要針對這些作業系統提供對應的driver,事實上是件很大的工程。

因為有driver的問題,所以目前大部分的作業系統其實都已經內建一些USB Class的driver,Mass Storage Class不用說,一定支援。也因為這樣,基本上你只需要管device端的事情就可以。但是呢,事情往往不是這樣子的,所以還是會遇到一些跟HOST端有關的問題,這時候就得開始debug了,這就是所謂的相容性測試...。


Friday, August 15, 2014

USB 簡介[7] - Zero Length Packet

Zero Length Packet這個概念很有趣,主要是Device或Host可以發出長度為0的資料封包。為什麼會需要這種東西?

USB的transaction傳輸最大不能超過該endpoint的maximum packet size,那如果這次傳輸資料小於maximum packet size呢?那這筆資料就叫『short packet 』。如果是剛剛好等於maximum packet size呢?那就有點問題了:到底要不要繼續發出In-Token或Out-Token呢?所以USB定了一個Zero Length Packet這種東西,來告訴HOST這筆『transfer』已經結束了。

這種狀況特別容易發生在不知道要收多少資料的狀況下,舉個例子,假設bulk-in endpoint的maximum packet size是512 bytes。而HOST應用程式不知道要收多少資料的狀況下,它可能會跟HOST說他要一次收8MB的資料,反正應用程式記憶體不用錢。假設這次剛好Device只會傳2MB的資料,那HOST就很尷尬了:在不知道到底Device會不會繼續傳的前提下,只能繼續發In-Token,如果這時Device死不傳資料,雙方就準備等到天荒地老吧。

為了避免這種狀況出現,只好搞出Zero Length Packet這種東西。他其實就是一種『short packet 』,但是資料長度是『0』。HOST收到Zero Length Packet或short packet之後,就可以把這次的傳輸結束,然後跟應用程式報告。

至於什麼狀況下應該發Zero Length Packet?好像沒標準,都是看雙方的實做,也就是相容性...。為了保險,你可以每次都發,但是這會浪費一點頻寬。

下圖是有『short packet 』的狀況,大部份的傳輸都是這種:

下圖是沒有『short packet 』的狀況,但是因為剛好整個傳輸等於應用程式要的,所以還是可以收到:

下圖是沒有『short packet 』的狀況,因為收不到預期的資料量,所以USB Host Driver根本就不會結束,所以應用程式就一直等在那邊 :

下圖是有『short packet 』的狀況,就算沒收到預期的資料,還是可以結束這次的傳輸 :



codeblock