打印

USB开发系列——如何做一个完美的枚举

[复制链接]
2228|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
insignal|  楼主 | 2012-8-30 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下文字内容版权归北京飞易来科技有限公司所有,未经许可,请勿转载!
 
USB插上电脑,首先就需要枚举,固件实现一个能简单工作的枚举,只需要支持:
1、支持get descriptor (包括device、configuration)
2、支持set address
3、支持set configuration
就可以在PC上看到USB设备枚举的过程。
而要支持上述standard request,无非就是
1、接收setup packet
2、data IN ; data IN..
3、status OUT
上述第2步data in可能有(如get  descriptor  )也可能没有(如set configuration/set address)。
如果有data IN,也可能只有一个data IN packet,就被PC用status out提前中断。
pc host一般会这样枚举设备:
usb设备插上PC
PC reset usb bus
host发get device  descriptor  
device IN 8字节         //这里PC只IN了一个packet,主要就是获取device  descriptor  的长度
status OUT                     
reset bus
host发get device desc
device IN device desc 18字节     //这里PC把所有device desc 都读取
status OUT                     
... ...
以上第一个get device  descriptor   的请求,host到底是全部取18个字节还是只取8个字节,都是符合usb specification的。

——————————————————————————
实现了枚举,后面就可以通讯,我们暂且打住不说后续的usb通讯。先说说上述所提到的枚举过程。
这个过程可以说可以保障USB设备基本可用,但可靠性、兼容性将会打折扣,可能有些电脑就不能识别。要想做一个兼容性、可靠性都没有问题的枚举,现在已经有很好的测试手段来辅助。那就是通过windows的whdl测试,如果这个测试环境不方便搭建,也可以退而求其次,用usb.org上的usbcv来测试。通过whdl测试的usb设备,可以说,usb设备可以被所有windows、几乎所有pc所识别。
要通过whdl的测试,必须严格按照usb specification 的chap 9来写固件。总的来说需要:
1、判断setup packet中的每个字节是否合法。包括wvalue/windex/wlength。如果不合法,必须stall。比如set address,如果address值大于127,就必须stall。虽然正常情况下PC不会发下来一个大于127的address。
2、支持所有standard request,除了Synch 。如果不支持某个standard request,必须stall,比如set  descriptor  。
固件只要做到上述两点,就比较容易通过whdl/usbcv的测试,从而提高产品的可靠性、兼容性。
需要注意的几点,别忘了:
1、所有端点的toggle bit都需要在set configuration时clear;
2、在clear feature时,clear相应端点的toggle bit
待续...

相关帖子

沙发
a283362256| | 2012-9-12 15:22 | 只看该作者
请问,设备插上pc上,在pc上用bus hound监视,看见有三个get descriptor和一个set config,中间没有set address  这种情况是正常的吗?

使用特权

评论回复
板凳
insignal|  楼主 | 2012-9-12 22:24 | 只看该作者
正常
你用usb分析仪就能看到所有枚举数据  用bushound 看不到

使用特权

评论回复
地板
zzu65| | 2012-9-14 20:08 | 只看该作者
usb协议分析仪较贵,不像买个开发板学习那么简单
上述三条基本命令是必须的,但如果要通过usbcv验证,还远远不够,cv软件会把所有标准请求命令全部验证一遍

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:★所有产品免驱动 ▲USB转SPI/I2C/UART芯片 ▲模拟USB键盘鼠标芯片 ▲USB继电器/光耦 ★freeeasy-life.com

8

主题

232

帖子

1

粉丝