You can test the USB mass storage gadget's behavior with a Linux host.
To send a Set-Config request with value 0, to de-configure the gadget
echo 0 >/sys/bus/usb/devices/.../bConfigurationValue
To send a Set-Config request with value 1, to re-configure the gadget
echo 1 >/sys/bus/usb/devices/.../bConfigurationValue
where the "..." part is replaced with the gadget's device path.
Set-Config has only two stages, Setup and Status stage; there is no Data stage.
Host Device
----- Setup Packet ---> |
----- Data0 Packet ---> |== Setup stage
<---- Ack Packet ------ |
----- In Packet ------> |
<---- Data1 Packet ---- |== Status stage
----- Ack Packet -----> |
The Data1 packet above contains no data, as below.
PID !PID CRC
USB software layering:
Client SW:
It decides what transfers are to be made with the USB device function.
USB Driver (USBD):
The software interface between the USB System SW and the Client SW. USBD provides the device drivers that the operating systems use to access USB devices.
USB System SW:
It is usually supplied with the operating systems. It can be seemed to include USBD and HCD.
Host Controller Driver (HCD):
The software interface between Host Controller and USB System SW. This interface allows a USBD to support different Host Controllers. HCD is an abstraction of the Host Controller hardware.
Host Controller:
It manages USB protocol level interface. It ensures USB bus access rules defined by the protocol are obeyed, such as inter packet timings, timeouts.
USB Host and Device Partitioning |
It is started with setup transaction from Host to Device. The Setup transaction is followed by zero or more Data transactions. A Status Transaction completes the control transfer.
Setup Transaction consists of:
setup packet
data0 packet - the request
Ack packet
Data transaction
In packet
data1 packet - the data that is returned by device
Ack packet
Status transaction
out packet
data1 packet - has no data
Ack packet
USB Device Request:
The USB host uses USB requests to get info from USB devices. These request are made using control transfer, from host to device default control pipe.The standard requests are:
- Get Status
- Clear Feature
- Set Feature
- Set Address
- Get Descriptor
- Set Descriptor
- Get Configuration
- Set Configuration
- Get Interface
- Set Interface
- Synch Frame
An example of USB request sequence in USB Command Verifier test:
80 06 00 01 00 00 12 00 - Get device descriptor
Data(12 01 00 02 00 00 00 40 25 05 A5 A4 33 03 01 02 00 01)
- Return device descriptor
|
80 06 00 02 00 00 09 00 – get config descriptor
Data(09 02 20 00 01 01 04 C0 01) – return config descriptor
|
00 09 01 00 00 00 00 00 – set configuration
0 byte data
|
80 06 00 02 00 00 09 00 – get config descriptor
09 02 20 00 01 01 04 C0 01 – return config desc
|
80 06 00 02 00 00 20 00 – get config desc
0 byte data
|
80 06 00 01 00 00 12 00 – get device desc
Data(12 01 00 02 00 00 00 40 25 05 A5 A4 33 03 01 02 00 01) – return device desc
|
80 06 00 06 00 00 0A 00 – get device qualifier
Data(0A 06 00 02 00 00 00 40 01 00) – return device qualifier
|
80 06 00 02 00 00 09 00 – get config desc
Data(09 02 20 00 01 01 04 C0 01) – return config desc
|
80 08 00 00 00 00 01 00 – get configuration
Data(01) – return
|
USB Descriptor:
USB devices report their attributes using descriptors. A descriptor is a defined data structure. Standard USB descriptors are:
- Device descriptor
- Device Qualifier descriptor
- Configuration descriptor
- Interface descriptor
- Endpoint descriptor
- String descriptor