Tuesday, July 22, 2014

USB 簡介[5]

接下來是protocol layer。

第一,USB是little endian,不管是Byte或是Bit順序。

第二,免不了是一堆封包的格式規範,這個看看就好。比較重要的有:

  • SOF(Start of Frame):SOF很重要,對HOST而言。如果你是作Device端的,看看就好。SOF基本上只有HOST可以發,如果是HS的話,是每125us發一次,每個裝置都要去聽SOF,因為後面就會開始資料傳輸了。FS的話是1ms發一次。
  • HandShake封包:基本上就是收到資料回ACK,沒有資料回NAK(不是資料錯誤喔)。有問題回STALL,下一次的資料來不及準備,回NYET(但是這一次的已經收下)。ERR我沒見過,因為是HUB專用。
  • HOST要讀資料之前,一定會發 In-Token,然後Device吐資料。注意喔,HOST在收到資料後,是不能回NAK的。這是因為HOST沒空間可以存資料幹嘛發In-Token?
  • 同理,HOST要寫資料之前,一定會發Out-Token,然後吐資料給Device。
  • Control Endpoint的資料傳輸比較特別,如果是Control In的話,順序是Setup packet --> Data In --> 0 byte Data Out --> Device Ack。如果是Control Out的話,順序是Setup packet --> Data Out --> In-token --> Device send 0 byte data --> HOST Ack。至於為什麼要定這麼奇怪的協定,我也不清楚...。一般工程師很容易犯的錯誤就是在Control Out的時候,最後沒發0 byte的資料,然後HOST就等在那邊,然後還會怪HOST沒做對...。
  • 其他傳輸類型都是 In/Out Token --> Data --> ACK。Isochronous傳輸沒有ACK。
第三,如果資料有錯誤,HOST會嘗試重傳三次。當然,這個對Isochronous傳輸不適用。基本上錯誤處理大多是硬體方面的處理,軟體能派上用場的機會不高。我遇過最好玩的一個錯誤是,Device沒等HOST的In-Token來就把資料送到BUS上了,結果就是babble錯誤。這個也很容易發現,用USB Analyzer抓log,它就會幫你把錯誤標示出來。千萬不要用什麼軟體USB Analyzer,這些軟體通常只能用來紀錄上層通訊協定的資料,對底層是無能為力的,而且它們還不會幫你檢查錯誤。現在一台USB Analyzer很便宜,網路上看到一台"Mercury T2 Protocol Suite"才特價台幣七八萬塊,這台十年前可是要價台幣一百萬呢。它已經這麼便宜了,沒必要再省了...。

3 comments:

Ho YuanHou said...

謝謝您的大作,是不是也能寫一下otg?最近一直抓不到問題的成因

OD said...

不好意思,我沒碰過OTG....恕我無法幫助你。

MM said...

大推經驗, 但需要有一定基礎才看得懂XD

codeblock