I write simple test programm (host mode, full speed) to work with USB stick. In the begining this program do: - get descriptor form USB stick (with numbers of IN and OUT end-points in the device), - set this number of IN, OUT endpoints in the USB controller, - set Address 1, - set Configuration 1, - set Interface 0. It's works correct. Than program send CBW with any SCSI command (inquory/read10/write10) and recive ACK. But when it send IN (or OUT for write10 command) request, than device answer STALL. Where is my mistake? For only one USB stick (A-Data 2 Gb) my programm work correct - I can read or write sector from/to USB stick (I don't undestand why!).
Alex.
A typical (simplified) sequence of enumeration of MSC is as follows,
1) Get_Descriptor( Device ) for the first 8 bytes - you get bMaxPacketSize0 field for following Requests. 2) Set_Address 3) Get_Descriptor( Device ) for full descriptor 4) Get_Descriptor( Config ) for the first 4 bytes, at least - the size of config descriptor (wTotalLength field) is known 5) Get_Descriptor( Config ) for full descriptor set 6) Parse the config descriptor set. Confirm mass storage - Bulk-Only Transport interface. 7) Set_Configuration 8) Get_Max_LUN - you may get STALL for this request. In this case, Max LUN = 0
> Than program send CBW with any SCSI command (inquory/read10/write10) and recive ACK. But when it send IN (or OUT for write10 command) request, than device answer STALL.
When you get STALL on data transport, recover the pipe using Clear_Feature( ENDPOINT_HALT ) request. And then, read CSW. Retry the SCSI command after appropriate interval, repeatedly, at least three times.
Tsuneo
Tsuneo, thanks for your answer.
Yes, I used Clear_Feature( ENDPOINT_HALT ). Than if I do GET_STATUS for this end-point (0x81 for example), I receive 0 (i.e. all is OK!). This requests are sended from host end-point number 0 to device end-point number 0.
But when I send IN request (for read CSW) I get STALL again. This request is sended from host end-point number 1 to device IN end-point number 1 (0x81).