2008年12月4日 星期四

USB DIY-- 自學計畫(三)

當我們看過USB Enumeration 過程之後,接下來就要看USB Bulk Transfer部分。

一定很多人想急著進入所謂的HID Class,因為大家某種程度還是會畏懼PC 端

的USB Driver 問題。其實,大家都有點過渡緊張了...若要從USB 的基礎學起,

真的,除了基本的Control Token 之外,瞭解人家USB Controller 的基本架構,

應該是從USB Bulk 看起,而且就是因為也要瞭解整個USB 系統:

包括:USB 基本介面觀念外,PC 端的程式最好也稍微涉獵一下。

而從USB Control Token 再進入USB Bulk Transfer ...再進入HID 。

個人覺得會比較像循序漸進的方式。...原因很簡單:就是因為PC端的程式關係。

在USB 系統中:其實在PC 端的觀念,Bulk Transfer 是比較接近Control token 的。

因為:如果您扣掉Control Token 中的Setup Token與後面那組 之前的Zero Length In/Out 。

其實:他也就是Control Token 了...在PC 端的Driver 觀念:兩者也是比較接近的。

----

還有一點的是:這兩種程式架構:都是由PC 端的應用程式發起USB Transaction 的。

所以,您來解讀人家的程式時,會比較容易掌控一點。您PC 端不按"Start"...

USB 上面就是安安靜靜的...我們就以下圖為例來看:

現在PC 端的USB都已經到處插了一大堆周邊裝置:譬如滑鼠、鍵盤的...

結果您看:我們攔到USB 訊號時,已經一大堆低速裝置(HID) 來來回回的傳資料了。

而且還都是USB Device 端發起的...(圖中的Pre 就是低速裝置的PID...)

另外就是他已經先前一部佔據了USB Address 0x01 了...我們的USB只能從0x02 排起。

--------------------------------------------------------------------

以下的資料架構不是我定的...是人家原廠所附的範例程式:Bulk Transfer Example 。

我們看到了什麼?!...他全部都用Bulk In/Bulk out 來交換資料。

Endpoint 1 為Bulk In;Endpoint 2 為Bulk Out ,如果您瞭解我前文提到的觀念:

我們就應該從Bulk Out 部分先看起,因為由PC端第一發起,

而且可以全部都是Bulk Out Token。

(但是這個範例程式很不幸的:他還是在Bulk Out 過程中塞進了Bulk-in...

為什麼連寫範例程式都要整客戶呢?!存心讓別人覺得USB 真的很難的喔?!

-----

這種純Bulk Out/In 的東西有個東西很有名:就是隨身碟...他的Class 走的就是:

Bulk Only Transfer (BOT) 的 ...(當然也有所謂的CBI ...Control /Bulk/Interrupt )

但好像很少看到這一種-----這個就是我本文的前提啊!能單純使用Bulk 完成動作。

幹嘛還要拉個Interrupt 給自己寫程式麻煩呢?!...

我們看到了:他先利用一個短資料來發訊息給USB Device...

然後就批哩趴啦開始Bulk out 一大堆資料。

所以,很明顯的是:前面那個短資料:0x01 0x00 0x01 就是有點Command 的意思。

後面完整的就是真正要Bulk out 的資料。每一個Packet 均為64 bytes 。

這個範例中:他利用了一個簡單的Bulk -in (0xff) 來作資料Check ...

唉...真的脫褲子放屁...這不就是我們以前寫RS232 的觀念嗎?!

那USB裡面的那些 PID/Address/EndPoint/CRC....在幹什麼用?!...

就是幫我們處理這些是啊?!...在正常的Bulk Out 傳輸中...塞了這一個Bulk-In

 只會破壞USB DEVICE的韌體程序完整性,也讓PC 端程式複雜...

但對我們傳資料的準確性一點幫助都沒有...您看下圖中:他每傳完512 Bytes 時,

就要求Bulk-In 一個0xFF...幹嘛?!...只是讓整個USB Bus 的傳輸頻寬都在那傻傻的

回NAK.....NAK....Nak....Nak....Z..Z..Z..z..z..zz...(喔後面那個Z 代表我們睡著了!)


終於等到了....您看前面的Packet #...從2092 等到 11906...夠久了吧!(下圖中)

您不相信我說這個Bulk-in 一點都沒用的意思...我就最後一個Bulk Out/Bulk -in 來解釋:

您看下圖:當您Bulk- Out 完了之後...就回您的Bulk-In (0xFF)...

要幹嗎?!...Bulk Out 自己最後一個Token 不就是一個Ack 嗎?!...

那這個Bulk -in 0xFF 有要取代這個ACK 意味?!...

不好意思 ...人家那個ACK ...人家Microsoft 底層的Driver會幫您處理或重傳...

您這個BULK In 還要勞駕您的PC 軟體與USB Device 韌體耶...您也沒比微軟厲害啊?!

---

不過啦...這個程式鐵定傳輸效能很差的啦...這不是他的重點....

他只是要讓您瞭解什麼是純 Bulk Out/In 觀念。----

但您自己跑過一遍就可以很快的抓到訣竅了嗎?!.... ?! ... ???...?.. ?..

----

這個範例程式主要是用來Bulk 一些資料...但我要如何從Device 端驗證資料呢?!

答案就是:直接把傳輸資料寫進MCU 本身的Flash ROM裡面...

靠...直接韌體更新升級...太炫了...但很不幸的 ...原廠沒有提供快速的檢查、瀏覽工具程式。

對我們學他的USB Controller 又是一次的 Orz.....被打敗了!...

----

唉...幸好版主有先見之明...前兩天改寫了原廠的工具程式:

讓我們察看結果:快速又容易啊...學USB 真的是輕鬆上手啊。您說:是不是?!

(答案果然是我們所傳的固定格式的資料內容: 0x00 0x01 0x02.... 0x0F.....0xFF..)


----

不錯吧...跟版主學USB簡單容易吧... ....

(待續)!

----------------------

1. 改寫原廠的USB應用程式


2. 改寫原廠的USB應用程式(續一

3.改寫原廠的USB應用程式(續二)

4.USB DIY-- 自學計畫(一)

5.USB DIY-- 自學計畫(二)

7.USB DIY-- 自學計畫(四)

8.USB DIY-- 自學計畫(五)

1 則留言:

  1. 版主您好,關於這程式,我的想法是
    1. 會使用bulk in來傳送0xff, 我的解釋是為了確保out的資料一定是被處理過(就是寫入到flash當中), 所以PC才會每512B 要等待oxff來確定資料已經被處理.
    這樣的解釋不 知道是否正確?  
                 Miller 上
     
     
     
     

    回覆刪除