打印

[请教]向U盘发SCSI命令返回stall的问题

[复制链接]
5721|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fjh|  楼主 | 2008-5-12 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, U盘, se, AC, AD
在51上使用SL811扩展的USB接口,枚举过程通过了,开始发送Inquiry,
ReadFormatCapacity等SCSI命令初始化U盘。但是发现手头两个牌子U盘都
会在发送完ReadFormatCapacity后,返回stall。

参考网友的经验,在此时发送两条ClearFeature清除端点1和2的hatl状态,从
getstatus的返回打印看,halt状态是清除了,但是不知道为何接着发送的
RequestSense命令总是又返回stall。接下来的readcapacity命令的bulksend
阶段一直NAK过不去.

用bus houd抓了一下其中一个U盘的打印,发现PC在ReadFormatCapacity
后有个RESET过程,却没有clearfeature.现在特想知道PC在这个RESET里到
底是做了什么事情,我在单片机这里应该如何做,感觉是个解决问题的关键。
希望知情网友帮帮忙,谢谢。

附:bus houd的关于RESET的打印。有我的简略注释。


相关链接:https://bbs.21ic.com/upfiles/img/20076/200762794831996.rar

相关帖子

沙发
computer00| | 2008-5-12 10:49 | 只看该作者

RESET就是reset了总线,重新设置地址,获取描述符,设置配置

使用特权

评论回复
板凳
fjh|  楼主 | 2008-5-12 11:58 | 只看该作者

继续请教:)

RESET总线的话,那是否就是把U盘重新复位到地址0端口0重新配置的意思?但是看BUS HOUND里不像是这样哦,RST后接着是获取ReadFormatCapacity的status 阶段了,并无重新配置阿。如下:


  21.2  55 53 42 43  e0 44 c4 fe  fc 00 00 00  80 00 0a 23  ReadFormatCapacityDO    2us  
        00 00 00 00  00 00 00 fc  00 00 00 00  00 00 00     ...............                 
  21.1                    (这里抓不到任何数据,PC到底干了什么?       )       RSET   123us  

  21.1  55 53 42 53  e0 44 c4 fe  00 00 00 00  01           Readformat的status DI   2us
                                                            返回  




使用特权

评论回复
地板
fjh|  楼主 | 2008-5-12 11:59 | 只看该作者

补充贴一下我在串口抓的打印

main: Program Started!!!


*********************
* ENTER - IsMassDev *
*********************
======================
= Enter - EnumMassDev =
======================
= BEGIN - Get USB Device Descriptors
ep0Xfer cmd: 80 06 00 01 00 00 12 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
USB Device Descriptors: 12 01 00 02 00 00 00 40 fe 13 00 1d 00 01 01 02 03 01 


= BEGIN - SetAddress(2)
ep0Xfer cmd: 00 05 02 00 00 00 00 00 
= ep0Xfer- SETUP stage finish!
= ep0Xfer- data stage finish!
= USBXfer- Terminate on short packets!
= ep0Xfer- status stage finish!


= BEGIN - Get USB Device Descriptors again
ep0Xfer cmd: 80 06 00 01 00 00 12 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
Device Descriptors again: 12 01 00 02 00 00 00 40 fe 13 00 1d 00 01 01 02 03 01 


= BEGIN - Get USB Configuration Descriptors
ep0Xfer cmd: 80 06 00 02 00 00 09 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
9bytes Configuration Descriptors: 09 02 20 00 01 01 00 80 64 
ep0Xfer cmd: 80 06 00 02 00 00 20 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
32btyes Configuration Descriptors: 09 02 20 00 01 01 00 80 64 09 04 00 00 02 08 06 50 00 07 05 81 02 40 00 00 07 05 02 02 40 00 00 


= BEGIN - Get Slave USB String Descriptors
ep0Xfer cmd: 80 06 00 03 00 00 02 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
2bytes String Descriptors: 04 03 
ep0Xfer cmd: 80 06 00 03 00 00 04 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
4btyes String Descriptors: 04 03 09 04 


= BEGIN - Get Slave USB Unkown Descriptors
ep0Xfer cmd: 80 06 03 03 09 04 02 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
2bytes Unkown Descriptors: 1a 03 
ep0Xfer cmd: 80 06 03 03 09 04 1a 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
32bytes Unkown Descriptors: 1a 03 35 00 42 00 37 00 42 00 31 00 43 00 30 00 30 00 30 00 45 00 36 00 42 00 


= BEGIN - Set_Configuration
ep0Xfer cmd: 00 09 01 00 00 00 00 00 
= ep0Xfer- SETUP stage finish!
= ep0Xfer- data stage finish!
= USBXfer- Terminate on short packets!
= ep0Xfer- status stage finish!


= BEGIN - SetInterface
ep0Xfer cmd: 01 0b 00 00 00 00 00 00 
= ep0Xfer- SETUP stage finish!
= ep0Xfer- data stage finish!
= USBXfer- Terminate on short packets!
= ep0Xfer- status stage finish!
======================
= FINISH - EnumMassDev =
======================

