milosky
驱动牛犊
驱动牛犊
  • 注册日期2004-12-16
  • 最后登录2008-08-15
  • 粉丝0
  • 关注0
  • 积分604分
  • 威望79点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分10分
阅读:2128回复:2

wince下U盘功能,传输大文件有时会发生Invalid CBW signature的处理

楼主#
更多 发布于:2008-06-30 11:27
用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后处理有关,谁有这方面经验,提示一下应该如何解决这类问题?
We are in the same boat!:)
milosky
驱动牛犊
驱动牛犊
  • 注册日期2004-12-16
  • 最后登录2008-08-15
  • 粉丝0
  • 关注0
  • 积分604分
  • 威望79点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分10分
沙发#
发布于:2008-07-03 12:15
继续跟踪发现
当主机发过来的CBW包中bCBWCBLength,比如65536,可实际收到的数据包,如12500,小于bCBWCBLength时就会出错,多次调试都未解决?
这个是CBW的数据包,会分成不同大小的数据包发送吗,该如何处理呢
We are in the same boat!:)
milosky
驱动牛犊
驱动牛犊
  • 注册日期2004-12-16
  • 最后登录2008-08-15
  • 粉丝0
  • 关注0
  • 积分604分
  • 威望79点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分10分
板凳#
发布于:2008-07-10 11:06
    终于解决了,根本原因是USB接收数据包丢失,在发现数据包丢失后,stall reset pipe,让USB从新连接,然后Host会重发数据包,然后就可以继续了。
  微软的USBMSFN的确在2.0协议上有一些bug,可能是USB连接一直都用1.1的缘故吧。
另外:
  按照网上所介绍的发CSW请求最后一包数据的想法,在2.0上是不成立的。按照这个思路使得我走了好多弯路,但这也让我对USB协议有了更深入的理解,有失有得。。
 
We are in the same boat!:)
游客

返回顶部