最近在研究MSC类的数据收发,在其协议《Mass Storage Class Bulk-Only Transport》中时通过CBW命令来控制数据的OUT和IN,采用的端点传输类型为bulk。
比如说主机要发送一个OUT数据,首先要发送一个方向为OUT的CBW,接下来才能传输OUT令牌包发送OUT数据,最后是CSW;当主机要获取设备的信息或者响应数据,则先发一个数据方向为IN的CBW,然后再发IN令牌包,获取IN数据;
一次数据收发需要两条CBW来控制的(一个方向为OUT,一个方向为IN),那么现在有个问题:能不能只通过主机发送一个方向为OUT的CBW来控制数据的收发(也就是说主机不用发送数据方向为IN的CBW了),或者说只用一个方向为OUT的CBW来输出数据,对于设备的响应数据则采用中断输入管道Interrupt—IN来传输,也就是主机可以通过一定的时间周期去查询设备的响应。我试了一下,即把大量存储设备的端点描述符中IN端点的bmAttributes改为03(Interrupt),轮询时间bInterval设为10ms,其他不变,如下所示:
/**********************IN端点描述符定义***********************/
0x07, /*bLength 07)*/
0x05, /*bDescriptorType Endpoint=05)*/
0x82, /*EndpointAddress EP2_IN)*/
0x03, /*bmAttributes Interrupt)*/
0x40, /*wMaxPacketSize 64 byte)*/
0x00,
0x01, /*bInterval*/
/**********************OUT端点描述符定义***********************/
0x07, /*bLength 07)*/
0x05, /*bDescriptorType Endpoint=05)*/
0x02, /*EndpointAddress EP2_OUT)*/
0x02, /*bmAttributes (BULK)*/
0x40, /*wMaxPacketSize(64 byte)*/
0x00,
0x00, /*bInterval*/
但这样修改后,在枚举过程中设备端点就挂起了,PC说“硬件安装期间出现一个问题。。。。”
通过bus hound抓取的数据如下:
见附件插图00
通过USB分析仪抓取的数据如 下
见附件插图01:
拿出来和大家讨论一下,看看我这样的想法合不合乎逻辑
谢谢!