本帖最后由 辉先生 于 2013-4-6 19:31 编辑
开发板借来也快一个月了,除了跑了开发板自带的例程,主要试了USB相关的程序测试,(公司交给的任务是实现USB HID Mouse+Transfer的功能), 趁清明节放假,整理了一下,跟大家分享下。由于初次接触USB,很多地方并不是很清楚,欢迎大家拍砖,也希望高手指点。
在一个设备中同时实现USB Mouse和Transfer的功能,应该至少有两种方法(1):
1、只使用一个接口,但是使用两个应用集合和两个报告。
2、使用两个接口,一个接口实现Transfer功能,另一个接口实现Mouse功能。
方法①只需要一个输入端点和一个输出端点就足够了,而方法②还需要另外一个额外的非0端点,因为同一个配置下的不同接口,必须使用不同的端点。
AT91SAM3S4C的内置USB模块具有8个端点(2),故两种方法都可以实现。
方法①主要是通过修改报告描述符来实现,将HID Mouse的报告描述符拷贝到HID Transfer报告描述符后,组成新的报告描述符,同时分别给两个部分增加报告ID,主机将根据报告ID号来识别报告内容,解析动作。报告描述符修改好以后,还需要根据实际情况更改相关参数的长度,如报告描述符长度、两个功能的报告长度(因为增加了报告ID,传输数据首位为报告ID,后面的才是数据)等。
方法②使用两个接口,每个接口实现一个HID设备,这样每个接口各需要一个报告描述符(这里可以不需要添加报告ID,因为这两个报告属于不同的接口,可以认为无关)。除了报告描述符,配置描述符也因为增加了接口而需要进行调整,整个配置描述符应该包括两个接口的相关信息。同时需要修改的还包括两个接口的接口号及相应使用的端点号等内容。
下面以双接口方式实现为例,给出设备枚举及测试过程补货信息。
①、主要工具“串口调试助手”和USB“Bus Hound”。
②、测试软件源自Atmel官网提供例程自带测试软件
③、例程来源Atmel官网:http://www.atmel.com/zh/cn/products/microcontrollers/arm/sam3s.aspx?tab=tools
个人理解的USB HID设备枚举过程如下:
USB标准输入请求:获取设备描述符;
USB标准输出请求:设置地址;
USB标准输入请求:获取设备描述符;
USB标准输入请求:获取配置描述符;
USB标准输入请求:获取字符串描述符(语音ID);
USB标准输入请求:获取字符串描述符(产品序列号);
USB标准输入请求:获取配置描述符描述符;
USB标准输入请求:获取字符串描述符(语音ID);
USB标准输入请求:获取字符串描述符(产品描述符);
USB标准输入请求:获取字符串描述符(语音ID);
USB标准输入请求:获取字符串描述符(产品描述符);
USB标准输入请求:获取设备描述符;
USB标准输入请求:获取配置描述符;
USB标准输入请求:获取配置描述符;
USB标准输出请求:设置配置;
USB类输出请求:设置空闲;
USB标准输入请求:获取报告描述符;
实际串口打印信息如下:
system is ok! Output
-I- HIDDFunction_Initialize
-I- HIDDFunction_Initialize
USBD_Init
-I- NewReq Std gDesc Dev
-I- NewReq Std sAddr SetAddr(3)
-I- NewReq Std gDesc Dev
-I- NewReq Std gDesc Cfg
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str3
-I- NewReq Std gDesc Cfg
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str2
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str2
-I- NewReq Std gDesc Dev
-I- NewReq Std gDesc Cfg
-I- NewReq Std gDesc Cfg
-I- NewReq Std sCfg SetCfg(1)
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str2
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str2
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str2
-I- NewReq Std gDesc Str0
-I- NewReq Std gDesc Str2
-I- NewReq sIdle(0<0) -I- Transfer
-I- NewReq -I- Report
-I- NewReq sIdle(0<0) -I- Mouse
-I- NewReq gDesc{22) Report(50) -I- Mouse
注:二者对比可以看出,实际设备枚举过程中,在设置配置后,系统重复4次获取了语言ID和产品描述符信息,本人也不知这是否正常,希望有高手解答下。
下面是USB “Bus Hound”捕获的枚举信息,可以看到系统获取的配置描述符和两个功能的报告描述符的具体信息。 识别后设备在系统中的情况,属于同一设备下的两个接口 例程提供HID Transfer 测试软件测试情况 上述程序是在官网例程和库函数基础上修改的,为了不影响其他例程对库的调用,在库文件中增加了HIDVonderDriver.c和HIDVonderDriver.h文件,这样与功能实现相关的文件就仅限于如下4个文件:main.c、device_descriptor.c、HIDVonderDriver.c和HIDVonderDriver.h。附件给出两种方法下的这4个文件,供大家参考。 最后,非常感谢爱板网借用的开发板,是我们的产品模块设计得以顺利进行,希望论坛发展壮大,爱板网越办越好,再次感谢!! 参考引用: ①、《圈圈教你玩USB》; ②、AT91SAM3S Datasheet;
|