======================
= ENTER - IsMassDev  =
======================

IsMassDev: BulkIN  Endpoint = 1     MaxPkgSize = 64
IsMassDev: BulkOUT Endpoint = 2     MaxPkgSize = 64
ep0Xfer cmd: a1 fe 00 00 00 00 01 00 
= ep0Xfer- SETUP stage finish!
= USBXfer- Retry on NAK!
= ep0Xfer- data stage finish!
= ep0Xfer- status stage finish!
======================
= FINISH - IsMassDev =
======================

InitMassDev: Enter ...

***********************
* ENTER - SPC_Inquiry *
***********************
BulkSend: Enter ---
= USBXfer- Retry on NAK!
BulkSend: Exit ===

    BulkRcv: Enter ---
    ****BulkRcv: BytesRcv = 36 RetryNum = 0
    BulkRcv: exit ---
SPC_Inquiry: return data=:00 80 00 01 1f 00 00 00 4b 69 6e 67 73 74 6f 6e 44 61 74 61 54 72 61 76 65 6c 65 72 20 32 2e 30 50 4d 41 50 
    BulkRcv: Enter ---
    ****BulkRcv: BytesRcv = 13 RetryNum = 0
    BulkRcv: exit ---
SPC_Inquiry: CSW=:55 53 42 53 60 a6 24 de 00 00 00 00 00 


**********************************
* ENTER - RBC_ReadFormatCapacity *
**********************************
BulkSend: Enter ---
BulkSend: Exit ===

    BulkRcv: Enter ---
= USBXfer- Terminate on STALL!
    ****BulkRcv: BytesRcv = -80 RetryNum = 0

ClearFeature: END point 1
ep0Xfer cmd: 02 01 00 00 01 00 00 00 
= ep0Xfer- SETUP stage finish!
= ep0Xfer- data stage finish!
= USBXfer- Terminate on short packets!
= ep0Xfer- status stage finish!

ClearFeature: END point 2
ep0Xfer cmd: 02 01 00 00 02 00 00 00 
= ep0Xfer- SETUP stage finish!
= ep0Xfer- data stage finish!
= USBXfer- Terminate on short packets!
= ep0Xfer- status stage finish!

    
    BulkRcv: Enter ---
    ****BulkRcv: BytesRcv = 13 RetryNum = 0
    BulkRcv: exit ---
RBC_ReadFormatCapacity: CSW=:55 53 42 53 60 a6 24 de 00 00 00 00 01 


****************************
* ENTER - SPC_RequestSense *
****************************
BulkSend: Enter ---
BulkSend: Exit ===

    BulkRcv: Enter ---
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Terminate on NAK!
    ****BulkRcv: BytesRcv = -40 RetryNum = 0
****************************
* ENTER - RBC_ReadCapacity *
****************************
BulkSend: Enter ---
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Retry on NAK!
= USBXfer- Terminate on NAK!
BulkSend: usbXferRtnVal = -40
BulkSend: usbXfer FAIL ---

使用特权

评论回复
5
fjh|  楼主 | 2008-5-12 12:04 | 只看该作者

请00同学帮帮忙分析一下

请00同学帮帮忙分析一下,俺接触这个才几天,1.1协议翻烂了都没得要领。

PS. 俺也是SCUT的,00我跟你有几面之缘呢:)

使用特权

评论回复
6
fjh|  楼主 | 2008-5-12 12:11 | 只看该作者

有点奇怪的是

有点奇怪的是,这个kingston的U盘在format 或者 在PC写入过后,插单片机的板子上上电,第一次都如上,不过,然后断电,再上电,就次次都能过(RequestSense那里能过了,而不是NAK),真是有点摸不着头脑。

我的NAK重发间隔是15毫秒(感觉已经大得离谱了...),重发次数最多20次.

使用特权

评论回复
7
computer00| | 2008-5-12 20:34 | 只看该作者

你可以复位总线,重新枚举试试。

另外,对NAK的重试,可以一直试的,不用留什么间隔。

使用特权

评论回复
8
fjh|  楼主 | 2008-5-13 10:32 | 只看该作者

问题暂时解决

允许了最多3次复位device的重试,缩短NAK重发间隔到若干个微秒,增大重发次数
至1000次.结果RequestSense那里重发了176次后就过了(无语...).

不过手头这个U盘是解决了,还会碰到哪些钉子U盘还不清楚....
U盘兼容性问题确实不好解决.

使用特权

评论回复
9
平常人| | 2008-5-13 21:54 | 只看该作者

如果是自己做的Host,没有必要发那些你不需要的命令

ReadFormatCapacity 就属于不需要的命令;试试不要发这个命令。

使用特权

评论回复
10
fjh|  楼主 | 2008-5-14 10:38 | 只看该作者

是这样的

此前调过一个U盘,不发ReadFormatCapacity就搞不定.发了就好了.
所以只能照发,加差错处理程序来补救了.@@

使用特权

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

本版积分规则

fjh

16

主题

56

帖子

0

粉丝