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