如何处理usb的STALL PID

atommann   2010-2-3 15:38 楼主
三星44B0X+SL811HST,无操作系统,可以正确识别到1.1的U盘,但因为现在大多是2.0的U盘,发现有的2.0的U盘在做完
GetMaxLUN后,如果做Inquiry,也可以成功,但接下来做ReadFormatCapacity时,BulkIn会产生STALL,也就是读不到
FormatCapacity的内容,用BusHound查看同一个U盘在PC上的处理,同样产生了stall pid,内容如下:
Device  Phase  Data                                                Description     
------  -----  --------------------------------------------------  ----------------
  31.0  CTL    a1 fe 00 00  00 00 01 00                            GET MAX LUN     
  31.0  IN     00                                                  .               
  31.2  OUT    55 53 42 43  60 4c 9a 0a  24 00 00 00  80 00 06 12  USBC`L..$.......
               00 00 00 24  00 00 00 00  00 00 00 00  00 00 00     ...$...........
  31.1  IN     00 80 00 01  1f 00 00 00  20 20 20 20  20 20 20 20  ........        
               55 53 42 20  44 49 53 4b  20 32 2e 30  20 20 20 20  USB DISK 2.0   
               50 4d 41 50                                         PMAP            
  31.1  IN     55 53 42 53  60 4c 9a 0a  00 00 00 00  00           USBS`L.......   
  31.2  OUT    55 53 42 43  30 3b ce 07  24 00 00 00  80 00 06 12  USBC0;..$.......
               00 00 00 24  00 00 00 00  00 00 00 00  00 00 00     ...$...........
  31.1  IN     00 80 00 01  1f 00 00 00  20 20 20 20  20 20 20 20  ........        
               55 53 42 20  44 49 53 4b  20 32 2e 30  20 20 20 20  USB DISK 2.0   
               50 4d 41 50                                         PMAP            
  31.1  IN     55 53 42 53  30 3b ce 07  00 00 00 00  00           USBS0;.......   
  31.2  OUT    55 53 42 43  30 3b ce 07  fc 00 00 00  80 00 0a 23  USBC0;.........#
               00 00 00 00  00 00 00 fc  00 00 00 00  00 00 00     ...............
  31.1  USTS   c0000004                                            stall pid      
  31.1  RESET                                                                     
  18.0  CTL    a3 00 00 00  03 00 04 00                            GET STATUS      
  18.0  IN     03 05 00 00                                         ....            
  31.1  IN     55 53 42 53  30 3b ce 07  fc 00 00 00  01           USBS0;.......   
  31.2  OUT    55 53 42 43  30 3b ce 07  12 00 00 00  80 00 0c 03  USBC0;..........
               00 00 00 12  00 00 00 00  00 00 00 00  00 00 00     ...............
  31.1  IN     70 00 06 00  00 00 00 0a  00 00 00 00  28 00 00 00  p...........(...
               00 00                                               ..              
  31.1  IN     55 53 42 53  30 3b ce 07  00 00 00 00  00           USBS0;.......   

由此知道,windows驱动做了RESET的操作,可是我不清楚这个RESET到底做了些什么。
我做了如下几项测试,但都没达到效果:
1. 在STALL之后,做ClearFeature的操作去清除STALL,但重发任何命令,都还是产生STALL;
2. 在STALL之后,做usb mass storage reset的操作,做完之后再clear stall bulkin和bulkout两个端点,然
   后再发任何命令,还是返回stall
3. 在STALL之后,做mass storage reset,然后重新从分配usb地址之后的地方做USB设备枚举,比如GetDescriptor
   结果连这个也失败。

问题:1. STALL之后应该如何处理才能让操作继续下去,就像windows那样
      2. mass storage reset应该怎么做,我怀疑我的reset做的不正确,比如向设备发出reset后,如何判断reset
         已结束,我现在是用调试方式,延迟了很久,至少几秒钟,才继续执行下一条语句

回复评论 (5)

有的命令返回stall不会有问题的,最好完全参考PC的做法
点赞  2010-2-4 14:22
我也是碰到完全相同的问题,shark_gao@sohu.com
点赞  2010-2-5 11:00
帮忙顶
点赞  2010-2-5 16:31
我刚好也碰到这个问题了. 此时clear stall bulkin即可. 不要另外2个步骤.
我也实验了N种方法,后来仔细看了usbmassbulk_10.pdf后面的错误处理流量,才明白BusHound的RSET不是总线复位的意义, 而是复位pipe.
点赞  2010-2-23 16:52
一般发生了stall,只要clear feature即可
点赞  2010-3-4 00:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复