基于DWC2的USB驱动开发-PING协议详解

描述

本文转自公众号,欢迎关注
基于DWC2的USB驱动开发-PING协议详解 (qq.com)

一. 前言

这里先介绍下PING协议的背景和原理,我们不一上来就介绍PING包格式和协议,因为只有知其然知其所以然才能加深理解,任何事务都是有其出现的历史背景的,不会凭空而生,所以理解背后产生的背景和原理很重要。

全/低速的批量/控制传输OUT事务,如果设备没有就绪,则可以NAK表示端点不接受数据,主机可以稍后重发。以上过程存在一个问题,就是OUT数据之后设备NAK,OUT数据这部分时间会占用总线,如果设备一直未就绪一直NAK,主机一直重发将会大量占用总线。

高速设备旨在提高传输带宽,所以对这种带宽的浪费是不能容忍的,必须优化。

优化的思想其实很朴素,既然重发浪费带宽,那么就先“问一下”,先“问一下”设备准备好了没,只有收到设备回复准备好了再发数据,这样“问一下”这句话很短占用带宽不多,浪费较少。这个问一下就对应的PING包。

只在高速设备才支持PING,且只有控制传输和批量传输支持,且都是针对OUT。

控制传输OUT(数据和状态阶段,SETUP阶段不支持PING)

批量传输OUT的数据阶段。

二.PING包格式

Ping包的ID为0100B,和令牌包格式一样

驱动开发

驱动开发

如下是一个实例

驱动开发

三.PING协议过程和实例

Ping的响应是硬件做的,因为设备需要接收主机连续的PING,如果软件处理会来不及。

那么硬件怎么知道回主机的PING包回ACK还是NAK呢,这就是看软件有没有配置好DMA并设置CTL寄存器的EPena置位,如果软件已经配置好了则硬件回ACK,并自动接收后面的OUT数据,并通过DMA搬运到用户空间,反之则NAK。

过程如下:

1.主机OUT数据,设备返回了NAK

2.主机收到NAK,知道设备没就绪,于是发PING

3.设备收到PING之后如果还未就绪则NAK,否则则ACK

4.主机按照描述符中的bInterval时间间隔重新发PING,直到设备ACK,设备ACK后发数据。

5.设备收到主机OUT的数据如果还可以继续接收后面的数据则ACK,否则则发NYET。注意虽然前面PING设备ACK了,这里设备还是有可能NAK。

  1. 主机如果收到设备的ACK则继续发后面的数据,如果收到NYET则表示本次OUT数据成功,但是设备不能接收后续数据,发后面的数据前重复上面的PING过程,如果主机收到NAK则说明本次数据设备没有接收,需要重新PING然后重发本次数据。

总结一下就是对于OUT数据设备可能有三种响应

ACK:本次接收了,还可以继续接收后面的。

NYET:本次接收了,不能继续接收。

NAK:本次未接收。

上述说明的设备对PING ACK了,但是对后面的数据OUT又NAK了的情况,是不正常的现象,设备都告诉主机准备好了,后面又没有接收数据。

高速的批量/控制端点在其端点描述符中需要指定其最大NAK速率。每个bInterval 时间间隔内,端点最多允许NAK一次。如果端点的描述符bInterval为0则表示端点从不会NAK。

如果在数据阶段之后发生超时,主机必须返回到PING阶段。转回PING状态不会影响事务数据阶段的data toggle 状态。

以下是一个实例过程

驱动开发

(1)主机OUT数据,设备NAK了,表示设备不能接收

(2)主机看到设备NAK,不能接收,于是进入PING状态。注意上面主机不会一上来就PING,因为这个时候还不知道设备能不能接收,所以先不管三七二十一发一把再说,万一设备能接受呢。只有主机确认设备不能接收,即设备NAK之后才会进入PING状态。

驱动开发

(3)设备一直NAK则主机一直PING

(4)设备终于ACK了主机的PING,表示可以接收数据了。

这里的ACK是设备的硬件做的,所以在此之前设备的软件配置好了DMA并置位了DOEP的CTL寄存器的EPena位。

(5)主机OUT数据,设备也接受了,回了ACK,至此数据的OUT阶段总算成功了。

第(5)步设备实际还有可能回NAK,表示未接收,回NYET表示本包接收但是不能接收下一包。

四. 总结

以上介绍了高速数据阶段的PING协议,了解了过程和背景,对于驱动开发人员尤其要了解哪些是硬件做的,哪些是软件做的,分别在什么阶段什么时机做。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分