本文转自公众号,欢迎关注
基于DWC2的USB驱动开发-PING协议详解 (qq.com)
这里先介绍下PING协议的背景和原理,我们不一上来就介绍PING包格式和协议,因为只有知其然知其所以然才能加深理解,任何事务都是有其出现的历史背景的,不会凭空而生,所以理解背后产生的背景和原理很重要。
全/低速的批量/控制传输OUT事务,如果设备没有就绪,则可以NAK表示端点不接受数据,主机可以稍后重发。以上过程存在一个问题,就是OUT数据之后设备NAK,OUT数据这部分时间会占用总线,如果设备一直未就绪一直NAK,主机一直重发将会大量占用总线。
高速设备旨在提高传输带宽,所以对这种带宽的浪费是不能容忍的,必须优化。
优化的思想其实很朴素,既然重发浪费带宽,那么就先“问一下”,先“问一下”设备准备好了没,只有收到设备回复准备好了再发数据,这样“问一下”这句话很短占用带宽不多,浪费较少。这个问一下就对应的PING包。
只在高速设备才支持PING,且只有控制传输和批量传输支持,且都是针对OUT。
控制传输OUT(数据和状态阶段,SETUP阶段不支持PING)
批量传输OUT的数据阶段。
Ping包的ID为0100B,和令牌包格式一样
如下是一个实例
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。
总结一下就是对于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协议,了解了过程和背景,对于驱动开发人员尤其要了解哪些是硬件做的,哪些是软件做的,分别在什么阶段什么时机做。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !