2008年12月5日 星期五

USB DIY-- 自學計畫(四)

好吧....既然我們已經能掌握原廠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. 改寫原廠的USB應用程式


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

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

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

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

6.USB DIY-- 自學計畫(三)

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

2 則留言:

  1. 您好....想請教一下用什麼軟體去擷取USB資料
    要怎麼知道USB 裏面我要的東西是哪一個代碼 (例如VB或...............)
    希望你不吝指教.....謝謝 ^ ^
     

    回覆刪除
    回覆
    1. 如果您要問我此篇文章中的畫面的話~那個是搭配硬體設備的軟體!
      沒有那個硬體設備,是不能用的軟體...那是USB 分析儀的軟體。
      至於第二個問題...有點搞不懂您的問題?!您是說要懂USB 要學什麼代碼?!
      那您就努力辛苦一點:到我的另一個網頁慢慢的K 一下USB 的基礎觀念吧!
      http://www.usblab.idv.tw/phpbb2/viewtopic.php?t=2442&sid=0b116068ad670bbed4825b81df4067bc
      ....

      http://chamberplus.myweb.hinet.net/usb.htm

      刪除