打印

求教各位大虾,U盘开发,发送CSW后,“canceled”

[复制链接]
4626|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzeng|  楼主 | 2011-2-17 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做USB,要求实现U盘的功能,现在枚举已经通过,但在进行SCSI通信出现问题。
设定为当主机发送除INQURY和REQUEST SENSE之外的命令时,设备返回命令执行失败(既直接返回CSW且CSW最后位为1),现在出现的问题是,返回CSW后,主机一直等待(大约19s),之后主机重复发送上一条失败命令,设备返回CSW后主机再等待(19s)。用BusHound捕捉到主机在等待19s驱动后返回一个canceled指令。 BusHound数据如下

21  DO     55 53 42 43 - 08 10 8d 89  USBC....       1.9ms        11.1.0        
               24 00 00 00 - 80 00 06 12  $.......                    11.1.8        
               00 00 00 24 - 00 00 00 00  ...$....                    11.1.16      
               00 00 00 00 - 00 00 00     .......                     11.1.24      
21  DI     00 80 00 00 - 1f 00 00 00  ........       1.9ms        12.1.0        
               47 65 6e 65 - 72 69 63 20  Generic                     12.1.8        
               55 53 42 20 - 53 44 20 52  USB SD R                    12.1.16      
               65 61 64 65 - 72 20 20 20  eader                       12.1.24      
               31 2e 30 30                      1.00                 12.1.32      
21  DI     55 53 42 53 - 08 10 8d 89  USBS....       2.0ms        13.1.0        
               00 00 00 00 - 00           .....                       13.1.8        
21  DO    55 53 42 43 - 08 10 8d 89  USBC....       1.9ms      14.1.0        
               fc 00 00 00 - 80 00 0a 23  .......#                    14.1.8        
               00 00 00 00 - 00 00 00 fc  ........                    14.1.16      
               00 00 00 00 - 00 00 00     .......                     14.1.24      
21  DI     55 53 42 53 - 08 10 8d 89  USBS....       2.0ms        15.1.0        
               fc 00 00 00 - 01           .....                       15.1.8        
21  USTS   00 00 01 c0                canceled        19sc        16.1.0        
21  DO     55 53 42 43 - 08 10 8d 89  USBC....       227ms        7.1.0        
                fc 00 00 00 - 80 00 0a 23  .......#                    17.1.8        
                00 00 00 00 - 00 00 00 fc  ........                    17.1.16      
                00 00 00 00 - 00 00 00     .......                     17.1.24      
21  DI     55 53 42 53 - 08 10 8d 89  USBS....       1.9ms        18.1.0        
               fc 00 00 00 - 01           .....                       18.1.8        
21  USTS   00 00 01 c0                canceled        19sc        19.1.0      


捕捉一个普通的读卡器数据可以看到不同


16  DO    55 53 42 43 - 08 f0 81 89  USBC....       242us        11.1.0        
               24 00 00 00 - 80 00 06 12  $.......                    11.1.8        
               00 00 00 24 - 00 00 00 00  ...$....                    11.1.16      
               00 00 00 00 - 00 00 00     .......                     11.1.24      
16  DI     00 80 00 00 - 1f 00 00 00  ........       266us        12.1.0        
              47 65 6e 65 - 72 69 63 20  Generic                     12.1.8        
              55 53 42 20 - 53 44 20 52  USB SD R                    12.1.16      
              65 61 64 65 - 72 20 20 20  eader                       12.1.24      
              31 2e 30 30                1.00                        12.1.32      
16  DI    55 53 42 53 - 08 f0 81 89  USBS....       250us        13.1.0        
              00 00 00 00 - 00           .....                       13.1.8        
16  DO   55 53 42 43 - 08 f0 81 89  USBC....       117us        14.1.0        
              fc 00 00 00  - 80 00 0a 23  .......#                    14.1.8        
              00 00 00 00 - 00 00 00 fc  ........                    14.1.16      
              00 00 00 00 - 00 00 00     .......                     14.1.24      
16  USTS   04 00 00 c0                pid stalled    255us        15.1.0        
16  DI     55 53 42 53 - 08 f0 81 89  USBS....       367us        16.1.0        
               fc 00 00 00 - 01           .....                       16.1.8        
16  DO    55 53 42 43 - 08 f0 81 89  USBC....       127us        17.1.0        
               12 00 00 00 - 80 00 0c 03  ........                    17.1.8        
               00 00 00 12 - 00 00 00 00  ........                    17.1.16      
               00 00 00 00 - 00 00 00     .......                     17.1.24      
