近日初涉M0的USB调试,发觉颇有乐趣,发一小帖,以作分享。
先说说USB的枚举。USB主机检测到USB设备插入后,就会先对设备复位,然后通过地址0与其通信,获取设备描述符。接着对设备又一次复位,设置设备地址,然后再次获取设备描述符,最后获取配置描述符。具体调试数据显示如下:
CTL
80 06 00 01
00 00 12 00
GET DESCRIPTOR
DI
12 01 10 01
00 00 00 08
16 04 42 c1
00 00 01 02
03 01
..
CTL
80 06 00 02
00 00 09 00
GET DESCRIPTOR
DI
09 02 22 00
01 01 00 a0
32
CTL
80 06 00 02
00 00 22 00
GET DESCRIPTOR
DI
09 02 22 00
01 01 00 a0
32 09 04 00
00 01 03 01
02 00 09 21
10 01 00 01
22 32 00 07
05 81 03 40
CTL
00 09 01 00
00 00 00 00
SET CONFIG
CTL
21 0a 00 00
00 00 00 00
SET IDLE
CTL
81 06 00 22
00 00 72 00
GET DESCRIPTOR
DI
05 01 09 02
a1 01 09 01
a1 00 05 09
19 01 29 03
15 00 25 01
95 03 75 01
81 02 95 01
75 05 81 01
代码详见BSP的Smpl_HID例程,HID_Init()初始化之后IN的处理函数是HID_SetInReport,实现按键按下发送鼠标移动的报文。
再谈谈设备搜索及读写。
首先调用HidD_GetHidGuid函数获取HID设备的GUID
HidD_GetHidGuid(&HidGuid);
然后利用SetupDiGetClassDevs获取设备信息集合,
最后用SetupDiEnumDeviceInterfaces及SetupDiGetDeviceInterfaceDetail获取设备详细信息,直到获得PID和VID跟自己的设备一致的设备。
查看M0程序,
#define USB_VID
0x0416
/* Vendor ID */
#define USB_PID
0x5020
/* Product ID */
搜索到设备之后利用CreateFile打开设备进行后续的工作就可以了。
当然需要SetupDiDestroyDeviceInfoList关闭信息集合。
简单做个界面调试一下。 |