會員登入 新使用者?立即註冊

學無止境--- 無論是電子技術或是以外的領域---溫故知新,精益求精。還有賈老師的作品,可以讓我這個充滿科技,較生硬的部落格有一點人文的氣息!---- 賈老師的真老公! -- -

關閉
你好,歡迎參觀ChamberPlus的部落格! 我要留言

USB DIY-- 自學計畫(四)

分類:USB DIY
2008/12/05 23:53

好吧....既然我們已經能掌握原廠USB Controller 在USB 的控制流程的話。

當然,不是這樣子就沒有事了,因為我們是不可能每個案子都只是拿著原廠的範例程式來搞案子吧。

否則,這樣子就有點囫圇吞棗...您下回碰到一些想法比較奇怪的應用時,

您就不懂得如何變化應用啊....市面上買得到的IC ,您買得到,別人也買得到...

那您如何凸顯您本身系統應用功力呢?!...否則,您下回又得另外找一些有沒有剛好現成的原廠

就可以符合您的應用需求?!....這樣子,也未免太累了一點吧?!...

這麼累....乾脆就去原廠IC 設計公司好了...您看他們會不會一天到晚都在幫您開新IC啊?!

所以啦...我們就開始嘗試修改一下原廠的範例程式:

首先是我就把電腦上面一大堆有USB 裝置的周邊全拿掉。以免得一些USB 干擾我的USB傳輸資料。

現在才發現要買PS2 滑鼠或鍵盤還越來越難買了...還讓我真懷念這種介面。

(所以,您就可以看到我以下的USB 資料就乾乾淨淨了...就只有我一個USB 裝置在電腦上面!

沒有那種PRE...低速裝置周邊了...)

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

首先我們也把那些寫Flash 的流程也拿掉...免得寫FLASH 時間,掐住USB 速度。

然後我們也把傳輸的檔案從原來4096 Bytes 把他減為1024 Bytes,

只要能通...管他多少傳輸多少長度啊?!...只不過,這一部份您是要去改原廠所附的

PC 端的應用程式。...不好意思的是:VC++ 的MFC,這可別怪我說:從以前就在說VC++了,

至於,您是學VB 的...嘿...嘿...我也不知道如何處理?!...

您也該不會從頭要自己搞起吧?!...這個時代搞電子就得靠別人的資源了啊!

OK...要改成 1024 Bytes 的話,您第一組Bulk-Out Command 中,就要重新定義長度為0x0400了!

當然啊因為我們把USB Device 中跟USB傳輸無關的應用程式全拿掉,

我們也可以發現可以加速USB 的傳輸速率的只不過是:他的USB Bulk out 是用Endpoint 1,

他的Buffer 只有128 Bytes ...所以啦...他每傳兩筆(packets) ,就得停下來,

然後MCU 再一個Bytes ,一個Bytes 慢慢的往外搬出來(雖然他的MCU 是跑 50 Mhz...)

看起來也還是比不上PC 端的USB 傳輸速率的(第一與第二為#27 及#30 ...第三個因為

Buffer 滿了...他就等到#146 ...才有機會再接收另一筆Bulk-Out...)

所以啦,您不要以為老是講USB 速度還不夠快?!...真的您在USB Device 端的處理能力,

真的跟得上USB 真正的傳輸速率嗎?!....這個還只是USB 1.1的規格而已罷了,

所以呢?!...您就更不用說那種還要一來一往的HID 啦...

這是USB Controller 在先天上的許多限制,您知道的在IC 內部的SRAM (Buffer)的成本是很貴的啦!

若搞的DMA...也不知道客戶要用在哪?!...所以在設計上也不可行的!

您看:我們光只是研究探討USB 的Bulk Transfer 就可以這麼瞭解人家USB Controller 的基本架構了。

---

接下來,我們也把那個塞在中間的Bulk-in (只回個0xFF一個Bytes 也拿掉...)

好吧,我就順便回答一下別人提的問題...您說這個是要確認USB Device 有沒有真的去處理這一筆

Bulk -Out 資料?!...好吧!就算很不幸的,您發現不是0xFF...發現錯誤了!

您的PC 端的Bulk Out 可以停下來嗎?!....

您要如何中途中斷這個一開始就定義的 0x400 的長度啊?!

(注意喔 ...萬一您傳的是那種幾MBytes...如果還停在PC 端上層還好...

萬一是停在USB 的底層怎麼辦?!....當然還有機會解的啦...不過,是比較麻煩的...

所以,我才說那個突然加進來的 Bulk-in 真的看不出他的意義?!...)

倒還不如....就讓他劈里啪啦...先傳完再說...再利用另一個命令來詢問還比較實際吧?!

----純個人觀點,接不接受,就看各位的USB 功力了吧!至少我玩過這麼多顆不同廠牌的

USB Controller ,覺得有點經驗的感覺吧!

OK ...您就可以很快的看到:我這一組Bulk-Out 在短短的幾個Packet 就傳完了(Packet #205)。

不難吧...您自個兒也可以試試看吧。

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

後記:好吧,我們來看這個應用來說:因為他是用一個3 Bytes 的Command Set 來啟動

Bulk -Out Transaction,中間還塞了Bulk -In 做為中間檢查機制。

原廠這個範例程式有一個比較缺乏的範例是:他沒有提供所謂Control Endpoint 0 的

Vendor Command 部分....因為反正您都已經是掛自己的驅動程式了,

其實可以使用Control Endpoint 0 中的Vendor Command 來讓整個USB Transaction,

更具有使用上的彈性...只不過,這個作法,在USB Device 的韌體端要實現是比較容易的。

PC 端就比較辛苦了...這部分是要動到USB 底層的驅動程式:就是原廠所附的那支驅動程式。

可不是指Microsoft 的那個更底層的USB 驅動程式喔。

如果有Control Endpoint 0 的Vendor Command 會讓我們在USB 通訊協定上更具有彈性啊。

因為我們在這個範例中的那個 3 bytes Command Bulk -out 就可以移到Vendor Command 中

處理了,在Bulk-Out 的韌體程式就比較單純一點了...您可以稍微思考一下原因。

這一部份就留給大家去思考與實驗了吧!謝謝!

(待續)...
 

上一篇 下一篇
回應(1)
引用(0)
雅虎資訊 版權所有 © 2009 Yahoo! Taiwan All Rights Reserved
「本服務設有管理員」 服務條款 隱私權政策