16  DI     f0 00 02 00 - 00 00 00 0a  ........       123us        18.1.0        
               00 aa 55 40 - 3a 00 00 00  ..U@:...                    18.1.8        
               00 00                      ..                          18.1.16      
16  DI     55 53 42 53 - 08 f0 81 89  USBS....       127us        19.1.0        
               00 00 00 00 - 00           .....                       19.1.8        

  可以看到读卡器返回CSW后,驱动返回 pid stalled    之后主机立刻发送REQUEST SENSE。而我的设备返回CSW后,主机一直等待........
不知道是什么原因..................
求教...................

相关帖子

沙发
computer00| | 2011-2-17 16:00 | 只看该作者
对于输入请求,你在返回CSW之前,先返回一个0长度的空数据包试试;
对于输出请求,你在返回CSW之前,必须要将输出端点的数据清空后,再返回CSW。否则主机下次就无法发送CBW请求了。


从你的信息来看,应该是主机想读东西,你没返回东西,直接返回了CSW,主机就把CSW当成了数据,然后再读CSW,结果就读不到了,超时后,主机取消该请求。

使用特权

评论回复
板凳
lzeng|  楼主 | 2011-2-17 16:07 | 只看该作者
恩,谢谢,我试试看  :D
实际上我也怀疑是主机在等待响应,19秒实在太长.....

使用特权

评论回复
地板
lzeng|  楼主 | 2011-2-18 08:54 | 只看该作者
昨天试过了,确实只要在发送CSW之前发送一个空包就行,主机也不会等待
也就是说,像READ CAPACITY , READ(10)这类要求数据输入的命令,虽然我准备返回命令执行错误CSW,但在返回CSW之前依然要先返回一个数据包,大小应该是任意的(不超过协议规定上限),这样主机在接受数据包之后才会正确识别返回过来的CSW

目前这个问题算是解决了,thanks 00   :D
目前我这个U盘依然出现了新问题,正在研究中......

使用特权

评论回复
5
computer00| | 2011-2-18 09:09 | 只看该作者
大小不能太随意哟...

例如,如果它请求100字节,而你的端点大小为64字节,你返回个64字节,主机以为你数据还未传完(因为主机的确不知道你数据传完没,它就只能假定你还想接着传数据的),
接着它还想读数据呢,结果你返回了CSW,它就不认,以为还是数据,它接着再去读一下CSW,结果又跟你现在的情况一样了...
所以,正确的做法是返回一个小于端点大小的数据包(当然也要小于等于主机请求的长度了,不然可能会报缓冲溢出滴),告诉主机,
数据已经传完了,你可以进入到CSW阶段拉...然后主机就屁癫屁癫的进入到CSW阶段,给你请求CSW了…………

你还是买本俺的书玩玩吧:lol

使用特权

评论回复
6
lzeng|  楼主 | 2011-2-18 09:29 | 只看该作者
00你可真会推销 :L
早就买啦,这叫入门必备 ;P
不过上面可木有讲这种情况哦:lol
随书的PCB不错哈,赞一个,虽然我调试用的是其他板子。
继续研究中......

使用特权

评论回复
7
computer00| | 2011-2-18 09:41 | 只看该作者
虽然书里面没有明确地写出来,可代码里是写得清清楚楚的哦...

  default: //其它命令不认,返回执行失败
   if(CBW[12]&0x80) Ep2DataLength=1; //如果为输入请求,则随便返回1字节
   else Ep2DataLength=0; //否则为输出请求,则设置长度为0,直接返回CSW
   SetCsw(GetDataTransferLength()-Ep2DataLength,1); //设置CSW为失败
   Ep2SendData(); //返回CSW
  break;

使用特权

评论回复
8
lzeng|  楼主 | 2011-2-18 12:18 | 只看该作者
哦,确实,是我忽略了这个细节:$
呵呵

使用特权

评论回复
9
qidnehai| | 2013-4-15 23:05 | 只看该作者
CBW 有告诉Device要传输的长度的(byte8-11),我们回复PC DATA 长度一般都是等于或者小于这个长度就行了。而且像READ CAPACITY(0x25),READ Format CAPACITY(0x23) 这样的SCSI命令回复DATA 是有格式要求的,不能乱回复哦~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:老实人说假话  还是老实人吗

0

主题

44

帖子

1

粉丝