1.中断传输包结构
中断传输和批量传输类似,中断传输只由一个中断事务组成,中断事务包含令牌包、数据包、握手包,如图下所示。中断事务类型的特点是能够通过错误检测和重试来保证主机和设备之间数据的无错误传递。 需要理解和注意以下点。
(1)当主机准备接收数据时,它发出IN令牌,设备端点通过返回数据包或(如果无法返回数据)NAK或STALL握手来响应主机。 NAK表示设备暂时无法返回数据,而STALL表示端点永久停止。 如果主机收到 一个有效的数据包,它用ACK握手来响应。 如果主机在接收数据时检测到错误,则不会向设备返回握手包。
(2)当主机准备发送数据时,它首先发出一个OUT令牌包,然后是一个数据包。 如果设备接收数据包时没有错误,则设备将返回三个握手中的一个。
ACK:表示没有错误,并通知主机它可以发送下一个数据包。
NAK:表示接收数据没有错误,但是主机应该重新发送数据,因为有可能设备处于临时条件拒绝接受数据(例如缓冲区满)。
STALL:如果端点被停止,则返回STALL以指示主机不应该重试传输,表示设备可能存在错误。
(3)如果收到的数据包带有CRC或位错误,则不返回握手。
中断传输事务包组成如下图。
2.中断传输DATA数据包实现同步操作
中断传输使用数据包切换实现同步操作,就是通过数据DATA0包和DATA1包的切换来实现主机和设备传输错误检测以及重发机制。这里和上一节讲解的批量传输同步操作原理是一样的,大家可以直接点击USB协议详解第26讲(USB包-批量传输包详解)查看。
3.中断传输包详解
首先介绍下中断传输低速、全速、高速数据包最大长度大小,如下图。
3.1中断读传输抓包
3.2中断写传输抓包
中断写传输和中断读传输相反,中断写传输主机使用OUT令牌包进行事务请求,这里不再贴图。
4.HID设备工作原理
我们前面在USB协议详解第16讲(USB传输-中断传输及事务组成)讲过中断传输用于那些频率不高,但是对周期有一定要求的数据传输。具有保证的带宽,并能在下一个周期对先前错误的传输进行重传。中断端点在端点描述符中要报告主机对此端点的查询时间,主机会保证在小于这个时间间隔的范围内安排一次传输,比如HOST主机1ms内向鼠标设备请求一次数据。对于全速端点,中断传输的时间间隔在1ms到255ms之间,对于低速端点,时间间隔限制在10ms到255ma之间,对于高速端点,时间间隔为2^(bInterval-1) x 125us,bInterval的值在1-16之间。
中断传输常用于HID设备,比如鼠标和键盘,当鼠标键盘接上之后,主机会按照端点配置的查询时间周期对设备进行数据请求,在这里就是周期的获取鼠标和键盘数据,其实周期请求是驱动帮我们做了这件事。
但是当我们设备类型是自定义HID设备,或者是自定义标准USB设备(使用中断端点实现),驱动会帮我们周期查询吗?
其实应用层软件在使用CreateFile打开一个自定义HID设备的时候,相应驱动程序会一直挂起IRP,到了设备端点指定的时间时主机控制器如果检测到IRP挂起,会对设备进行数据请求,设备如果把数据准备好了,则会把数据发送给主机,主机驱动程序会把接收到数据放入消息队列等待应用软件使用ReadFile函数来取数据,应用如果长时间不取数据,数据就会丢失。当然设备如果没有准备好数据,则会返回主机NACK握手信号。