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 』的狀況,就算沒收到預期的資料,還是可以結束這次的傳輸 :



No comments:

codeblock