打印

USB开发系列——使用状态机来处理控制传输

[复制链接]
1760|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
insignal|  楼主 | 2012-8-30 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 insignal 于 2012-8-30 09:35 编辑

以下文字内容版权归北京飞易来科技有限公司所有,未经许可,请勿转载!
USB枚举过程说难也不难,只要把需要支持的standard request都支持了就ok。
但是如果需要用控制端点来做通讯,比如一些HID设备,就需要进一步考虑枚举过程的可靠性了。
看到过不少USB的代码,在枚举或者说控制端点传输方面,更多的是来一个packet,处理一个packet,一般来说,如果控制传输没有data out的过程,这样处理还是比较简单的。
但是如果控制端点传输需要data in也需要data out,就必须注意控制传输的每个stage(setup/data/status)都需要小心处理。
比如,会出现两个packet的标志位同时置位的情况:
1、out packet和setup packet同时到来:在一个data in后,pc发下来一个status out,紧接着就会发下一个setup packet。
2、out packet和IN packet同时到来:在一个data out后,pc紧接着发下来一个status in。
3、setup packet和out packet同时到来:setup packet和后面一个data out同时接收到。
以上3种情况,如果不判断来的先后,就会出现误处理。
曾经有一款产品经过whdl测试,也在很多电脑上做过测试,但在客户的一个电脑上出现通讯错误的问题,后来经查,发现这台电脑的usb控制器是OHCI,而不是常用的UHCI,OHCI各个packet发的速度快,会有上述3种情况发生,而固件是来一个packet处理一个packet,不考虑先后顺序,导致出现误处理。
以上问题最简单可靠的解决方法就是用状态机,在什么状态下才处理相应的packet。比如把控制传输分为以下几个阶段:
wait setup、wait data in、wait data out、wait status in、wait status out
这样就不会出现误处理的问题。
后来所有的产品usb枚举/控制传输都采用这种状态机的方式,usb设备发货超过千万量级,都没有出现问题。

相关帖子

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

本版积分规则

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

8

主题

232

帖子

1

粉丝