阅读:2128回复:2
wince下U盘功能,传输大文件有时会发生Invalid CBW signature的处理
用MS自带的USB Function Mass Storage Client,实现了把一个存储卡虚拟成一个UDisk。
可传输大文件,有时会发生Invalid CBW signature,windows上传输中断,然后Usb部分就不可用了,必 须重启wince才可用。 下面是bot.cpp文件中的处理: static BOOL BOT_HandleCBW( ) { ... switch (g_MscState) { case MSC_STATE_COMMAND_TRANSPORT: { // Validate CBW if (g_pCbw->dCBWSignature != CBW_SIGNATURE) {//在这里出现问题 ERRORMSG(1, (_T("%s Invalid CBW signature\r\n"), pszFname)); // Reset state and stall the request //执行下面过程, 好像有问题 ChangeMscState(MSC_STATE_WAIT_FOR_RESET); g_pUfnFuncs->lpStallPipe(g_hDevice, g_hBIPipe); g_pUfnFuncs->lpStallPipe(g_hDevice, g_hBOPipe); goto EXIT; } ... } 估计可能与无效SIGNATURE后处理有关,谁有这方面经验,提示一下应该如何解决这类问题? |
|
|
沙发#
发布于:2008-07-03 12:15
继续跟踪发现
当主机发过来的CBW包中bCBWCBLength,比如65536,可实际收到的数据包,如12500,小于bCBWCBLength时就会出错,多次调试都未解决? 这个是CBW的数据包,会分成不同大小的数据包发送吗,该如何处理呢 |
|
|
板凳#
发布于:2008-07-10 11:06
终于解决了,根本原因是USB接收数据包丢失,在发现数据包丢失后,stall reset pipe,让USB从新连接,然后Host会重发数据包,然后就可以继续了。
微软的USBMSFN的确在2.0协议上有一些bug,可能是USB连接一直都用1.1的缘故吧。 另外: 按照网上所介绍的发CSW请求最后一包数据的想法,在2.0上是不成立的。按照这个思路使得我走了好多弯路,但这也让我对USB协议有了更深入的理解,有失有得。。 |
|
|