STM32F103C8T6的USB HID复合设备的实现要点

1,可从官网下载STM32_USB-FS-Device_Lib_V4.0,里面有Custom_HID例子参考。
可从Custom_HID修改得到。时刻记住“自己是STM32F10X_MD系列”以及“自己不是官方demo板”即可将无用的代码去掉,譬如去掉ADC等等相关代码。
2,需要SystemInit();配置为72MHz,否则无法工作,USB是工作在12MHz。
3,如果D+直接上拉到3.3V,把demo usb_pwr.c的PowerOn和PowerOff函数改为空函数。否则PC无法识别,单步调试发现不知跳哪去了。假设不注释,亦可把usb_desc.c的设备描述符bcdUSB域改为0x0110,即USB1.1也是可行的。
4,主要修改usb_conf.h,usb_desc.c以及usb_prop.c,主要是配置描述符增加键鼠的HID描述符和端点描述符,当然对应的报告描述符也需要修改与增加。

usb_prop.c主要在CustomHID_Reset回调添加新增端点的初始化,以及CustomHID_Data_Setup中对不同index(对应复合设备里的不同接口)进行不同的描述符获取(HID描述符获取函数、报告描述符获取函数等)回调函数的注册。

总体上比较容易移植!

重点是:理解复合设备是“一个设备描述符中包含一个(少数设备有多个)配置描述符,而这个配置描述符又包含N个接口描述符(譬如,键鼠为2个),最后,每个接口描述符又包含N个端点描述符(键鼠为2个,一个IN端口,另外一个OUT端口,类型是中断传输方式)”。当然如果是hid设备还会有HID描述符。

顺序是:设备描述符->“配置描述符1->接口描述符1_1->[HID描述符1_1]->端点描述符组1_1->接口描述符1_2->[HID描述符1_2]->端点描述符组1_2....->配置描述符2->接口描述符2_1...."

难点是:理解报告描述符,可参看www.usb.org相关的hid class文档。

需要掌握的技巧是:从已有(现成)的复合设备(譬如键鼠)中使用USBlyzer工具摘取它的报告描述符,填到自己的描述符中,可实现很多,诸如写字板,thouchpad(使用绝对坐标),鼠标(相对坐标)等设备,十分强大的技巧!!!!!(这里必须要绿一下)

 

最后,还可以一个接口描述符(linux下每个接口对应一个驱动)下含有多个报告描述符,它们之间是有Report ID来区分,这样的方式其实更为常见。它不同于上述复合设备。

 

你可能感兴趣的:(总线协议)