USB HID EP0 Control Transfer

看板ASM作者 ( )時間11年前 (2013/07/10 20:09), 編輯推噓6(6011)
留言17則, 5人參與, 最新討論串1/1
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 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.221.214

07/10 22:37, , 1F
推!
07/10 22:37, 1F

07/11 00:39, , 2F
推推!
07/11 00:39, 2F

07/11 00:40, , 3F
推!對複雜的USB又多點認識,不過最後四行完全不懂
07/11 00:40, 3F

07/11 12:49, , 4F
最後面是說,DEBUG時,有可能會設定斷點,一旦進入斷點
07/11 12:49, 4F

07/11 12:50, , 5F
OS會認為USB已經離線了,如果你要繼續使用USB的話,要重新
07/11 12:50, 5F

07/11 12:50, , 6F
從頭跑一次
07/11 12:50, 6F

07/12 01:26, , 7F
64B/1mS應該是interrupt transfer的限制, control
07/12 01:26, 7F

07/12 01:27, , 8F
transfer應該可更快. 要再快就要用 bulk 因為 device
07/12 01:27, 8F

07/12 01:28, , 9F
端通常bulk有double buffering
07/12 01:28, 9F

07/12 01:29, , 10F
請問為何用 set feature, clear feature(?) 來實作想要
07/12 01:29, 10F

07/12 01:30, , 11F
的功能? 怎不自己定義vendor command就好? 還是HID不允
07/12 01:30, 11F

07/12 01:31, , 12F
許自訂vendor command? (抱歉我對HID不熟)
07/12 01:31, 12F

07/12 01:48, , 13F
hmm.... 我看到MS HIDClass Support Routines列表了...
07/12 01:48, 13F

07/12 01:48, , 14F
上面的問題當我沒問... 抱歉
07/12 01:48, 14F

07/12 23:21, , 15F
其實不用另外Driver的常用方式就是3種. HID, MassStorage,
07/12 23:21, 15F

07/12 23:22, , 16F
跟Printer class. 都大同小異. 用習慣就好。
07/12 23:22, 16F

07/12 23:23, , 17F
不過data量要大的話,的確用bulk比較好,data可以到65535
07/12 23:23, 17F
文章代碼(AID): #1HtKx-ya (ASM)