Control Channel Characteristics
The Control channel for the device is its USB Control endpoint. A control message from the host to the device is sent as a SEND_ENCAPSULATED_COMMAND transfer. This transfer is defined in the following table.
BmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
0x21 |
0x00 |
0x0000 |
bInterfaceNumber field of Communication Class interface descriptor |
Byte length of control message block |
Control message block |
The host does not continuously poll the USB Control endpoint for input control messages. Upon placing a control message on its Control endpoint, the device must return a notification on the Communication Class interface's Interrupt IN endpoint, which is polled by the host whenever the device can return control messages. The transfer from the device's interrupt IN endpoint to the host is a standard USB Interrupt IN transfer. The only defined device notification is the RESPONSE_AVAILABLE notification, defined in the following table.
Offset (bytes) | Length (bytes) | Field | Data |
---|---|---|---|
0 |
4 |
Notification |
RESPONSE_AVAILABLE (0x00000001) |
4 |
4 |
Reserved |
0 |
Upon receiving the RESPONSE_AVAILABLE notification, the host reads the control message from the Control endpoint using a GET_ENCAPSULATED_RESPONSE transfer, defined in the following table.
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
0xA1 |
0x01 |
0x0000 |
bInterfaceNumber field of Communication Class interface descriptor |
0x0400 (this is the minimum byte length of the buffer posted by host) |
Control message block |
If for some reason the device receives a GET_ENCAPSULATED_RESPONSE and is unable to respond with a valid data on the Control endpoint, then it should return a one-byte packet set to 0x00, rather than stalling the Control endpoint.