1为什么用WINUSB?
据说WINUSB是免驱的,那HID也是免驱的,用HID不是一样吗?
不一样! HID采用中断传输,传输速度上不去,如果是使用的是USB2.0 FULL speed,那速度更低,可能很多场合都满足不了了。但是WINUSB就不一样了,winusb可以采用批量传输,数据吞吐量大大提高。(HID理论速度:1000*19*64Byte/s, 1ms传输1次, 1次传输19个DAT事务, 1个DAT事务最大64B,好像也不慢了)
2 WINUSB对下位机的要求
我参考了2个例子,一个老外的一个国内的。都 是在stm32上实现WINUSB功能,我大概看了下程序,并认真分析了,这2个例子都是从STM32 CDC例子修改来的, 最主要的就是增加了下面3个描述符,
OS 字符串描述符 设置扩展兼容 ID OS 特征描述符包 注册设备接口 GUID property描述符
uint8_t *USBD_WinUSBOSStrDescriptor(uint16_t *length);
uint8_t *USBD_WinUSBOSFeatureDescriptor(uint16_t *length);
uint8_t *USBD_WinUSBOSPropertyDescriptor(uint16_t *length);
同时修改了很多描述符,以适应WINUSB,
(以上只是从理论分析,并没有在板子上实现!)
(后记:上面3个新加的描述符,第1个StrDescriptor是字符串描述符,其它2个都是标准请求设备中的描述符,因此加的位置也不一样,第1个直接加在设备类中, 后2个理论上是应该加在usb core层中,但是为了兼容性考虑,加在usb_conf配置层中也是合适的,这也是canable中的做法。20220708)
参考WINUSB使用(附STM32Demo) - osc_tjdfnjyo的个人空间 - OSCHINA - 中文开源技术交流社区
https://github.com/MichaelTien8901/STM32WINUSB
WinUSB - 微软为所有 USB 设备提供的常规驱动程序_老瓦的笔记本-CSDN博客_winusb驱动
MDK WINUSB
MDK中也有一个WINUSB的例子,在这个目录下,我打开看了下,是在RTE下运行的,还要运行RTX,大部分程序看不到源码。这个之前没搞过,不熟悉,估计弄起来比较麻烦,就不研究了,
\Middleware\USB\Device\WinUSB_Echo