丢失数据包:无线USB系统和解决方案中的典型问题

技术分类: 通信  | 2008-07-31
Bart Vertenten,恩智浦半导体连接技术首席架构师;孙钰玺,恩智浦半导体UWB高级系统工程师

  认证无线USB(Certified Wireless USB)是USB标准的扩展,它使用WiMedia通用无线电平台,通过超宽带(UWB)无线连接进行通信。它定义为:所有较高层应用(例如类驱动)在从现有的有线USB应用启动时都不必更改为与无线的USB相符的标准。USB线缆和协议是非常可靠的媒介,不会发生冲突现象。这样,几乎不会丢失或损坏任何数据包。因此,在互操作性测试过程中,从未出现在有线USB中丢失某些数据包的极端状况。

  由于在无线连接中可能出现冲突,从而要求重试,因此在将有线USB应用迁移到无线USB应用时需要特别注意某些特定情况。本文将介绍的情况是有线和无线USB均可能发生的典型问题之一,但因为无线连接中丢失数据包的可能性要大得多,所以无线USB也更有可能发生问题。我们把这个问题称之为:“丢失一个数据包的危险”。开发人员对这一问题的忽视,无疑将导致严重的后果。

  现象描述

  当设备需要向主机发送完整的缓存数据时,而主机向最后一个数据包(或脉冲串中最后数个数据包)发送的握手信号(Hand-shaking)在传送过程中遭到破坏或丢失时,就会发生这一特定问题。因为主机必须以最少的次数发送握手信号,所以设备端可能看不到那些包含向数据包中最后一批数据(或脉冲串中最后数个数据包)所发送握手协议的MMC。在这种情况下,为了保持数据完整性,设备必须将该部分数据保留在缓存中,直到能够看到握手信号(若有的话)。如果开发人员忽视了这一情况,就会给系统实现带来问题。请参见图1。

图1数据包丢失现象示意图


  由于设备没有接收到任何表示主机已收到最后一个数据包或脉冲串中最后几个数据包的握手信号,设备必须将数据的最后部分保留在缓存中,因此该设备不会产生任何中断,也不会向上级软件报告任何表示主机已正确接收数据的事件。事实上,也不应该这样做,因为该设备认为传输中数据的最后部分没有成功传送到主机端,主机可能再次要求读取数据。

  如果较高层协议(例如类驱动)的状态机要求该外部握手/中断信号向下一阶段进行,则整个状态机就会卡住。这会造成死锁情况,而且整个设备系统状态机将无法处理此情况。

  值得强调的是,丢失一个数据包并非仅仅是典型的无线USB的问题,在有线USB连接也可能发生。设计师在进行有线USB相关设计时也必须注意这一点。区别在于:无线连接的可靠性比有线连接低得多。因此与几乎从不丢失数据包的有线USB相比较,无线USB丢失数据包的概率就显得相当高了。

  下面举一实例来说明:

  如果是大容量存储设备的系统实现,则以下序列总会多次发生:
  CBW - BULK OUT;31字节
  Data Stage - BULK IN 或 BULK OUT;即多次最大数据包交换
  CSW - IN;13字节

  当设备看不到“IN(13字节)”的握手信号时,大容量存储特别容易发生该问题。见图2中所添加的标记说明。

图2由于握手信号丢失而产生的丢包现象


  在图3的标记中,无线USB数据包291(WUSB packet 291)是来自主机的MMC,包含一个用来确认之前IN数据包(WUSB packet 288)的WdtCTA。只有当设备收到该MMC时,才能声明主机已收到这个特定的IN数据包。换言之,在这一特定情况中,设备无法声明CSW数据包已成功传送到主机,直到它收到数据包291中内嵌的确认。但如果该数据包在传送中丢失,从这一特定的主机实现中我们可以看到主机仅发送一次带有确认的MMC。因此在无线环境中,丢失此数据包的可能性不容忽视。

图3设备无法声明CSW信号已传至主机的情况


  在为大容量存储编写的某些传统USB类驱动程序中,类驱动程序内的状态机只有在收到状态完成事件(大多数情况下,该事件是来自设备控制器的中断或来自较低层堆栈的事件)时才会被触发。更具体地说,在大容量存储器状态机中,类驱动在执行进一步操作之前总希望在IN管道上完成接收13字节的CSW,例如,将状态机移动到CBW阶段,并对设备控制器进行编程,使其在OUT管道上接收CBW。 

  如果CSW的ACK被破坏,而实际上WUSB主机接收了该ACK,则主机端和设备端的类驱动状态机之间将不匹配。主机会将类状态机移动到CBW阶段,而且如果它发现该特定OUT管道是激活的,就会准备随时发送CBW。但是很遗憾,OUT管道启用操作通常是在设备类状态机CBW阶段中通过某些软件操作触发;这意味着,总线上不会发出任何EPxOUT的DN_EPRdy来指示管道是激活的。同时,设备类状态机仍保持在CSW阶段,即仍在等待CSW的完成(设备无法知道主机已收到CSW数据包,除非设备已安排进行更多传输)。该不匹配现象会导致死锁。

  建议解决方案

  设备端的类驱动需通过考虑“数据包丢失”的情况来小心处理这种情况。对于大容量存储,该问题的典型解决方案之一是按以下方式更改状态机:在设备类状态机的CSW阶段下激活CBW的OUT管道,这样设备端就不会阻止总线上下一个CBW的活动。上述解决方案不仅仅能够有效地解决大容量存储器类中CSW的ACK丢失问题,在WUSB应用(甚至有线USB)中,任何设备端上制定传输协议(在IN端传送完成后,向OUT端发送一个数据包的协议)的类驱动都必须注意,在安排IN端传送之后即启动OUT端数据包接收,不能在看见IN传送完成的中断后才启动OUT端数据接收。

0
0
(请您对文章做出评价)
加载中

对文章的评论

更多评论

剩余字数:  

浏览该文章的用户还看过...

  • 文 章

  • 论 坛

  • 博 客

  • 小 组

  • 博客推荐

  • 论坛推荐

  • 在线研讨会