USB HID EP0 Control Transfer

作者: proach ( )   2013-07-10 20:09:31
USB HID EP0理論上可以每 1ms傳送 64B (B for Byte, b for bit)
等於是 64KBps, 用 UART來傳需要 640,000bps才作得到,
這個是 full speed device就有的,現在有提供 USB interface
的 MCU幾乎都有做到 full speed.
我實作了一個,測出 58KBps,很可能是受到 CPU忙碌程度的影響?
也許是軟體效率不夠高?
為什麼不用 UART? 因為 COM Port 需要安裝 driver,而 HID 幾乎
所有的 OS都不用安裝 driver, 起碼主流的那幾個都不需要。
如果你作的系統經常會拿到新電腦上使用,用這招比隨身帶著
FT232R driver package方便多了 :)
所以我實作的東西,報給 OS的是 HID Keyboard, 但實際上是一個
MCU + ADC for sensors. 既然沒有keyboard的部分,所以回報 keyboard
的 firmware code都不用寫了。
比較麻煩的是軟體的部分,COM Port的應用程式在這邊相對簡單,
就是百年不變的寫法,但 HID會需要一些很底層的 API, 如果不想
鍛鍊那樣深的功力,可以直接使用網路上的資源,最有名的是 libusb。
還有很多個人分享的 DLL可以使用。
其實寫一次就知道了,幾乎各家 DLL的程序都差不多,首先要找到 device,
比對 PID, VID, 確認你要的 device, 執行 endpoint0 上的
SetFeature, GetFeature。前者是傳資料給 device, 後者是傳資料給host (PC)
firmware上實作Set Feature, Get Feature, 才能跟software配合上。
以上做完後,你就可以用 USB標準協定傳資料了。
補充一下,這樣做其實開發階段很不方便,一旦你用 break point停止 MCU
工作,理論上不會回應 USB了,所以 Host可能直接把裝置斷線,resume MCU後
又要重來一次 USB enumeration... 所以開發時候把 UART拉出來,走
USB + UART + JTAG 三重路線也不錯啦 orz
作者: wuonline   2013-07-10 22:37:00
推!
作者: ksmrt0123 (ksmrt)   2013-07-11 00:39:00
推推!
作者: deo2000 (800IM)   2013-07-11 00:40:00
推!對複雜的USB又多點認識,不過最後四行完全不懂
作者: ruemann (路人甲)   2013-07-11 12:49:00
最後面是說,DEBUG時,有可能會設定斷點,一旦進入斷點OS會認為USB已經離線了,如果你要繼續使用USB的話,要重新從頭跑一次
作者: ksmrt0123 (ksmrt)   2013-07-12 01:26:00
64B/1mS應該是interrupt transfer的限制, controltransfer應該可更快. 要再快就要用 bulk 因為 device端通常bulk有double buffering請問為何用 set feature, clear feature(?) 來實作想要的功能? 怎不自己定義vendor command就好? 還是HID不允許自訂vendor command? (抱歉我對HID不熟)hmm.... 我看到MS HIDClass Support Routines列表了...上面的問題當我沒問... 抱歉
作者: govert ( )   2013-07-12 23:21:00
其實不用另外Driver的常用方式就是3種. HID, MassStorage,跟Printer class. 都大同小異. 用習慣就好。不過data量要大的話,的確用bulk比較好,data可以到65535

Links booklink

Contact Us: admin [ a t ] ucptt.com